From patchwork Fri Mar 27 05:27:45 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 1262558 X-Patchwork-Delegate: xypron.glpk@gmx.de Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.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 Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.a=rsa-sha256 header.s=badeba3b8450 header.b=D2Lf/WvM; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 48pVlX5jb7z9sR4 for ; Fri, 27 Mar 2020 16:29:12 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 456F081888; Fri, 27 Mar 2020 06:28:54 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.b="D2Lf/WvM"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 24C56818BA; Fri, 27 Mar 2020 06:28:33 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,FREEMAIL_FROM,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mout.gmx.net (mout.gmx.net [212.227.17.21]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 5491981869 for ; Fri, 27 Mar 2020 06:28:25 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=xypron.glpk@gmx.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1585286890; bh=x9+tqTCxbIxqOKLKVpndAQDkaTmXyTCuw4k624pFhFE=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=D2Lf/WvM9ZCq/RPwn0O0fdamZmfdgMDrAkczUeH+2qLm8dK6tg4UmU9gYOhzPRLWj 3chE0o/nxD34x9Bb9h+FyHpaosXR2xlgki7Oio2JtGgLfpIoG4vNKptOiaRoPpwNj7 gQo6ZHbzwome7qybOQa421qS0u3uBKFkCxJMSH/w= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from LT02.fritz.box ([84.119.33.226]) by mail.gmx.com (mrgmx105 [212.227.17.174]) with ESMTPSA (Nemesis) id 1M1Hdq-1jG2Zk1E3W-002lEr; Fri, 27 Mar 2020 06:28:10 +0100 From: Heinrich Schuchardt To: Alexander Graf , AKASHI Takahiro Cc: Ilias Apalodimas , Sughosh Ganu , Alexey Brodkin , Paul Emge , Faiz Abbas , Eugeniu Rosca , Urja Rannikko , Kever Yang , Simon Glass , Alistair Strachan , Ruslan Trofymenko , Igor Opaniuk , u-boot@lists.denx.de, Heinrich Schuchardt Subject: [PATCH 01/16] cmd: efidebug: fix int to pointer cast Date: Fri, 27 Mar 2020 06:27:45 +0100 Message-Id: <20200327052800.11022-2-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200327052800.11022-1-xypron.glpk@gmx.de> References: <20200327052800.11022-1-xypron.glpk@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:ojxSgGtYBmWdavJ6MuraQ5iOPKUx9eAYdcXKAr9io2dRcBaxGUP dbpa4jJEsOYwaxDist2Xxe2qC+ak3TapLGMDEnNZn4mgUPR6ZghTA3n9khQVMBKr9mrAYar pmmMsiN9YOXZeGPf4MIOqXtjP6UbKYqodDRYoBSvfLfyhE3hd35sqXfnZ2SXrFHoCyx2rWM 5vqMgX0s0V4t9j2e2QhGA== X-UI-Out-Filterresults: notjunk:1; V03:K0:V1d3T8DULsM=:gQwnVNt/wsLefmOWvhnlXF nfVCqCbRizGDJrJTkKxirsIOwvAbwBINxDY1Hva9+PgRRMkB3b2kycpPVN9hk4ozZqSeaFeUo kefRCGesJJTbyXxoOgTRyNx+TNa34SmhzPVcAbnIyYr+nhX6I6pmiHxsPZoP0FUE6IamZNEQC jewK19yBdQ27KWkNHlITOhTmfiyMm4etaObJz7UDU58jDaS380zbY/4l2tTB75gkPYQ9ej347 MbMdNx7uh+7uezYF1xEWof7v4iFMcxT+lRUHebxTobs8qsJ2RXrIWiJ4Zy6J+4JWQeVW1WXNG 7uLv2ISAE1KlED3ZwWD5SrCMN2yYB9IqoViPNR4a3/I4WJva+Rs6DBoV/NC/GP1Cbh+iYTHgK TSloLe1va2cqMsimVANk22TtgI9RAKUw3H9c/PrXiycla5qRXA4LE0psdyScaEGYC0ZIhGvjg E5c8iSAgLulDX9ieCEItIQy8+bDPhACvaGjfDsLXvewi5P4MbcXbWXzr9CRnBFTeN9oF0bGoi 83VTLXkDtRL1xUVXLfbEcsQS19udCF6q9RswWtq1cItYA0F+9n/MysuuZlp/AgCvNH0L5p7Ye GKUOCLyG8GXZFznJrjdinWcaZG1y77GQuPObnkK9auSw9lqKN8N0RBxDQyqtQfOMqYYx1xK1k sX+pG3MTJzUtwHIvV5EpX8U3dzc+JA6jYPMY/UhxmZAeT3s61Nc990Hm+m+P12zJqsrP/WxOY FririTEfZM+AdBuEZJx+L6RNuAw+j7jVnv6xrw2PEUpiSBRi/IYFfBxr+apPxK9f+rbk54e56 8uGVDTgU0Y991cLbqiLtnofB7xll4wSL9Xup8yL7A4GxCxuiCIkb1qPs3LdlODfWfy7CiIfn5 +T5hH85UjQIXwxEKC4coLedpJT8y95uVQbjvD+MFOry1fzEM101TXI5und1SEDoMoWZvnSsbX o1tXto+q4t8rbYDjkKcAPsUULlGt8QazlVAyl+WXTmWYJXI6CSXiAdSRY1AsqCJWZ/SEUyFnI kYQyGpxvtjCnHFno+rhZYbH45A6ICc5fr4Sot4JObuBF7DC7k40yjRoC3VyTRVDM5tiUBDBVw 0tAnzsmJSDdTrMSmmHd2zVnB82p4ovIVaokC5SvxLVZsZQ/yf6dfIH6Om6+lplCndw/GB4+1g YaddNaNuZDbkrPTKSePLbI0/ZOYD9m3lDUS8vAVqkv7z+dLrd7Z3+IshtPNFHYALUITgz6Wuv xRJ/6Ucg29UAJcVPc X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.30rc1 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.2 at phobos.denx.de X-Virus-Status: Clean On 32 bit systems fix warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] Fixes: a415d61eac26 ("cmd: map addresses to sysmem in efidebug memmap") Signed-off-by: Heinrich Schuchardt --- cmd/efidebug.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) -- 2.25.1 diff --git a/cmd/efidebug.c b/cmd/efidebug.c index bb7c13d6a1..c1bb76477a 100644 --- a/cmd/efidebug.c +++ b/cmd/efidebug.c @@ -489,10 +489,12 @@ static int do_efi_show_memmap(cmd_tbl_t *cmdtp, int flag, printf("%-16s %.*llx-%.*llx", type, EFI_PHYS_ADDR_WIDTH, - (u64)map_to_sysmem((void *)map->physical_start), + (u64)map_to_sysmem((void *)(uintptr_t) + map->physical_start), EFI_PHYS_ADDR_WIDTH, - (u64)map_to_sysmem((void *)map->physical_start + - map->num_pages * EFI_PAGE_SIZE)); + (u64)map_to_sysmem((void *)(uintptr_t) + (map->physical_start + + map->num_pages * EFI_PAGE_SIZE))); print_memory_attributes(map->attribute); putc('\n'); From patchwork Fri Mar 27 05:27:46 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 1262567 X-Patchwork-Delegate: xypron.glpk@gmx.de Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.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 Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.a=rsa-sha256 header.s=badeba3b8450 header.b=h6Mx2jll; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 48pVnc3YV3z9sR4 for ; Fri, 27 Mar 2020 16:31:00 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 29484818F2; Fri, 27 Mar 2020 06:29:33 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.b="h6Mx2jll"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id EA95081888; Fri, 27 Mar 2020 06:28:48 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,FREEMAIL_FROM,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mout.gmx.net (mout.gmx.net [212.227.17.21]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 000248185A for ; Fri, 27 Mar 2020 06:28:34 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=xypron.glpk@gmx.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1585286891; bh=WkVROJ5I8ILg7/vq4uMcQcZMXgitveA3xXz6+N7soVE=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=h6Mx2jll71P/MewZxXArVy/+su6LSy+7XBzLGP/HcZmRDhXx78d0eYVMcHNxuoGdU zWCvXzPXg01Kgun7k6sMRZFHnooQ5KgPYxiJU/PquiDoCD1I3gbpWRIb3lK+5LXsqh 7LfbwHu4xL45Ihl308/tYtuZj+qVc6eew9Kkfttk= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from LT02.fritz.box ([84.119.33.226]) by mail.gmx.com (mrgmx105 [212.227.17.174]) with ESMTPSA (Nemesis) id 1MQMuX-1ivVxS22kr-00MMIQ; Fri, 27 Mar 2020 06:28:11 +0100 From: Heinrich Schuchardt To: Alexander Graf , AKASHI Takahiro Cc: Ilias Apalodimas , Sughosh Ganu , Alexey Brodkin , Paul Emge , Faiz Abbas , Eugeniu Rosca , Urja Rannikko , Kever Yang , Simon Glass , Alistair Strachan , Ruslan Trofymenko , Igor Opaniuk , u-boot@lists.denx.de, Heinrich Schuchardt , Patrick DELAUNAY , Atish Patra Subject: [PATCH 02/16] efi_loader: only reserve memory if fdt node enabled Date: Fri, 27 Mar 2020 06:27:46 +0100 Message-Id: <20200327052800.11022-3-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200327052800.11022-1-xypron.glpk@gmx.de> References: <20200327052800.11022-1-xypron.glpk@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:XSyKqKrS86/rb40AoAYhSo5PtC1KTd29kU93mW7oZOsBlOk69ga BjWwxqeJyh0DjoJykAD6xaUMP/HCB8hiM5+VayfpkRyL3oNwdv+qHmDwwoORmdVWjx4lugz aMjVePtLJFoTtg6OJ/mxaHAUrIfBEukZoyDkgp+1v83EdIm729OBCKhixzQTOLxDtX1vP1T nBM32/jj0DX6vsMmRxedQ== X-UI-Out-Filterresults: notjunk:1; V03:K0:HBqTAFsNs7s=:aVr473i7AZ5ZcDxU9R8Os4 sJ+ZkUWKH6fCHHgRSOQD7hIu1WQd9pLGo9wesv72xlTY33bNNVM39ueoscq/4njVNxg6VU6G5 XytggjsClH+W0aKDXBlnzcjAt5cxOs9YTSp6nFAchziWfTUOkPNmjVQiNVFr7MG3u3bQftXwC bfDzxTib1PSKRALRAvLeyfC3y0OBdsZ5pOWPOBRZfD0wjdY3r4bviYKW80iKH+4pP+r7yKQUY Ik8qVDU97VBFEccwSs0zLPrFe9oI5Bx6g0zQI06m2YL6B1bj/41yNoWaf7deYbc2R1uh10/2f tiI2bCdVjyiEPTWA5Aeq6qNER7FqcCmWh8L1hHaOOBgfuu+/fHt9UDzq6XGImN9nMocCeYRVM S5vKnQVXB92LCpyDzdlGTRh88Fd/OOAWejy+PF8PqiMj+mIli3gWXcs+s5qlJSlIfoIVe8Bjc Ea08Tg+MxL8ZNsyksJprv59ERpBSy8kb4Ltpy3smWQLoO3y8R9aDfg28FcX035Sqz7Nczb2+z S5rXbns2aDzvPDoMzfWXt6/UWmmsaH1vIDqpvVHCGDo3fxZG4HeyPNyJyUJMf3RbN107Ua+yk clrZ9tZ/GCh3QnVWgUmiScP8ess4Nt0KvejcbTYpGu8JEWQIhx8TOOKUxc9npdMIFzMdhssmf hy/B1MaMY0Oc7RczuF7wi0FaNMnKQTyRXv0wLQ5Ob+EebKreS1FqeuPa2cvQ/VXpMNK0N0UlA Z81/DmDajVSupeETZnb9AE/q8t0hTexyhhi0xiFqmKRYXM3HTAx8BDZfysDZ70ucm7cmL1wr1 SWM7tGHLGZe1QPaMRt0NmSUxttsUeB1FUdp2w+1TfIspVdJMkISk7eLJpwt9N/JUNdFCBVrVq FNjsulJMgcdX421h7Z+9CCFmDLsiBoi6iHcgGFIRJq8vCi2tAC0xqGWkpDE7ZUdVOBzVgmQun t4bLPkmnTsY2gH8X2+ABtKJJMFsDc+bnJg2VSkrvfHqNB2UR5jRNTvEggLCcCTFCIaosdLQC2 L+jXITvAyR8i4SDzgmyDCXzfb9ud8QyeZDg5T6TEhyIUhwTZkZdyhp1dct3jMMV/Uy1cEo588 hi5EbYuhKWSTrIB+6BKYOavXimS2ilMTgowDbqAXIw7dKCRHqZTnxnbeTW4MB2tyv2MKKshU9 Y8kE5JLyv4LO/Jp4P+lDtR5z8gCMrDqzEfgoP0cye4aBfCVAkXm6EaE3gUh1zFhWNYHOl9vt3 QcrpmSxjKnLJKzqnz X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.30rc1 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.2 at phobos.denx.de X-Virus-Status: Clean Sub-nodes of /reserved-memory may be disabled. In this case we should not reserve memory in the memory map. Reported-by: Patrick DELAUNAY Fixes: fef907b2e440 ("efi_loader: create reservations after ft_board_setup") Signed-off-by: Heinrich Schuchardt Reviewed-by: Atish Patra --- cmd/bootefi.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) -- 2.25.1 diff --git a/cmd/bootefi.c b/cmd/bootefi.c index 3bbe2d6a1a..aaed575505 100644 --- a/cmd/bootefi.c +++ b/cmd/bootefi.c @@ -199,7 +199,8 @@ static void efi_carve_out_dt_rsv(void *fdt) * The /reserved-memory node may have children with * a size instead of a reg property. */ - if (addr != FDT_ADDR_T_NONE) + if (addr != FDT_ADDR_T_NONE && + fdtdec_get_is_enabled(fdt, subnode)) efi_reserve_memory(addr, size); subnode = fdt_next_subnode(fdt, subnode); } From patchwork Fri Mar 27 05:27:47 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 1262568 X-Patchwork-Delegate: xypron.glpk@gmx.de Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=85.214.62.61; helo=phobos.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 Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.a=rsa-sha256 header.s=badeba3b8450 header.b=k4xc/ZRs; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 48pVnr4p1xz9sR4 for ; Fri, 27 Mar 2020 16:31:12 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 330FA818FD; Fri, 27 Mar 2020 06:29:36 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.b="k4xc/ZRs"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 739B1818AF; Fri, 27 Mar 2020 06:28:48 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, FREEMAIL_FROM, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mout.gmx.net (mout.gmx.net [212.227.17.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 46677818A0 for ; Fri, 27 Mar 2020 06:28:26 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=xypron.glpk@gmx.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1585286892; bh=EeOqwmz03m94FFBHzk9ddX9A4wXT5LgYC8O2UZgcknk=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=k4xc/ZRscsBLcTLbC7536nZKupQRDd8hu/OOHgAYmFLMwC0HN+si0X4FaCyoNUO12 b/z1qp1R0d5CwhZqJtRFR/jlulB88Q/t7MPrqwXL26chYm3PN+rbIgfD5czZWvwabh eSXZt0jRx2LIkU8ZJLC5mknechbTS6cH3C/fjDHc= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from LT02.fritz.box ([84.119.33.226]) by mail.gmx.com (mrgmx105 [212.227.17.174]) with ESMTPSA (Nemesis) id 1MtfJX-1jWBwx0KhL-00v8sK; Fri, 27 Mar 2020 06:28:12 +0100 From: Heinrich Schuchardt To: Alexander Graf , AKASHI Takahiro Cc: Ilias Apalodimas , Sughosh Ganu , Alexey Brodkin , Paul Emge , Faiz Abbas , Eugeniu Rosca , Urja Rannikko , Kever Yang , Simon Glass , Alistair Strachan , Ruslan Trofymenko , Igor Opaniuk , u-boot@lists.denx.de, Heinrich Schuchardt Subject: [PATCH 03/16] efi_loader: eliminate EFI_CALL() for variable access Date: Fri, 27 Mar 2020 06:27:47 +0100 Message-Id: <20200327052800.11022-4-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200327052800.11022-1-xypron.glpk@gmx.de> References: <20200327052800.11022-1-xypron.glpk@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:7628qVyZV7GxZ0CfsSvqksmHXCHIWxTAKG1PB2lqarwWW0WF5uv P39HVeNiZ6qfHKoaWcUpkbcdUvcZWPUsj7sTwTczVbvWB8sIZMJg0MmUOscE9vq8mnvyVOM unkGbrHKNzsJUaXnt92pKCh8reOVlhFa0KK96HeH6YGhVQ483tDkMhoqY7Oj2Ncdk1UpqxP M8Cib/YjjQR9oRKK6CZsA== X-UI-Out-Filterresults: notjunk:1; V03:K0:X7PZUMo6XJA=:C2t3qk4gSfhlWwUaVjK4Fj bmTX6Z5qaMJ9MLWaEtZyEf35saryvRzcRoGHMD6gmF8Ir0j2srahNupoLvu6xoV3xipoxriFL r+PfIUYP5KzJjpUva+FDGDJUg1PVMiFlA6axEakaYAaUcaBytbHWoWUd++hDrzT6AIr5wwhns /SHh1pfCdvPZ71x7CfzQ31XJwvRlCEnHzelQ2RCDSjJ3emacoE5LXXjyyExNMyATRi+As80Lq 2kV+uDa9In0yBdDciDKiRh/eeFOBFxUmfrk6oQzweDk3mP6RiczChMM/VSarOZA4f1BJBfPnM 4/KHcpTiHEMyOdBNpAZ+Z1fTahuolfocaVwyzixe7nTHH7Qeq5ayDxDXzSdvQfPcJl6V42TgC 3CBF3AOJn7vpgdm4ED4z1hMABbBKiQm0CI44fP72IHKYZFXja/pItCKjoMIWg44f2b0fHnBbO rEQE24YUtfX2rthUEwSKYjhBUD6MtAufWEITzQF8uXIrZem5k74V38aHeuB3gJjwGVQYAfvPw 4SLPCSTzCfko9qR41A2V84wvlVTNWzTNolNMzEU7fsWLzXsqOvfOqhPGi/g9iKYYDhTcM7yXD 5MozyOP8uxRLG6BktXUEmHQFkySfr9XYTOLzNW9ohVJPBZoJna5PpNx/iiSJDw7X+UTT8sNLl tzatRPWX763T2gybnReLCrfLMzsEzYmb4fspCjost59hmdn3Xg5CXLL2SKMmH52yN4uXHAXxL m3NSSuOIbdf8RKvHpa0lNmzdVNmqCPT93nms4WD9NvZSjqg/5US2Qm4QtINFp9H00FQHM6j93 Gbjkc1uR+Ez7zLyYXabd0nhlJh5j3bh1b7Mj1n+zbBwxXXu7NtaJjpha2mMINt21CaCzP+fUl R9kctbpmTY3i6kI0joHducZZlgJGdLq/edkgmnORRRqFHOw7WRV85kGhRCQgcjKfL5H+XlGOk LMMibP2I4waGtsIkWqLM8PtcrDjdtKk7WXUqPH8gH/1mvywj/jTXieRBrFvSFrITxwMXFbIhv ozZW1jfRYUqiULwjv7n4YyTCy7MVeslY3r8wenp5/xcjTrAsG+VTQC9ecZ3Kxppv7cHKr6Z9E RUrwd3EEHVX/pOhC0ANqvzg6aOZaWNDvJfkH3zOHRETtAI99p1oflZy5cqwH94kNKRTQ7UVZn bH7Ysuh/72TTrU10ZcTXFWXbLJ8Q22symUXnZntj1Mnm8T7pSK7UL2zULwwh5NlrVYW2bb8Rc 4p9B0/gWsYhJt7KcH X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.30rc1 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.2 at phobos.denx.de X-Virus-Status: Clean In several places of the UEFI sub-system UEFI variables as accessed via runtime services functions. These functions require being called via EFI_CALL() to restore the register holding the gd variable. Some code even calls the functions via the runtime services table. By making the functions exposing the variable runtime services wrappers for exported functions that we can use internally we get rid of this clumsy code. Signed-off-by: Heinrich Schuchardt --- cmd/efidebug.c | 63 +++++++++---------- cmd/nvedit_efi.c | 18 +++--- include/efi_loader.h | 9 +++ lib/efi_loader/efi_bootmgr.c | 20 +++--- lib/efi_loader/efi_setup.c | 42 ++++++------- lib/efi_loader/efi_variable.c | 114 +++++++++++++++++++++++++++------- 6 files changed, 168 insertions(+), 98 deletions(-) -- 2.25.1 diff --git a/cmd/efidebug.c b/cmd/efidebug.c index c1bb76477a..f89c1d2db7 100644 --- a/cmd/efidebug.c +++ b/cmd/efidebug.c @@ -17,7 +17,6 @@ #include #define BS systab.boottime -#define RT systab.runtime /** * efi_get_device_handle_info() - get information of UEFI device @@ -614,11 +613,11 @@ static int do_efi_boot_add(cmd_tbl_t *cmdtp, int flag, goto out; } - ret = EFI_CALL(RT->set_variable(var_name16, &guid, - EFI_VARIABLE_NON_VOLATILE | - EFI_VARIABLE_BOOTSERVICE_ACCESS | - EFI_VARIABLE_RUNTIME_ACCESS, - size, data)); + ret = efi_set_variable_int(var_name16, &guid, + EFI_VARIABLE_NON_VOLATILE | + EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_RUNTIME_ACCESS, + size, data); if (ret != EFI_SUCCESS) { printf("Cannot set %ls\n", var_name16); r = CMD_RET_FAILURE; @@ -669,7 +668,8 @@ static int do_efi_boot_rm(cmd_tbl_t *cmdtp, int flag, p = var_name16; utf8_utf16_strncpy(&p, var_name, 9); - ret = EFI_CALL(RT->set_variable(var_name16, &guid, 0, 0, NULL)); + ret = efi_set_variable_int(var_name16, &guid, 0, 0, + NULL); if (ret) { printf("Cannot remove %ls\n", var_name16); return CMD_RET_FAILURE; @@ -749,11 +749,11 @@ static void show_efi_boot_opt(int id) guid = efi_global_variable_guid; size = 0; - ret = EFI_CALL(RT->get_variable(var_name16, &guid, NULL, &size, NULL)); + ret = efi_get_variable_int(var_name16, &guid, NULL, &size, NULL); if (ret == EFI_BUFFER_TOO_SMALL) { data = malloc(size); - ret = EFI_CALL(RT->get_variable(var_name16, &guid, NULL, &size, - data)); + ret = efi_get_variable_int(var_name16, &guid, NULL, &size, + data); } if (ret == EFI_SUCCESS) show_efi_boot_opt_data(id, data, size); @@ -808,8 +808,7 @@ static int do_efi_boot_dump(cmd_tbl_t *cmdtp, int flag, var_name16[0] = 0; for (;;) { size = buf_size; - ret = EFI_CALL(efi_get_next_variable_name(&size, var_name16, - &guid)); + ret = efi_get_next_variable_name_int(&size, var_name16, &guid); if (ret == EFI_NOT_FOUND) break; if (ret == EFI_BUFFER_TOO_SMALL) { @@ -820,9 +819,8 @@ static int do_efi_boot_dump(cmd_tbl_t *cmdtp, int flag, return CMD_RET_FAILURE; } var_name16 = p; - ret = EFI_CALL(efi_get_next_variable_name(&size, - var_name16, - &guid)); + ret = efi_get_next_variable_name_int(&size, var_name16, + &guid); } if (ret != EFI_SUCCESS) { free(var_name16); @@ -870,12 +868,11 @@ static int show_efi_boot_order(void) guid = efi_global_variable_guid; size = 0; - ret = EFI_CALL(RT->get_variable(L"BootOrder", &guid, NULL, &size, - NULL)); + ret = efi_get_variable_int(L"BootOrder", &guid, NULL, &size, NULL); if (ret == EFI_BUFFER_TOO_SMALL) { bootorder = malloc(size); - ret = EFI_CALL(RT->get_variable(L"BootOrder", &guid, NULL, - &size, bootorder)); + ret = efi_get_variable_int(L"BootOrder", &guid, NULL, + &size, bootorder); } if (ret == EFI_NOT_FOUND) { printf("BootOrder not defined\n"); @@ -893,8 +890,8 @@ static int show_efi_boot_order(void) utf8_utf16_strncpy(&p16, var_name, 9); size = 0; - ret = EFI_CALL(RT->get_variable(var_name16, &guid, NULL, &size, - NULL)); + ret = efi_get_variable_int(var_name16, &guid, NULL, &size, + NULL); if (ret != EFI_BUFFER_TOO_SMALL) { printf("%2d: Boot%04X: (not defined)\n", i + 1, bootorder[i]); @@ -906,8 +903,8 @@ static int show_efi_boot_order(void) ret = CMD_RET_FAILURE; goto out; } - ret = EFI_CALL(RT->get_variable(var_name16, &guid, NULL, &size, - data)); + ret = efi_get_variable_int(var_name16, &guid, NULL, &size, + data); if (ret != EFI_SUCCESS) { free(data); ret = CMD_RET_FAILURE; @@ -974,11 +971,11 @@ static int do_efi_boot_next(cmd_tbl_t *cmdtp, int flag, guid = efi_global_variable_guid; size = sizeof(u16); - ret = EFI_CALL(RT->set_variable(L"BootNext", &guid, - EFI_VARIABLE_NON_VOLATILE | - EFI_VARIABLE_BOOTSERVICE_ACCESS | - EFI_VARIABLE_RUNTIME_ACCESS, - size, &bootnext)); + ret = efi_set_variable_int(L"BootNext", &guid, + EFI_VARIABLE_NON_VOLATILE | + EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_RUNTIME_ACCESS, + size, &bootnext); if (ret != EFI_SUCCESS) { printf("Cannot set BootNext\n"); r = CMD_RET_FAILURE; @@ -1035,11 +1032,11 @@ static int do_efi_boot_order(cmd_tbl_t *cmdtp, int flag, } guid = efi_global_variable_guid; - ret = EFI_CALL(RT->set_variable(L"BootOrder", &guid, - EFI_VARIABLE_NON_VOLATILE | - EFI_VARIABLE_BOOTSERVICE_ACCESS | - EFI_VARIABLE_RUNTIME_ACCESS, - size, bootorder)); + ret = efi_set_variable_int(L"BootOrder", &guid, + EFI_VARIABLE_NON_VOLATILE | + EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_RUNTIME_ACCESS, + size, bootorder); if (ret != EFI_SUCCESS) { printf("Cannot set BootOrder\n"); r = CMD_RET_FAILURE; diff --git a/cmd/nvedit_efi.c b/cmd/nvedit_efi.c index 8ea0da0128..9d338478d3 100644 --- a/cmd/nvedit_efi.c +++ b/cmd/nvedit_efi.c @@ -87,14 +87,14 @@ static void efi_dump_single_var(u16 *name, const efi_guid_t *guid, bool verbose) data = NULL; size = 0; - ret = EFI_CALL(efi_get_variable(name, guid, &attributes, &size, data)); + ret = efi_get_variable_int(name, guid, &attributes, &size, data); if (ret == EFI_BUFFER_TOO_SMALL) { data = malloc(size); if (!data) goto out; - ret = EFI_CALL(efi_get_variable(name, guid, &attributes, &size, - data)); + ret = efi_get_variable_int(name, guid, &attributes, &size, + data); } if (ret == EFI_NOT_FOUND) { printf("Error: \"%ls\" not defined\n", name); @@ -224,8 +224,7 @@ static int efi_dump_var_all(int argc, char * const argv[], var_name16[0] = 0; for (;;) { size = buf_size; - ret = EFI_CALL(efi_get_next_variable_name(&size, var_name16, - &guid)); + ret = efi_get_next_variable_name_int(&size, var_name16, &guid); if (ret == EFI_NOT_FOUND) break; if (ret == EFI_BUFFER_TOO_SMALL) { @@ -236,9 +235,8 @@ static int efi_dump_var_all(int argc, char * const argv[], return CMD_RET_FAILURE; } var_name16 = p; - ret = EFI_CALL(efi_get_next_variable_name(&size, - var_name16, - &guid)); + ret = efi_get_next_variable_name_int(&size, var_name16, + &guid); } if (ret != EFI_SUCCESS) { free(var_name16); @@ -576,8 +574,8 @@ int do_env_set_efi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) p = var_name16; utf8_utf16_strncpy(&p, var_name, len + 1); - ret = EFI_CALL(efi_set_variable(var_name16, &guid, attributes, - size, value)); + ret = efi_set_variable_int(var_name16, &guid, attributes, size, + value); unmap_sysmem(value); if (ret == EFI_SUCCESS) { ret = CMD_RET_SUCCESS; diff --git a/include/efi_loader.h b/include/efi_loader.h index 3f2792892f..b1d2feab61 100644 --- a/include/efi_loader.h +++ b/include/efi_loader.h @@ -643,12 +643,21 @@ efi_status_t EFIAPI efi_selftest(efi_handle_t image_handle, efi_status_t EFIAPI efi_get_variable(u16 *variable_name, const efi_guid_t *vendor, u32 *attributes, efi_uintn_t *data_size, void *data); +efi_status_t efi_get_variable_int(u16 *variable_name, const efi_guid_t *vendor, + u32 *attributes, + efi_uintn_t *data_size, void *data); efi_status_t EFIAPI efi_get_next_variable_name(efi_uintn_t *variable_name_size, u16 *variable_name, efi_guid_t *vendor); +efi_status_t efi_get_next_variable_name_int(efi_uintn_t *variable_name_size, + u16 *variable_name, + efi_guid_t *vendor); efi_status_t EFIAPI efi_set_variable(u16 *variable_name, const efi_guid_t *vendor, u32 attributes, efi_uintn_t data_size, const void *data); +efi_status_t efi_set_variable_int(u16 *variable_name, + const efi_guid_t *vendor, u32 attributes, + efi_uintn_t data_size, const void *data); efi_status_t EFIAPI efi_query_variable_info( u32 attributes, u64 *maximum_variable_storage_size, diff --git a/lib/efi_loader/efi_bootmgr.c b/lib/efi_loader/efi_bootmgr.c index 2ea21448f0..c87f38e46c 100644 --- a/lib/efi_loader/efi_bootmgr.c +++ b/lib/efi_loader/efi_bootmgr.c @@ -12,7 +12,6 @@ #include static const struct efi_boot_services *bs; -static const struct efi_runtime_services *rs; /* * bootmgr implements the logic of trying to find a payload to boot @@ -123,10 +122,10 @@ static void *get_var(u16 *name, const efi_guid_t *vendor, void *buf = NULL; *size = 0; - EFI_CALL(ret = rs->get_variable(name, v, NULL, size, buf)); + ret = efi_get_variable_int(name, v, NULL, size, buf); if (ret == EFI_BUFFER_TOO_SMALL) { buf = malloc(*size); - EFI_CALL(ret = rs->get_variable(name, v, NULL, size, buf)); + ret = efi_get_variable_int(name, v, NULL, size, buf); } if (ret != EFI_SUCCESS) { @@ -186,10 +185,10 @@ static efi_status_t try_load_entry(u16 n, efi_handle_t *handle) attributes = EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS; size = sizeof(n); - ret = EFI_CALL(efi_set_variable( + ret = efi_set_variable_int( L"BootCurrent", (efi_guid_t *)&efi_global_variable_guid, - attributes, size, &n)); + attributes, size, &n); if (ret != EFI_SUCCESS) { if (EFI_CALL(efi_unload_image(*handle)) != EFI_SUCCESS) @@ -226,25 +225,24 @@ efi_status_t efi_bootmgr_load(efi_handle_t *handle) efi_status_t ret; bs = systab.boottime; - rs = systab.runtime; /* BootNext */ bootnext = 0; size = sizeof(bootnext); - ret = EFI_CALL(efi_get_variable(L"BootNext", - (efi_guid_t *)&efi_global_variable_guid, - NULL, &size, &bootnext)); + ret = efi_get_variable_int(L"BootNext", + (efi_guid_t *)&efi_global_variable_guid, + NULL, &size, &bootnext); if (ret == EFI_SUCCESS || ret == EFI_BUFFER_TOO_SMALL) { /* BootNext does exist here */ if (ret == EFI_BUFFER_TOO_SMALL || size != sizeof(u16)) printf("BootNext must be 16-bit integer\n"); /* delete BootNext */ - ret = EFI_CALL(efi_set_variable( + ret = efi_set_variable_int( L"BootNext", (efi_guid_t *)&efi_global_variable_guid, EFI_VARIABLE_NON_VOLATILE, 0, - &bootnext)); + &bootnext); /* load BootNext */ if (ret == EFI_SUCCESS) { diff --git a/lib/efi_loader/efi_setup.c b/lib/efi_loader/efi_setup.c index b458093dfb..d1884e4dae 100644 --- a/lib/efi_loader/efi_setup.c +++ b/lib/efi_loader/efi_setup.c @@ -40,12 +40,12 @@ static efi_status_t efi_init_platform_lang(void) * Variable PlatformLangCodes defines the language codes that the * machine can support. */ - ret = EFI_CALL(efi_set_variable(L"PlatformLangCodes", - &efi_global_variable_guid, - EFI_VARIABLE_BOOTSERVICE_ACCESS | - EFI_VARIABLE_RUNTIME_ACCESS, - sizeof(CONFIG_EFI_PLATFORM_LANG_CODES), - CONFIG_EFI_PLATFORM_LANG_CODES)); + ret = efi_set_variable_int(L"PlatformLangCodes", + &efi_global_variable_guid, + EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_RUNTIME_ACCESS, + sizeof(CONFIG_EFI_PLATFORM_LANG_CODES), + CONFIG_EFI_PLATFORM_LANG_CODES); if (ret != EFI_SUCCESS) goto out; @@ -53,9 +53,9 @@ static efi_status_t efi_init_platform_lang(void) * Variable PlatformLang defines the language that the machine has been * configured for. */ - ret = EFI_CALL(efi_get_variable(L"PlatformLang", - &efi_global_variable_guid, - NULL, &data_size, &pos)); + ret = efi_get_variable_int(L"PlatformLang", + &efi_global_variable_guid, + NULL, &data_size, &pos); if (ret == EFI_BUFFER_TOO_SMALL) { /* The variable is already set. Do not change it. */ ret = EFI_SUCCESS; @@ -70,12 +70,12 @@ static efi_status_t efi_init_platform_lang(void) if (pos) *pos = 0; - ret = EFI_CALL(efi_set_variable(L"PlatformLang", - &efi_global_variable_guid, - EFI_VARIABLE_NON_VOLATILE | - EFI_VARIABLE_BOOTSERVICE_ACCESS | - EFI_VARIABLE_RUNTIME_ACCESS, - 1 + strlen(lang), lang)); + ret = efi_set_variable_int(L"PlatformLang", + &efi_global_variable_guid, + EFI_VARIABLE_NON_VOLATILE | + EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_RUNTIME_ACCESS, + 1 + strlen(lang), lang); out: if (ret != EFI_SUCCESS) printf("EFI: cannot initialize platform language settings\n"); @@ -113,12 +113,12 @@ efi_status_t efi_init_obj_list(void) goto out; /* Indicate supported features */ - ret = EFI_CALL(efi_set_variable(L"OsIndicationsSupported", - &efi_global_variable_guid, - EFI_VARIABLE_BOOTSERVICE_ACCESS | - EFI_VARIABLE_RUNTIME_ACCESS, - sizeof(os_indications_supported), - &os_indications_supported)); + ret = efi_set_variable_int(L"OsIndicationsSupported", + &efi_global_variable_guid, + EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_RUNTIME_ACCESS, + sizeof(os_indications_supported), + &os_indications_supported); if (ret != EFI_SUCCESS) goto out; diff --git a/lib/efi_loader/efi_variable.c b/lib/efi_loader/efi_variable.c index fe2f264591..4fae1fa4c7 100644 --- a/lib/efi_loader/efi_variable.c +++ b/lib/efi_loader/efi_variable.c @@ -165,6 +165,30 @@ static const char *parse_attr(const char *str, u32 *attrp) efi_status_t EFIAPI efi_get_variable(u16 *variable_name, const efi_guid_t *vendor, u32 *attributes, efi_uintn_t *data_size, void *data) +{ + EFI_ENTRY("\"%ls\" %pUl %p %p %p", variable_name, vendor, attributes, + data_size, data); + + return EFI_EXIT(efi_get_variable_int(variable_name, vendor, attributes, + data_size, data)); +} + +/** + * efi_get_variable_int() - retrieve value of a UEFI variable + * + * This function allows to retrieve the value of a UEFI variable without using + * EFI_CALL(). + * + * @variable_name: name of the variable + * @vendor: vendor GUID + * @attributes: attributes of the variable + * @data_size: size of the buffer to which the variable value is copied + * @data: buffer to which the variable value is copied + * Return: status code + */ +efi_status_t efi_get_variable_int(u16 *variable_name, + const efi_guid_t *vendor, u32 *attributes, + efi_uintn_t *data_size, void *data) { char *native_name; efi_status_t ret; @@ -172,22 +196,20 @@ efi_status_t EFIAPI efi_get_variable(u16 *variable_name, const char *val, *s; u32 attr; - EFI_ENTRY("\"%ls\" %pUl %p %p %p", variable_name, vendor, attributes, - data_size, data); if (!variable_name || !vendor || !data_size) - return EFI_EXIT(EFI_INVALID_PARAMETER); + return EFI_INVALID_PARAMETER; ret = efi_to_native(&native_name, variable_name, vendor); if (ret) - return EFI_EXIT(ret); + return ret; EFI_PRINT("get '%s'\n", native_name); val = env_get(native_name); free(native_name); if (!val) - return EFI_EXIT(EFI_NOT_FOUND); + return EFI_NOT_FOUND; val = parse_attr(val, &attr); @@ -198,7 +220,7 @@ efi_status_t EFIAPI efi_get_variable(u16 *variable_name, /* number of hexadecimal digits must be even */ if (len & 1) - return EFI_EXIT(EFI_DEVICE_ERROR); + return EFI_DEVICE_ERROR; /* two characters per byte: */ len /= 2; @@ -210,10 +232,10 @@ efi_status_t EFIAPI efi_get_variable(u16 *variable_name, } if (!data) - return EFI_EXIT(EFI_INVALID_PARAMETER); + return EFI_INVALID_PARAMETER; if (hex2bin(data, s, len)) - return EFI_EXIT(EFI_DEVICE_ERROR); + return EFI_DEVICE_ERROR; EFI_PRINT("got value: \"%s\"\n", s); } else if ((s = prefix(val, "(utf8)"))) { @@ -227,7 +249,7 @@ efi_status_t EFIAPI efi_get_variable(u16 *variable_name, } if (!data) - return EFI_EXIT(EFI_INVALID_PARAMETER); + return EFI_INVALID_PARAMETER; memcpy(data, s, len); ((char *)data)[len] = '\0'; @@ -235,14 +257,14 @@ efi_status_t EFIAPI efi_get_variable(u16 *variable_name, EFI_PRINT("got value: \"%s\"\n", (char *)data); } else { EFI_PRINT("invalid value: '%s'\n", val); - return EFI_EXIT(EFI_DEVICE_ERROR); + return EFI_DEVICE_ERROR; } out: if (attributes) *attributes = attr & EFI_VARIABLE_MASK; - return EFI_EXIT(ret); + return ret; } static char *efi_variables_list; @@ -331,6 +353,33 @@ static efi_status_t parse_uboot_variable(char *variable, efi_status_t EFIAPI efi_get_next_variable_name(efi_uintn_t *variable_name_size, u16 *variable_name, efi_guid_t *vendor) +{ + EFI_ENTRY("%p \"%ls\" %pUl", variable_name_size, variable_name, vendor); + + return EFI_EXIT(efi_get_next_variable_name_int(variable_name_size, + variable_name, vendor)); +} + +/** + * efi_get_next_variable_name_int() - enumerate the current variable names + * + * This function can be used to enumerate UEFI variable without using + * EFI_CALL(). + * + * @variable_name_size: size of variable_name buffer in byte + * @variable_name: name of uefi variable's name in u16 + * @vendor: vendor's guid + * + * This function implements the GetNextVariableName service. + * + * See the Unified Extensible Firmware Interface (UEFI) specification for + * details. + * + * Return: status code + */ +efi_status_t efi_get_next_variable_name_int(efi_uintn_t *variable_name_size, + u16 *variable_name, + efi_guid_t *vendor) { char *native_name, *variable; ssize_t name_len, list_len; @@ -340,10 +389,8 @@ efi_status_t EFIAPI efi_get_next_variable_name(efi_uintn_t *variable_name_size, int i; efi_status_t ret; - EFI_ENTRY("%p \"%ls\" %pUl", variable_name_size, variable_name, vendor); - if (!variable_name_size || !variable_name || !vendor) - return EFI_EXIT(EFI_INVALID_PARAMETER); + return EFI_INVALID_PARAMETER; if (variable_name[0]) { /* check null-terminated string */ @@ -351,12 +398,12 @@ efi_status_t EFIAPI efi_get_next_variable_name(efi_uintn_t *variable_name_size, if (!variable_name[i]) break; if (i >= *variable_name_size) - return EFI_EXIT(EFI_INVALID_PARAMETER); + return EFI_INVALID_PARAMETER; /* search for the last-returned variable */ ret = efi_to_native(&native_name, variable_name, vendor); if (ret) - return EFI_EXIT(ret); + return ret; name_len = strlen(native_name); for (variable = efi_variables_list; variable && *variable;) { @@ -371,14 +418,14 @@ efi_status_t EFIAPI efi_get_next_variable_name(efi_uintn_t *variable_name_size, free(native_name); if (!(variable && *variable)) - return EFI_EXIT(EFI_INVALID_PARAMETER); + return EFI_INVALID_PARAMETER; /* next variable */ variable = strchr(variable, '\n'); if (variable) variable++; if (!(variable && *variable)) - return EFI_EXIT(EFI_NOT_FOUND); + return EFI_NOT_FOUND; } else { /* *new search: free a list used in the previous search @@ -393,7 +440,7 @@ efi_status_t EFIAPI efi_get_next_variable_name(efi_uintn_t *variable_name_size, &efi_variables_list, 0, 1, regexlist); /* 1 indicates that no match was found */ if (list_len <= 1) - return EFI_EXIT(EFI_NOT_FOUND); + return EFI_NOT_FOUND; variable = efi_variables_list; } @@ -401,7 +448,7 @@ efi_status_t EFIAPI efi_get_next_variable_name(efi_uintn_t *variable_name_size, ret = parse_uboot_variable(variable, variable_name_size, variable_name, vendor, &attributes); - return EFI_EXIT(ret); + return ret; } /** @@ -422,6 +469,29 @@ efi_status_t EFIAPI efi_get_next_variable_name(efi_uintn_t *variable_name_size, efi_status_t EFIAPI efi_set_variable(u16 *variable_name, const efi_guid_t *vendor, u32 attributes, efi_uintn_t data_size, const void *data) +{ + EFI_ENTRY("\"%ls\" %pUl %x %zu %p", variable_name, vendor, attributes, + data_size, data); + + return EFI_EXIT(efi_set_variable_int(variable_name, vendor, attributes, + data_size, data)); +} + +/** + * efi_set_variable_int() - set value of a UEFI variable internal + * + * This function can be used to set a UEFI variable without using EFI_CALL(). + * + * @variable_name: name of the variable + * @vendor: vendor GUID + * @attributes: attributes of the variable + * @data_size: size of the buffer with the variable value + * @data: buffer with the variable value + * Return: status code + */ +efi_status_t efi_set_variable_int(u16 *variable_name, + const efi_guid_t *vendor, u32 attributes, + efi_uintn_t data_size, const void *data) { char *native_name = NULL, *val = NULL, *s; const char *old_val; @@ -429,8 +499,6 @@ efi_status_t EFIAPI efi_set_variable(u16 *variable_name, efi_status_t ret = EFI_SUCCESS; u32 attr; - EFI_ENTRY("\"%ls\" %pUl %x %zu %p", variable_name, vendor, attributes, - data_size, data); if (!variable_name || !*variable_name || !vendor || ((attributes & EFI_VARIABLE_RUNTIME_ACCESS) && @@ -540,7 +608,7 @@ out: free(native_name); free(val); - return EFI_EXIT(ret); + return ret; } /** From patchwork Fri Mar 27 05:27:48 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 1262552 X-Patchwork-Delegate: xypron.glpk@gmx.de Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.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 Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.a=rsa-sha256 header.s=badeba3b8450 header.b=iA3ZwQXa; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 48pVl83R7Fz9sR4 for ; Fri, 27 Mar 2020 16:28:52 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 0F27B818A2; Fri, 27 Mar 2020 06:28:43 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.b="iA3ZwQXa"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 2BE288188C; Fri, 27 Mar 2020 06:28:29 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, FREEMAIL_FROM, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mout.gmx.net (mout.gmx.net [212.227.17.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id C2C588183F for ; Fri, 27 Mar 2020 06:28:24 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=xypron.glpk@gmx.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1585286892; bh=7MZ3zuyLxOjyWLN1yWudl0McH+KtiH+D96qYO7KyAMI=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=iA3ZwQXawPS+bORPtw4uTdr8JCWsFShfkbOHux4pBj3jpokRUqQqUMYghJgQaPJDc mMjX4evAg9fBKoqabqZGM7uZ7CL16J+ezOw17N5fEkKJcB+nDaDLZ5xoHJbRXLhbxG Jm+IclO2quqmBzw511makdbUNb9KTBsl5KzBVDng= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from LT02.fritz.box ([84.119.33.226]) by mail.gmx.com (mrgmx105 [212.227.17.174]) with ESMTPSA (Nemesis) id 1MIdeX-1j3AwD2hVN-00Ed5O; Fri, 27 Mar 2020 06:28:12 +0100 From: Heinrich Schuchardt To: Alexander Graf , AKASHI Takahiro Cc: Ilias Apalodimas , Sughosh Ganu , Alexey Brodkin , Paul Emge , Faiz Abbas , Eugeniu Rosca , Urja Rannikko , Kever Yang , Simon Glass , Alistair Strachan , Ruslan Trofymenko , Igor Opaniuk , u-boot@lists.denx.de, Heinrich Schuchardt Subject: [PATCH 04/16] part: detect EFI system partition Date: Fri, 27 Mar 2020 06:27:48 +0100 Message-Id: <20200327052800.11022-5-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200327052800.11022-1-xypron.glpk@gmx.de> References: <20200327052800.11022-1-xypron.glpk@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:yKg6S/wXqYBy7cYV9fLd0F6hPsx8W08EWL+pL71ZfU7P58sirhF 8hqk/LUVOf00IoXurXdFf7hCboluU6MG3D2QdjbV+BM+7zzKyr+Sy5HPizFINfn5CtgAXwQ lF0Ebvd75u3Oo8XqEYFzTGRiqkB3Bxqe9ZUz52NQFyT8egnyiMYI0iYuMQqxmuFlYWJrrCb d3mZLZd8B6Qn+TOuWn9sg== X-UI-Out-Filterresults: notjunk:1; V03:K0:UzQJeca75os=:yEU4lF8sfGnCuAU8jLaXUp 20hLYHtjr6RApLywFW6e+8EHjwRxIfLc8YesxJB3ULvQD+KDdvlZtAr8u4nyA8sfpRuUWWEOT dGR0ASYyWwOWDmMgBJotzgtvj3EUIjb3s3edLHdrEFZrSAql4T9DJSiO5izl0E1fA0y2hKLc4 t8brsmSsevvozQyTBBEZXOGTOARdpumxx+5oTTSr0HjMKssaWESpcDgk5GrwD6nnsCyhxKfRh 1LD/Xw/RpxWW7Z53xW7Ko6s+NdxqsQj5D8VoRjEbiJWQqC29+z3b4XE7Vbm3BZb+/dk1uPs6a SbFA2c+R4ML/CSUtO1HTEVBm1ALwDVtjIUUMGYFN8GFaRcQRDIL3aA5Cy4hPJEtty54uJiIGf DAq/OSairAeESz6yjRVAMJ8+WxZfYqFyAv7rC+T6HAGO80SZdZKyIxEK1lttW1znbkpyMjSQD Jwx1I5Mwc8HIKGRbzwBazUqNcfnnSAqHWxPngTBJLN62oJ2ea1Oc6iUJpQ9+RwYJtNKX1s2a4 TavFhSZg2YqqFBFQu65HNA/yC3hnFAfgy9s0frtIlaiiJzQGHXjsTpCBg1c26hu6ByDE1jQbS MplQLV7p5oloBrjOFhCJHQWZubfRqaD8c96LF6aXqliGf/96kPCSefGzQS6cU35kY+wOGaT7U RmcI/qxwVXWmiEIyOaIG7yUi8FrDmasrWZsjnY8Sk0T33NPepBR3uKlIaKwxQZ8VdQbrY82AQ bWui+wFadxn79qN9XSmiYEN89lhpIjCHrCBN1ZNG8vJBnnHzUJ+/nENAvaN+ToCBtaL3V9D79 MVMXsooDH4AaHPfNIdrSJAuh11pr/UGtRA6MA2SuHYmurs9h4dxHmRToZv0hA8iIFBp4mAmxc e5lINh8HM2Rd0kjNsJVMOlvXBXU2u9I64wQH8o2V+wEelsem5IgfRw66COTIPs+yTxymIUDgE Of0gwry/50zk004YAN4s3V40AvvI9XlxW1W9TK013IE0IdmxOfgwM4wDMEhW9FUVsVb3NpD4G J6ZdbHmzBbEzy99hJ+EHiz4Ax9Kcz45jDUywh6RXtkhBTdJXdbqUSW31jJVZHgnSPnqmRQcAI y2lvwdTmPX+ctN2iU8YjHgcgX9AwFlSngYjaKe+6qMDBklImHiZB8eKWKOpq2+d+pa5uaTKaO iJgTIkAmXsnbJh6b+Rc1+OFc7+Np+npmgp+XhxcDcSXRzoyVgt+OHbIEq4hmQTGRtYxabdf5r LE22CAoDWIR/htU4T X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.30rc1 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.2 at phobos.denx.de X-Virus-Status: Clean Up to now for MBR and GPT partitions the info field 'bootable' was set to 1 if either the partition was an EFI system partition or the bootable flag was set. Turn info field 'bootable' into a bit mask with separate bits for bootable and EFI system partition. This will allow us to identify the EFI system partition in the UEFI sub-system. Signed-off-by: Heinrich Schuchardt --- disk/part_dos.c | 10 ++++++++-- disk/part_efi.c | 12 ++++++++---- include/part.h | 11 ++++++++++- 3 files changed, 26 insertions(+), 7 deletions(-) -- 2.25.1 diff --git a/disk/part_dos.c b/disk/part_dos.c index 83ff40d310..0ec7f1628e 100644 --- a/disk/part_dos.c +++ b/disk/part_dos.c @@ -45,9 +45,15 @@ static inline int is_extended(int part_type) part_type == 0x85); } -static inline int is_bootable(dos_partition_t *p) +static int is_bootable(dos_partition_t *p) { - return (p->sys_ind == 0xef) || (p->boot_ind == 0x80); + int ret = 0; + + if (p->sys_ind == 0xef) + ret |= PART_EFI_SYSTEM_PARTITION; + if (p->boot_ind == 0x80) + ret |= PART_BOOTABLE; + return ret; } static void print_one_part(dos_partition_t *p, lbaint_t ext_part_sector, diff --git a/disk/part_efi.c b/disk/part_efi.c index b2e157d9c1..19f1f43f4e 100644 --- a/disk/part_efi.c +++ b/disk/part_efi.c @@ -71,11 +71,15 @@ static char *print_efiname(gpt_entry *pte) static const efi_guid_t system_guid = PARTITION_SYSTEM_GUID; -static inline int is_bootable(gpt_entry *p) +static int is_bootable(gpt_entry *p) { - return p->attributes.fields.legacy_bios_bootable || - !memcmp(&(p->partition_type_guid), &system_guid, - sizeof(efi_guid_t)); + int ret = 0; + + if (!memcmp(&p->partition_type_guid, &system_guid, sizeof(efi_guid_t))) + ret |= PART_EFI_SYSTEM_PARTITION; + if (p->attributes.fields.legacy_bios_bootable) + ret |= PART_BOOTABLE; + return ret; } static int validate_gpt_header(gpt_header *gpt_h, lbaint_t lba, diff --git a/include/part.h b/include/part.h index 0b5cf3d5e8..a63d1d0cda 100644 --- a/include/part.h +++ b/include/part.h @@ -51,13 +51,22 @@ struct block_drvr { #define PART_TYPE_LEN 32 #define MAX_SEARCH_PARTITIONS 64 +#define PART_BOOTABLE 1 +#define PART_EFI_SYSTEM_PARTITION 2 + typedef struct disk_partition { lbaint_t start; /* # of first block in partition */ lbaint_t size; /* number of blocks in partition */ ulong blksz; /* block size in bytes */ uchar name[PART_NAME_LEN]; /* partition name */ uchar type[PART_TYPE_LEN]; /* string type description */ - int bootable; /* Active/Bootable flag is set */ + /* + * The bootable is a bitmask with the following fields: + * + * PART_BOOTABLE the MBR bootable flag is set + * PART_EFI_SYSTEM_PARTITION the partition is an EFI system partition + */ + int bootable; #if CONFIG_IS_ENABLED(PARTITION_UUIDS) char uuid[UUID_STR_LEN + 1]; /* filesystem UUID as string, if exists */ #endif From patchwork Fri Mar 27 05:27:49 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 1262562 X-Patchwork-Delegate: xypron.glpk@gmx.de Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=85.214.62.61; helo=phobos.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 Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.a=rsa-sha256 header.s=badeba3b8450 header.b=AwbGcKff; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 48pVmV3k4Fz9sR4 for ; Fri, 27 Mar 2020 16:30:02 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 3C6A5818D0; Fri, 27 Mar 2020 06:29:13 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.b="AwbGcKff"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 0BDA6818BD; Fri, 27 Mar 2020 06:28:39 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,FREEMAIL_FROM,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mout.gmx.net (mout.gmx.net [212.227.17.21]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id CE2248188A for ; Fri, 27 Mar 2020 06:28:25 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=xypron.glpk@gmx.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1585286893; bh=iC5WXPr5zk2R9l0ik5E2gyBh71cZbWz+J06/zNyBq2s=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=AwbGcKff94MY5j6pa0j69WTASp10wQ7UJ45zoBQU8ARq4rtpT4dEB1sVB0gx1mUrp Yi2M5VMtLUxkVZ/3Lh7tLtkm0S7T15Hh37kN1qt4VDtdePjjh3NBIGfCBERqTo0Uo9 ES0Ve7ZtIPX6i3PpKPzD5k9YfesB939DQ/tF6TXk= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from LT02.fritz.box ([84.119.33.226]) by mail.gmx.com (mrgmx105 [212.227.17.174]) with ESMTPSA (Nemesis) id 1MMGRK-1izc9j0nZ8-00JK9Z; Fri, 27 Mar 2020 06:28:13 +0100 From: Heinrich Schuchardt To: Alexander Graf , AKASHI Takahiro Cc: Ilias Apalodimas , Sughosh Ganu , Alexey Brodkin , Paul Emge , Faiz Abbas , Eugeniu Rosca , Urja Rannikko , Kever Yang , Simon Glass , Alistair Strachan , Ruslan Trofymenko , Igor Opaniuk , u-boot@lists.denx.de, Heinrich Schuchardt Subject: [PATCH 05/16] efi_loader: identify EFI system partition Date: Fri, 27 Mar 2020 06:27:49 +0100 Message-Id: <20200327052800.11022-6-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200327052800.11022-1-xypron.glpk@gmx.de> References: <20200327052800.11022-1-xypron.glpk@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:RJy0bkSpi5XTiSq191F7peNuc+mVWqPDt5e2vaMrUgTPz1/OsJ7 l2fT98lYOhimjF73MOwO2WKIcFf4rvBJYTt7MN1zfUtKAIusZ3gXlaO+9WUv2Z1s+ue3N6c nAWWC/8wFcA7TTUj39ZrYnJwspVh+1keGHJBFTG42XG+JfuIDUQzDn6vhlWertCEQNk+fKJ uHtIu0q65emTlNepGl/Qg== X-UI-Out-Filterresults: notjunk:1; V03:K0:lnPjLRoZ/rM=:2ok7H0Iex89Prh32vmNUpf qkjNUd5/jX34DnxoK8+l+cNUe6ZK4XETdENZ/2BShgBbygiu3mJittSH4oUW2KansT+rSS/cp EU9ZE1Huuxxk7kRSpqjdGePEQ5p4MdwPOrDM/5bOKx2bCTadvD4cyOA3FsN3q+hOKdVLwy9JB 0ee9FKrnY55VZ2O+tMN1KjuGH1oseJ6ndj8EMNqZEriz5EbIaCJU1t8kk5R10s2J3egmbXLB4 4hUkS5jfY+Qplgr4mWEFQ2AvdYnVx3jdI9KGKVvAUbxj2x4fbIaxyorlGh+ABZI+XhuUQGZgX zZCFHTDoNaLoj9N68+MjsX1wJD4reNwGpCUlg+x9x4iavBSNXIqFEhh/+yRTKB/Fj/5Z/S0vW wMll9plvrN/wMIyPbk5Svn/gM7RRt1lCxLEroMeDS5crYDQNZWaPfuRCgA9gM/fvrbdF2Ooea UEhOe3C5xZikQzZPxTH/CY9opXCYfmkPzj7igtMFT/fd5lYbJWwE8xUDEI8Y/WdNnYZPMoX2/ 07c8kYe6axjGVTeyNaQR9noZj8EjzHZO5+Qr2GmOb8r1lxVLLfPwRl2W3H3bwY+FDtOh0G461 rFKB1AVgLHV2a3A1jbQH5lAtpGaF1pewWbk1WOMCrA8gBOmA1n+OHzYhFCmuX/LoQLGT3dTJZ 7kGAtzlnnKEjRJsvlKMwGzI3iYMozcFujzzk7HnyMUE0Q4ElpmSWfdEV0XabUexebA298Bi6w VJwAAPXCpdVV/8COsoo6Of8hnOXGLzXLbnPScX00luiu83Ker9gPGeKv9sOeDmLQXyt0TzQ2/ 6oTUCQ3wUY4+70LB4o59DUfubyl+S6lY9EFU+Sh5WnGahkZlwYcUnJsFl5wAJPSi7Dhmky1Aa HP6bRmXgGhGo4IE8uKLZdw+AQGWOj+t3YxoEJ4tUWYGEsgr3Xq1FCwpJC+jfqGj37Js+eqn89 Ilao5oOoKTrR1yZDKgp6AwSbyXYmOLwlWCrV5Z6md7G6cBze7pR0STzu/rLnXTnlFaF1OtMd5 f65GOa6F7Rhft15FUd/m5wcnXakJz2pE7W8bzQmtvWAbM+S8+kUVJL/oAov9Fy1ubKGDctPIR aIMyntHy6JKna2txfWC2wWaicpVnVyVPq5O6tM7aEMSPr7/IyzVql5NNgWPUqnTC4VoEmj+ch tt31pxXd/qwNZ/yjeJwdCZ5TqVGlw5g5icvQnLSOBbbDxiSATdSTISmLaFcPE6AZrKIlfBSwK BKSe1yTzOxyl6oTJG X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.30rc1 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.2 at phobos.denx.de X-Virus-Status: Clean For capsule updates we need to identify the EFI system partition. Signed-off-by: Heinrich Schuchardt --- include/efi_loader.h | 7 +++++++ lib/efi_loader/efi_disk.c | 20 ++++++++++++++++++++ 2 files changed, 27 insertions(+) -- 2.25.1 diff --git a/include/efi_loader.h b/include/efi_loader.h index b1d2feab61..5890871470 100644 --- a/include/efi_loader.h +++ b/include/efi_loader.h @@ -45,6 +45,13 @@ static inline void *guidcpy(void *dst, const void *src) /* Root node */ extern efi_handle_t efi_root; +/* EFI system partition */ +extern struct efi_system_partition { + enum if_type if_type; + int devnum; + u8 part; +} efi_system_partition; + int __efi_entry_check(void); int __efi_exit_check(void); const char *__efi_nesting(void); diff --git a/lib/efi_loader/efi_disk.c b/lib/efi_loader/efi_disk.c index fc0682bc48..2f752a5e99 100644 --- a/lib/efi_loader/efi_disk.c +++ b/lib/efi_loader/efi_disk.c @@ -13,6 +13,8 @@ #include #include +struct efi_system_partition efi_system_partition; + const efi_guid_t efi_block_io_guid = EFI_BLOCK_IO_PROTOCOL_GUID; /** @@ -372,6 +374,24 @@ static efi_status_t efi_disk_add_dev( diskobj->ops.media = &diskobj->media; if (disk) *disk = diskobj; + + /* Store first EFI system partition */ + if (part && !efi_system_partition.if_type) { + int r; + disk_partition_t info; + + r = part_get_info(desc, part, &info); + if (r) + return EFI_DEVICE_ERROR; + if (info.bootable & PART_EFI_SYSTEM_PARTITION) { + efi_system_partition.if_type = desc->if_type; + efi_system_partition.devnum = desc->devnum; + efi_system_partition.part = part; + EFI_PRINT("EFI system partition: %s %d:%d\n", + blk_get_if_type_name(desc->if_type), + desc->devnum, part); + } + } return EFI_SUCCESS; } From patchwork Fri Mar 27 05:27:50 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 1262550 X-Patchwork-Delegate: xypron.glpk@gmx.de Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.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 Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.a=rsa-sha256 header.s=badeba3b8450 header.b=Z8jHMBV0; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 48pVkv4MTXz9sR4 for ; Fri, 27 Mar 2020 16:28:39 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 64EEE818AB; Fri, 27 Mar 2020 06:28:30 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.b="Z8jHMBV0"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 845E1818AB; Fri, 27 Mar 2020 06:28:27 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, FREEMAIL_FROM, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mout.gmx.net (mout.gmx.net [212.227.17.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 4B2F981836 for ; Fri, 27 Mar 2020 06:28:24 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=xypron.glpk@gmx.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1585286894; bh=xOv2HgJrrPtdjGRpv1SQ66M3t2XupBYVkmENKlPLnEY=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=Z8jHMBV0KNOnx7sAo1H9gWPIlyzf2hU1rbhoNH0bScn4eIDLeL4/e+twPfaY6n4DK 4M3QpdfdRGqtQPLzwhEgnzjWhU0ZfJp2jrH0aNsdZ5j4D+qMmnnlCeGdlv62nREaSi NZoK0TE03msupT44yRocz6cRvdNH6G+2r3H+1mXQ= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from LT02.fritz.box ([84.119.33.226]) by mail.gmx.com (mrgmx105 [212.227.17.174]) with ESMTPSA (Nemesis) id 1MC30P-1j5Liy36oH-00CQ9i; Fri, 27 Mar 2020 06:28:13 +0100 From: Heinrich Schuchardt To: Alexander Graf , AKASHI Takahiro Cc: Ilias Apalodimas , Sughosh Ganu , Alexey Brodkin , Paul Emge , Faiz Abbas , Eugeniu Rosca , Urja Rannikko , Kever Yang , Simon Glass , Alistair Strachan , Ruslan Trofymenko , Igor Opaniuk , u-boot@lists.denx.de, Heinrich Schuchardt Subject: [PATCH 06/16] efi_loader: keep attributes in efi_set_variable_int() Date: Fri, 27 Mar 2020 06:27:50 +0100 Message-Id: <20200327052800.11022-7-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200327052800.11022-1-xypron.glpk@gmx.de> References: <20200327052800.11022-1-xypron.glpk@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:TjWUmFtj2mEcg0fPTwuJGA0OOGHYjkjI1VGyWBQdy5efSV4rOla RQbT9JocxEtr4n4bO6I5IBuxlYus5Uq/Doky8uI9+zmeRxpYYvpt8w+Xp4FNXP0ZuuznDJD tnBo0hmXeOT3MUPBA4+iv6kBPSwWXzA/P0xQmweEfNz5qporAjf1pDMjI9JPXOKjjDszwgC vItIgE7QT2d4vbkhdIATw== X-UI-Out-Filterresults: notjunk:1; V03:K0:mKaJyqsYoUk=:+zDa1pvcHyHcz6CJgk6laf RzuHo9zVjRUbPWHFRYJo+AYj57IDQYsy1M6QmhIWQWe3tAov9g0uKWcxFt9vTX3WrqJ3PqzKM z/r/U9VSi9Dnue2TuZO4X1ktT8fAb/jG6vBUfcmzCgN1x1N8VNDjYW9rU/wwjgAVwKo/PRJ3Q JTtTKz7jvJmxOLfAvdoV3GFqwQeRZz+vGl+QVNeo1PTD8P9H6BNSLNmqaHOsLaQdBmnrt7ky/ vONn53H2OKjtzLdrD3PUMiqqDMZhRxUlPzHGy7zhbZnmYDoPYnX+Awz3uZZuHIPIBsWZjxpQq nJXl89P8yKddhMM0sr/7Okua6ETWIT0JNg4fEsXhn0PHTJykTkFXkvFSIWQ5JBFvOeaTNNYKY oQRMuaBlhZvgcvUaxs2NNxsTQpJk2c1821JRUZ5QDYv32CLItLrMrDueWjtxnRKaGiUvwAa8T unPJGQiYYRzwMQGyknOQRu0uX5pb+MJOI6t+TxNtgwWkKEA33H/iPfbzNZ1BdeVCEv0iO8J6v RGS3ywtV4wUyGPUNlsDFfP68XatU0wDSmfSReSXssvMP3+YHoRsVTT1zkcj2zu7Yruap2xHyJ V1UYyIayIXHL/y/olgYylzFTi8gZosgu94bZiWsm9/Bl10xmwL48QNXNv2ZIEj7JiV7z8rpiv /eGxE5SyIXGjEtwgxYxJnLPRUqBsvTxz4TX6O+sLcb29yqt3RvZlYR1HmJsdn0etCa7p5AOEr ussgLXzCWb3pq5ljoFGXcZ+9uiYMZHvIqhYFbJqime4JEsmrSRecuGN6m4r2Q4nbYguEXvSUm uOUfotkKhS8TTZm0Ow+3qKAUwPxMwIYPzipB1TY+BBpNM6AboiIMgVSXNZr7rIXV6L9IJv0AD QuqTd57ebfaMUTdk4plRLeMiS9JNEuT0DhFEXMdrLWhfV5acx5hFbGsq06f/EA6sQzQ3ge9pm VEX5UeORttw7mTDS9ohSw2Tli1jUCZk/wY6H+P/rWk+s4KwBT521bZRl7KsR1dWCgx+cn7ffe qYNuC3/amXO+R6mHum4SI+9TFs27ahCTWvmQU4e4uMgyWfssNDOep6yvS3l8ZeImhC2ETFhNe OgUc/QgUyCS6NOw5rWnGODwa/dB3JScokuTHKjsQne93L68d6ubfenL6GFYpkqAogtGa+/bB3 l6Cdq44E+nUC5QqkpEN4H6/C/tmzcFFZeTe3/PMSNeSPuqCGoXwQInaiYQmooDEIDpGdGavvx SFgWrmCFfOL40MA3D X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.30rc1 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.2 at phobos.denx.de X-Virus-Status: Clean Do not change the value of parameter attributes in function efi_set_variable_int(). This allows to use it later. Signed-off-by: Heinrich Schuchardt --- lib/efi_loader/efi_variable.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) -- 2.25.1 diff --git a/lib/efi_loader/efi_variable.c b/lib/efi_loader/efi_variable.c index 4fae1fa4c7..d99ad6ddae 100644 --- a/lib/efi_loader/efi_variable.c +++ b/lib/efi_loader/efi_variable.c @@ -573,8 +573,8 @@ efi_status_t efi_set_variable_int(u16 *variable_name, EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS); s += sprintf(s, "{"); - while (attributes) { - u32 attr = 1 << (ffs(attributes) - 1); + for (u32 attr_rem = attributes; attr_rem;) { + u32 attr = 1 << (ffs(attr_rem) - 1); if (attr == EFI_VARIABLE_NON_VOLATILE) s += sprintf(s, "nv"); @@ -583,8 +583,8 @@ efi_status_t efi_set_variable_int(u16 *variable_name, else if (attr == EFI_VARIABLE_RUNTIME_ACCESS) s += sprintf(s, "run"); - attributes &= ~attr; - if (attributes) + attr_rem &= ~attr; + if (attr_rem) s += sprintf(s, ","); } s += sprintf(s, "}"); From patchwork Fri Mar 27 05:27:51 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 1262563 X-Patchwork-Delegate: xypron.glpk@gmx.de Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=85.214.62.61; helo=phobos.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 Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.a=rsa-sha256 header.s=badeba3b8450 header.b=c0JC7elH; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 48pVml70bwz9sSQ for ; Fri, 27 Mar 2020 16:30:15 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id F3868818E1; Fri, 27 Mar 2020 06:29:17 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.b="c0JC7elH"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 3B6318186A; Fri, 27 Mar 2020 06:28:41 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, FREEMAIL_FROM, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mout.gmx.net (mout.gmx.net [212.227.17.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 2A0AF8186A for ; Fri, 27 Mar 2020 06:28:26 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=xypron.glpk@gmx.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1585286894; bh=r5U5WqvYLdosB5PUD7EX76ziHnRnIZeWxU5jN+aWgYI=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=c0JC7elHtHo7+zzk7lKx2QsVA+zbp3RO9TJdYgaD51ZXNa84HOmlHS9TOgPwuWoht GHhMon9sXp6+Pcp6n/ZK/dlpbuJ8rTM6ISMlB8XThnaw95/hL3Qbv9GyQp2eN4MnW9 hd/bBKIBzJjpqmZP3ky9mDh9IrflrZ0svtebJJWg= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from LT02.fritz.box ([84.119.33.226]) by mail.gmx.com (mrgmx105 [212.227.17.174]) with ESMTPSA (Nemesis) id 1MHXBp-1j4HOx1Jez-00DWco; Fri, 27 Mar 2020 06:28:14 +0100 From: Heinrich Schuchardt To: Alexander Graf , AKASHI Takahiro Cc: Ilias Apalodimas , Sughosh Ganu , Alexey Brodkin , Paul Emge , Faiz Abbas , Eugeniu Rosca , Urja Rannikko , Kever Yang , Simon Glass , Alistair Strachan , Ruslan Trofymenko , Igor Opaniuk , u-boot@lists.denx.de, Heinrich Schuchardt Subject: [PATCH 07/16] efi_loader: export initialization state Date: Fri, 27 Mar 2020 06:27:51 +0100 Message-Id: <20200327052800.11022-8-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200327052800.11022-1-xypron.glpk@gmx.de> References: <20200327052800.11022-1-xypron.glpk@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:KIg/9Hd6m1x/T5Ie/OhUYIgUHD7cG3K6RQIQRziizc8TSCw6Zz9 T+CYTwBSWy7mFEeErCBmqPnNuRERRYR2qnyKQnruqo7919abnmYu24Enxsmlqg9l6A1pkye /TNDgWfDRby6vIFLzjMc1qABQ9I9YJDx2Xl5aFmAlbuDEMoOarERns5X9wPAnAR1c/kxdm3 4B1TooDHy06fYSdf5TTGw== X-UI-Out-Filterresults: notjunk:1; V03:K0:hUOj+ke3cfw=:6L83Sjcaf2AaDJQqLn5EpH F1CV4wMR5s5d1zjAcyq6THve0IVSVu6hCJTRedSzjZTZ4iv8Rrd2jsf57Md9TXJ2E9wzFm6oV NxwR9+atxnvxyWinToFlR4Evc96A4heBqblSBCh984qHBskPusxer3W6+XgTi2mcT7DuIVZ40 QY91DdKyJvdT+Ni6SA+CSIPC2Uhw5TncfqC3gwhbZwEeK4LxTZwaBIC/Sr1jNii+CvW1L41c1 33ioapRmebmk2C34OcGC4i/HL7IP9z5hPmj4jeshTQSlXMOSitFixeRvx95bbPDmIg7LnF2aW owAxIsBkZILK6BMhdv/94aDaMkK39xH0e5qeWnSSKrntnsmv4md8t2wOAGTn0EEQRmxIVZ0g7 euo2eraH6gt/W2fesVYimhW2qQoivcsPGkEsr02V7XDsS5p87/WmiRv0ytIIEmAHohL00QF6C X3PNkkbqFzKsUuX0Rwu/qZcj7pROz8t9cvwoxKhSCsRop4q8eyrGw62QwzvrBZ0W0TX/yuC2S PPkoyp1XsdAItfYcwpcMPZuRvJNlSNSk8hbCvZntT672pZl5qCD6Vrju/Zux35PkEAAlEcy5Y lwsbHgzUDxpHgbbMh0UiO30zd/T37WipY2buqWHPF9GvvezSxXDI5nUvjx1IgshZ56x2WH08z qDiSwU+zRqIKlzXhxhrsX43MC8DwjXLJI3AnNvSZgJp/X7lnuFHoccy1j7pFRfhPPTRDnKWce e5dTStrxUL1lG/lIZqZ7AU4f0hC6SXTr0BDf2gsc6M2QpXzaO+uiyr6L1tzF0gH3UCkfHU/at 8BohSe+piO8XkNKYuC8dRtja1zr4wEOYKUK1v2Tly/Jy18Yjtwf4lQz3axnmFf50uatf0N5gZ RWizrvvZDZWraGhuNa0VO6Wf9uVtT4Lsw0dYJjX1+fGvXfznlnizWMrcKIBCoo07pqXfnRU5f I5ruAy+HaIrbJsD43bOsOmqivlKdJvePFCf36kL7Jx6qc12v1oPSYSmD8Q2bWkZh9u3bMM9AZ 7hal4gyzWfv4os5QyUc3Zyiz8Gwm26y8GRTvHjB6MmJLxiLFXgfCa4mW+VjSvY7M3Iz6BDXtT pZ6cnyvT0sHBAst/EPtk7REPxu9i07FeBejnC6QZieU7JhdRJK68ToJ1a5ffGsHI8jJn/P15Y wLIsV3i8RAaEV0Z1gkw3CE+c4XlQSQGfndUhlOZ4sq5bjUa8lnOdxMNR4wDpP3wFfh+9lqcr2 EDTIklqKEJrScxzIg X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.30rc1 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.2 at phobos.denx.de X-Virus-Status: Clean Export the UEFI sub-system initialization state. This will allow to treat the setting of UEFI variables during and after initialization differently. Signed-off-by: Heinrich Schuchardt --- include/efi_loader.h | 3 +++ lib/efi_loader/efi_setup.c | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) -- 2.25.1 diff --git a/include/efi_loader.h b/include/efi_loader.h index 5890871470..510f39fe9e 100644 --- a/include/efi_loader.h +++ b/include/efi_loader.h @@ -45,6 +45,9 @@ static inline void *guidcpy(void *dst, const void *src) /* Root node */ extern efi_handle_t efi_root; +/* Set to EFI_SUCCESS when initialized */ +extern efi_status_t efi_obj_list_initialized; + /* EFI system partition */ extern struct efi_system_partition { enum if_type if_type; diff --git a/lib/efi_loader/efi_setup.c b/lib/efi_loader/efi_setup.c index d1884e4dae..f6b17b662c 100644 --- a/lib/efi_loader/efi_setup.c +++ b/lib/efi_loader/efi_setup.c @@ -11,7 +11,7 @@ #define OBJ_LIST_NOT_INITIALIZED 1 -static efi_status_t efi_obj_list_initialized = OBJ_LIST_NOT_INITIALIZED; +efi_status_t efi_obj_list_initialized = OBJ_LIST_NOT_INITIALIZED; /* * Allow unaligned memory access. From patchwork Fri Mar 27 05:27:52 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 1262554 X-Patchwork-Delegate: xypron.glpk@gmx.de Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.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 Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.a=rsa-sha256 header.s=badeba3b8450 header.b=dtivM6Z8; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 48pVlL2VGdz9sST for ; Fri, 27 Mar 2020 16:29:02 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 816FB818A0; Fri, 27 Mar 2020 06:28:50 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.b="dtivM6Z8"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 6206B818B2; Fri, 27 Mar 2020 06:28:34 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, FREEMAIL_FROM, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mout.gmx.net (mout.gmx.net [212.227.17.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id EF06681850 for ; Fri, 27 Mar 2020 06:28:24 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=xypron.glpk@gmx.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1585286895; bh=RsEaHhHc1eU9BJ+gsOjkpOJV8pCu65C8HJ7RgPuo/Cg=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=dtivM6Z8v0G+Zxc2WQs3zQvt1jJJdpuQNhfGcQ0WZyxiMMx3lOuc/WysNMwccPFzR tYCbCcEbJZOFj51ehpH0HszKjFrfu6/48ZKJhQw8WWZeHEu5XuH+jZwDc22a9VoBOo o2RipkIkW+WoTHNmj8DJH1XImSpT7wMMvJU2sVh0= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from LT02.fritz.box ([84.119.33.226]) by mail.gmx.com (mrgmx105 [212.227.17.174]) with ESMTPSA (Nemesis) id 1M4s0t-1jGs3d3Zhf-001vlA; Fri, 27 Mar 2020 06:28:14 +0100 From: Heinrich Schuchardt To: Alexander Graf , AKASHI Takahiro Cc: Ilias Apalodimas , Sughosh Ganu , Alexey Brodkin , Paul Emge , Faiz Abbas , Eugeniu Rosca , Urja Rannikko , Kever Yang , Simon Glass , Alistair Strachan , Ruslan Trofymenko , Igor Opaniuk , u-boot@lists.denx.de, Heinrich Schuchardt Subject: [PATCH 08/16] efi_loader: change setup sequence Date: Fri, 27 Mar 2020 06:27:52 +0100 Message-Id: <20200327052800.11022-9-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200327052800.11022-1-xypron.glpk@gmx.de> References: <20200327052800.11022-1-xypron.glpk@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:yrcFF6PD/KpU3X+ECP7QBniWQ07xL5WGbYK0uNSM3WysV3Rklha dLtzUpNZbql0rJHNzRRlIYNN8J/f7VqaqUuSHY5nhVKjck7RCxbQ0meoNBCEdbHGNq4jU/b jqkVgnGSFhWSMQ0nh6j8rPguOSVMlowX6svNf1hIjPb6zottObTKQAUpxoqlxZ/J9IBNj6J O3QGMn2YXcnf39dYSV0ZQ== X-UI-Out-Filterresults: notjunk:1; V03:K0:Eg7lQzHqM1U=:2qahBr8X2r0DOE/Nttl+aX TCgMS5KR4gnZECBjB/LSDU1eqUzO2CIFIlFwj2EtbCgkORl51xwK7+PmjLMeEQ3uKyE0xcIKG /Mq+3e45Vr+qTbonbawcWSdaZzmXaadWAdlDIBDx0fZQsyCIV6jYAeLttUYR2SJHpsH/I/KLk pmeF07/RcIgO21JcgKv3Ur4H9qDABmkAetUPuEdz6CxLT6jSDpOjGIokCFzhXBuuHCjCQFE7p oQ+or6hobxO6XqvutIXaJ0mOD7it/44O+Ji8daKJHYcv15oFqecz5YDKAwTa/cIxwp59v7H1F fKUjCcc1WswzBOUR1GjsYtLJm6Kd9UqCba+kYPf3vcKDMMQ5cjmj2AoQaTQroy+dLjeyg4HWe erzRcFFZNH6WJMnT8004zIT6XnMpcJL5ZNmsDKU77mEN4mJjR3M9mRc8lXrymTEwJ53pZrl3e aJmtMT6m+fdB5UEJv5bXhy5c0BXOZivabLdcMjMs0RI11aXvuZcQEmOd/o9HJX6cQTziafqMK shKkyX310DUeSN3su8BwUbaU+wCKSYsRtZp6M16yLJAlh/uvj5TmQQlmjlaD38zKC4hbM7z1r xCWT5cCOXfXhs6bnwsW7iwfQX/G0b5cLaG/QKrI5kZNjl1H2yW30ewu/EvO1ch8HtXd0CVd6m 1Ibre3WjnYfKzGBUg+VbXdElmwIKQvQrsYJ+ixqsv+dRFPrlNmFebkfl2hWn6jSwam86SdqMG T02APPIH3jWCiX5shsNNV7exahEMcAIk8K9im30mVYNRH70wnKxxCHIwVUxvE5xxEFcxnKTg8 tRwm7xFG/UnEUb9TPx32pD3sfRwkyxsHm7gv37ZySvCChdsITOCt0GQlJXEOVtEmXsMrXr8zv 8zRkBW6iubdZYS5ZnKsqoNokwzXu2GTumBfmty+m1v+jNh+fAZSFDc6/K7/qIVDc1Jx6R3xsu 44DsCmg5nWyVRzFyV31C6XLuCi5L575MY6ZSs41opuB0Sj8JbaYD4WXQB9jTAeYIVW/wj1Ddx 649ck+TGXGWy3xBzy1XW9Aoi65Q77FVlbMM70yo6eEg1B6mVMqSutlou0Jl3DhzzUBk8qBr23 ArPufuxHcwdsmbieh6vkUJbalFwK0M4fIF/SR/fFNgoE+rPhdivkVWg1HxLt7ZsZOnU5XYGb6 8/P80urzzrLx4kAVnCpTTNPu3c7DuSTKxiIryd5RFNy3j/qFPKDGtBgin+hwdfeOSowxf05Ft atuwHa4gfbbbg9GS/ X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.30rc1 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.2 at phobos.denx.de X-Virus-Status: Clean If we want to restore variables from disk, we need to initialize block devices before variables. Signed-off-by: Heinrich Schuchardt --- lib/efi_loader/efi_setup.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) -- 2.25.1 diff --git a/lib/efi_loader/efi_setup.c b/lib/efi_loader/efi_setup.c index f6b17b662c..1e3e474835 100644 --- a/lib/efi_loader/efi_setup.c +++ b/lib/efi_loader/efi_setup.c @@ -102,6 +102,11 @@ efi_status_t efi_init_obj_list(void) /* On ARM switch from EL3 or secure mode to EL2 or non-secure mode */ switch_to_non_secure_mode(); +#ifdef CONFIG_PARTITIONS + ret = efi_disk_register(); + if (ret != EFI_SUCCESS) + goto out; +#endif /* Initialize variable services */ ret = efi_init_variables(); if (ret != EFI_SUCCESS) @@ -145,11 +150,6 @@ efi_status_t efi_init_obj_list(void) ret = efi_console_register(); if (ret != EFI_SUCCESS) goto out; -#ifdef CONFIG_PARTITIONS - ret = efi_disk_register(); - if (ret != EFI_SUCCESS) - goto out; -#endif #if defined(CONFIG_LCD) || defined(CONFIG_DM_VIDEO) ret = efi_gop_register(); if (ret != EFI_SUCCESS) From patchwork Fri Mar 27 05:27:53 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 1262566 X-Patchwork-Delegate: xypron.glpk@gmx.de Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.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 Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.a=rsa-sha256 header.s=badeba3b8450 header.b=ePBC0FqU; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 48pVnP3gL5z9sR4 for ; Fri, 27 Mar 2020 16:30:49 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 494F28188C; Fri, 27 Mar 2020 06:29:27 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.b="ePBC0FqU"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 3006F818B7; Fri, 27 Mar 2020 06:28:47 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,FREEMAIL_FROM,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mout.gmx.net (mout.gmx.net [212.227.17.21]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 586218183F for ; Fri, 27 Mar 2020 06:28:30 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=xypron.glpk@gmx.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1585286895; bh=WzfwKjiJbklJxaRYJCTLtfb/kfdgH/PkXc32JedDC2E=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=ePBC0FqUmXwZtOqM8ntBTz2QN/c6IjJoKQdlcCxAuPOKbg1kCWdsOX9Wd+G+oFTWy 8Sh9/5zx5aArfLK8G8WPEUyvdGnrYNJuNr+x72hgHRfkl4dL8UzTc5awtfAFgl3zlU /iCtfsU7peqePSTdqoAt4OE9daqfL814wc3HBOA8= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from LT02.fritz.box ([84.119.33.226]) by mail.gmx.com (mrgmx105 [212.227.17.174]) with ESMTPSA (Nemesis) id 1M6UZl-1jApuw1jlB-006tqI; Fri, 27 Mar 2020 06:28:15 +0100 From: Heinrich Schuchardt To: Alexander Graf , AKASHI Takahiro Cc: Ilias Apalodimas , Sughosh Ganu , Alexey Brodkin , Paul Emge , Faiz Abbas , Eugeniu Rosca , Urja Rannikko , Kever Yang , Simon Glass , Alistair Strachan , Ruslan Trofymenko , Igor Opaniuk , u-boot@lists.denx.de, Heinrich Schuchardt Subject: [PATCH 09/16] efi_loader: imply FAT, FAT_WRITE Date: Fri, 27 Mar 2020 06:27:53 +0100 Message-Id: <20200327052800.11022-10-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200327052800.11022-1-xypron.glpk@gmx.de> References: <20200327052800.11022-1-xypron.glpk@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:IcZzzvq5dVqW9sKE4XS3HIKWSMl15RgkVClLrdsvE8Dpgao2ZhO Ym/1cXMerbYv+gQ2/LNfqGwYm/BodzqQtc4vyYSYWTVsor3XSUeSnbjIa9VJOU3HnGt7d5D w/z7ak7Zr/As3+RmmQELfHvTml0dCrPaOj4V76SD3a2Qu2xZB+YfyjvyyYiGkbhfvEzRGOh qbGxhFKYDFf6Nfp87QNKQ== X-UI-Out-Filterresults: notjunk:1; V03:K0:VJ6PHqHgW9k=:lZCAG9QtasnTFWP71dBIEQ ZfKzXZPrIM1VLCiYYqs6FXdhZgDoC0jtVSZnEGednNiFHxidxRVpq74sxc5/HAv/l09J1IDxn iklq7ZY2ybXvagKil1mvYCFxNlTIKMAHk3SMycQ2epTpmGQQZlR1pPkkuQ9LEZ32oLOsavpDe xnTroXeWF9c9SkKOv//v9el4X8KE8tKTx/fzX2WosOYaBHbxqBG0zAhliNqh6gb75KHaYejyu IiThcetEsAIjJMUqCFZv30rUAxm8ZYyFr6YMRcrh7r64b789N/9yJyB8IAGsiLA7N0sDpj9Xp ac5bPAZaCQxE5mx4HWCISo9wn/dEmw/ILiQPgyY5liDY1GBWjvWwi7KAb4rCUX4TTGfUTD1BT NLIL55+v+4jHc8/1dykQyIdvxs26p4XbV0s2FGvMw2JoLW+Oyuu+rHmxqk5tMT8po3dAapBeO R2bLskxY1+A31y2/tJ7j1XBx6niv7aGr4XnskZtkcf+lXnxYlBCAVCbBVSXmithWF5rvHVOO6 Z12ks05gVMffDnDFZ6dE1rYkleHCQyvs1VxuLHht0xAzI1BW5g4h4HxqMjYEFIsgpNnFsWv4l qBvgWmSgxn+8kRRwTbeT/PeG4Hz2D74G1rxBDwSLEUclsXk3BTSBqdG4/HnLnsRs6ErkuLSDW 7lCFD+QF0/T7SXIyLTo9QFrhXn9Fvt1ARUcYw1sq81yGT4r92G1mK4jTuaHacW3Dd9dQFpb/b SHKiVamGkBG613b9bu7eBUj10j9KfPFQOO7E0FZvZ99I4l8fbw+2J4KjCg6lYNqcjKCaAj17P W32i+b6egM02qmqmvjfmGMiZpLypTTosM3DgRTLL52HachZDb54ggrUSeaj3ts/XPuGE95ZRl dQG3bQuABqDy/liDN2i2mFk5X5kJO4l2w0Rao9E1aArwO6Nsqup7NOXgMMnqC4fedy2dICMrk yZoUBcXuevB26+ak+JNRP67MF2QYOYcU3ZzJjE7N/p0yP2yLDqnN2ATNwqBY0YpY9mKo2Osbq oOZ5ujleH42DuHxcmwr+MZMtkPAkSY3goP06SidiNDVjFhLzSlHLn/g/CADBz5/P7lqqGdl60 Jb2lkiRmePNczhzPOTHG2jTE95CGtB11TeKDgj7jmxMD7/3xSgl9jslT67z9fgIJBju61mkml rac+brUo0hiLxURmByiHwtkF2/AI4BcX7zenOsgX6B84JVAO0A9nBbXWWVTAdS7CMq8HVyW7T L83F/amhZCQjDsN++ X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.30rc1 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.2 at phobos.denx.de X-Virus-Status: Clean The UEFI spec requires support for the FAT file system. Signed-off-by: Heinrich Schuchardt --- lib/efi_loader/Kconfig | 2 ++ 1 file changed, 2 insertions(+) -- 2.25.1 diff --git a/lib/efi_loader/Kconfig b/lib/efi_loader/Kconfig index 9890144d41..e10ca05549 100644 --- a/lib/efi_loader/Kconfig +++ b/lib/efi_loader/Kconfig @@ -15,6 +15,8 @@ config EFI_LOADER select HAVE_BLOCK_DEVICE select REGEX imply CFB_CONSOLE_ANSI + imply FAT + imply FAT_WRITE imply USB_KEYBOARD_FN_KEYS imply VIDEO_ANSI help From patchwork Fri Mar 27 05:27:54 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 1262561 X-Patchwork-Delegate: xypron.glpk@gmx.de Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.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 Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.a=rsa-sha256 header.s=badeba3b8450 header.b=jATT860O; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 48pVmF4pyWz9sR4 for ; Fri, 27 Mar 2020 16:29:49 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 87304818BD; Fri, 27 Mar 2020 06:29:08 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.b="jATT860O"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 0A8AD8188C; Fri, 27 Mar 2020 06:28:37 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, FREEMAIL_FROM, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mout.gmx.net (mout.gmx.net [212.227.17.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 7992E81885 for ; Fri, 27 Mar 2020 06:28:25 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=xypron.glpk@gmx.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1585286896; bh=RKcR6qnwTDrNt/TEBnvQmwBBqBy+VceidrbMbWHDL9Q=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=jATT860OsiK0J5pLM8x8TqFJRLZjekTL76dYHC4nWhYbFnMMmndCm2RWbXn1wk3bZ eoIRkZz3ZynaTtLZJ6cYkemp72yYkZknPlOxykliaVX0XzyP7ic5zjdwvMjSe5dZO8 Moz+s82eCJ/oTW5UHn8oZZBgkIBwCJW3Ol/ROfqI= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from LT02.fritz.box ([84.119.33.226]) by mail.gmx.com (mrgmx105 [212.227.17.174]) with ESMTPSA (Nemesis) id 1McpNy-1jrJCs01IY-00Zt8P; Fri, 27 Mar 2020 06:28:16 +0100 From: Heinrich Schuchardt To: Alexander Graf , AKASHI Takahiro Cc: Ilias Apalodimas , Sughosh Ganu , Alexey Brodkin , Paul Emge , Faiz Abbas , Eugeniu Rosca , Urja Rannikko , Kever Yang , Simon Glass , Alistair Strachan , Ruslan Trofymenko , Igor Opaniuk , u-boot@lists.denx.de, Heinrich Schuchardt Subject: [PATCH 10/16] efi_loader: UEFI variable persistence Date: Fri, 27 Mar 2020 06:27:54 +0100 Message-Id: <20200327052800.11022-11-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200327052800.11022-1-xypron.glpk@gmx.de> References: <20200327052800.11022-1-xypron.glpk@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:iwOydalwsUHAHtqEONV1TtBg0wcw2DdYImp7DxpFTxM3WaDPHWS 6q5pCeeQSuWS+KB/AZdlYr0xy8GGu3BCSpv8r1lwwVxDI0fDa16FqXGPQpkBngTIvVoVe5H 2uRtrmyhI4IEEatBz5iEnE5dR5E93iJLl5vX5rD93iK1wSaKL/MqMHEP/E+2t1Oj/AfbniM CVnWzd8kgXkkc5HFVzuHQ== X-UI-Out-Filterresults: notjunk:1; V03:K0:R1voAgvbTLI=:u1tmjmGfSO3NIOon2Ms4lI ebhZ+Y3yUpPMv0TJ0uIY4ElFRX3hiXPZJ327ECfAN+X7MvkKbl+uKRlbEd8/aBfB09bNMCAlJ 1Vo7Yr+USX/EqSI3O49cNN+hhAAefbLWx0OBZNSv0JqjT+VD/YTCR1i9Rcqy/WwDYcpUCyOp8 mNOJKgyfdyQNPa7PSWC2VylvPdpDUVCMmPDxwgAK2dHvqI79g9lkggro1ke/1vpjqchs4Buvi LDBA9oy4uQFCz+HjzQzW80PR4oZiDzrmMKF2frmkuyISpZRd96PqBzB08Rd47oBlRn6DepPmU 29+cXmi0PByUCXG90Ig/5CseTRfBjemzcdE3KMqzD+w1xaSmPntrUh+4FZ3R5Jkf4+bNHNP9k JLGEEu8qg+hMnNHTrbp1cQ2vjMc6vTZRY44kd5mP5xKF7Blf11udy5cYLO4h3dvUD7qliHsMc b3Pxe1K8H9Rzn2QntsdVatsffMhlUXmyPp00g9Lo7YcYOH28J9ZEafnzxNDpewHTQNxh/BQJz 6Bt0pxMoxVuA88AvfLDL3aWlHb7NWjCWPPTX0/D6sViiY91rKxCwNhayFJjNVwYQ687w6p4wf 3kerwQqB8I60GRIZCo/rY0kI3F/S+CXxMLUcxifZFJqYm0ILQyO867MDWAEc/eZJ9PhPjLhG5 nrZqgaziQTAvcrQWYKees2orzXjKOAXDt15Mpc3dg5gF0mbdt/g8bIAm4KMH/nLpSRHrvPi4e GVVGFIbMPNrxc7viyuklDxI/WLcCkreP5kY+DrGGW/D+wwNUoihGHynXy1vlKuBbB8sqUMsPv /tF1fl9DS+kic1kk15E6XmmDxnb2rK9fU+ouUa+JNDZQaYrBwiV7wiXGmGq+MqIikz9w303Zu oojTDa9b+c4uWsQbJjeO7S+Gzm4qw9ilwAWiixc+oa2if61GtlCHU4c9MpORkBKADtq4HqkKa QhTgnT8xK7vC0FnCKTUKsZttn1VNlT9dTMKlMBGKquXzZroAhmckqKCbD+WFaNMlq1RiFufsy w3M6mGvARu2fGmLiC+VQbLeegV2aI10vI+FwVYELisOxckibm23GaSVGB5YuGT10wiExmNaPD X3mRmCOo+73stOSERdOba8bElrTxdDVc+we1aSCHkE9J4CmmLNS08IGYZ1VCo7yFP9l49w7e0 vqyamUfkN/+xlwZ1/lbI6qQWSSLK00P6x1jkKg1BnCavRIri0a8TGBLDClENHIcfgksFMnfEI QneaajBUBNTObhQup X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.30rc1 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.2 at phobos.denx.de X-Virus-Status: Clean Persist non-volatile UEFI variables in a file on the EFI system partition. The file is written: * whenever a non-volatile UEFI variable is changed after initialization of the UEFI sub-system. * upon ExitBootServices() The file is read during the UEFI sub-system initialization to restore non-volatile UEFI variables. Signed-off-by: Heinrich Schuchardt --- include/efi_variable.h | 36 +++++ lib/efi_loader/Kconfig | 8 + lib/efi_loader/Makefile | 1 + lib/efi_loader/efi_variable.c | 12 +- lib/efi_loader/efi_variables_file.c | 235 ++++++++++++++++++++++++++++ 5 files changed, 291 insertions(+), 1 deletion(-) create mode 100644 include/efi_variable.h create mode 100644 lib/efi_loader/efi_variables_file.c -- 2.25.1 diff --git a/include/efi_variable.h b/include/efi_variable.h new file mode 100644 index 0000000000..fb8294fc2e --- /dev/null +++ b/include/efi_variable.h @@ -0,0 +1,36 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * File interface for UEFI variables + * + * Copyright (c) 2020, Heinrich Schuchardt + */ + +#ifndef _EFI_VARIABLE_H +#define _EFI_VARIABLE_H + +#define EFI_VAR_FILE_NAME "ubootefi.var" + +#define EFI_VAR_BUF_SIZE 0x4000 + +#define EFI_VAR_FILE_MAGIC 0x7261566966456255 /* UbEfiVar */ + +struct efi_var_entry { + u32 length; + u32 attr; + efi_guid_t guid; + u16 name[0]; +}; + +struct efi_var_file { + u64 reserved; /* May be overwritten by memory probing */ + u64 magic; + u32 length; + u32 crc32; + struct efi_var_entry var[0]; +}; + +efi_status_t efi_var_to_file(void); + +efi_status_t efi_var_from_file(void); + +#endif diff --git a/lib/efi_loader/Kconfig b/lib/efi_loader/Kconfig index e10ca05549..41705fc252 100644 --- a/lib/efi_loader/Kconfig +++ b/lib/efi_loader/Kconfig @@ -27,6 +27,14 @@ config EFI_LOADER if EFI_LOADER +config EFI_VARIABLE_FILE_STORE + bool "Store non-volatile UEFI variables as file" + depends on FAT_WRITE + default y + help + Select tis option if you want non-volatile UEFI variables to be stored + as file /ubootefi.var on the EFI system partition. + config EFI_GET_TIME bool "GetTime() runtime service" depends on DM_RTC diff --git a/lib/efi_loader/Makefile b/lib/efi_loader/Makefile index 9b3b704473..621a767ab3 100644 --- a/lib/efi_loader/Makefile +++ b/lib/efi_loader/Makefile @@ -35,6 +35,7 @@ obj-y += efi_runtime.o obj-y += efi_setup.o obj-$(CONFIG_EFI_UNICODE_COLLATION_PROTOCOL2) += efi_unicode_collation.o obj-y += efi_variable.o +obj-y += efi_variables_file.o obj-y += efi_watchdog.o obj-$(CONFIG_LCD) += efi_gop.o obj-$(CONFIG_DM_VIDEO) += efi_gop.o diff --git a/lib/efi_loader/efi_variable.c b/lib/efi_loader/efi_variable.c index d99ad6ddae..952a0a0db7 100644 --- a/lib/efi_loader/efi_variable.c +++ b/lib/efi_loader/efi_variable.c @@ -7,6 +7,7 @@ #include #include +#include #include #include #include @@ -604,6 +605,11 @@ efi_status_t efi_set_variable_int(u16 *variable_name, if (env_set(native_name, val)) ret = EFI_DEVICE_ERROR; + /* Write non-volatile EFI variables to file */ + if (attributes && EFI_VARIABLE_NON_VOLATILE && + ret == EFI_SUCCESS && efi_obj_list_initialized == EFI_SUCCESS) + efi_var_to_file(); + out: free(native_name); free(val); @@ -694,6 +700,10 @@ efi_set_variable_runtime(u16 *variable_name, const efi_guid_t *vendor, */ void efi_variables_boot_exit_notify(void) { + /* Write non-volatile EFI variables to file */ + efi_var_to_file(); + + /* Switch variable services functions to runtime version */ efi_runtime_services.get_variable = efi_get_variable_runtime; efi_runtime_services.get_next_variable_name = efi_get_next_variable_name_runtime; @@ -708,5 +718,5 @@ void efi_variables_boot_exit_notify(void) */ efi_status_t efi_init_variables(void) { - return EFI_SUCCESS; + return efi_var_from_file(); } diff --git a/lib/efi_loader/efi_variables_file.c b/lib/efi_loader/efi_variables_file.c new file mode 100644 index 0000000000..4a918d3fde --- /dev/null +++ b/lib/efi_loader/efi_variables_file.c @@ -0,0 +1,235 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * File interface for UEFI variables + * + * Copyright (c) 2020, Heinrich Schuchardt + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define PART_STR_LEN 10 + +/** + * efi_set_blk_dev_to_system_partition() - select EFI system partition + * + * Set the EFI system partition as current block device. + * + * Return: status code + */ +static efi_status_t __maybe_unused efi_set_blk_dev_to_system_partition(void) +{ + char part_str[PART_STR_LEN]; + int r; + + if (!efi_system_partition.if_type) + return EFI_NOT_FOUND; + snprintf(part_str, PART_STR_LEN, "%u:%u", + efi_system_partition.devnum, efi_system_partition.part); + r = fs_set_blk_dev(blk_get_if_type_name(efi_system_partition.if_type), + part_str, FS_TYPE_ANY); + if (r) { + printf("Cannot read EFI system partition\n"); + return EFI_DEVICE_ERROR; + } + return EFI_SUCCESS; +} + +/** + * efi_var_collect() - collect non-volatile variables in buffer + * + * A buffer is allocated and filled with all non-volatile variables in a + * format ready to be written to disk. + * + * @bufp: pointer to pointer of buffer with collected variables + * @lenp: pointer to length of buffer + * Return: status code + */ +static efi_status_t __maybe_unused efi_var_collect(struct efi_var_file **bufp, + loff_t *lenp) +{ + size_t len = EFI_VAR_BUF_SIZE; + struct efi_var_file *buf; + struct efi_var_entry *var, *old_var; + size_t old_var_name_length = 2; + + *bufp = NULL; /* Avoid double free() */ + buf = calloc(1, len); + if (!buf) + return EFI_OUT_OF_RESOURCES; + var = buf->var; + old_var = var; + for (;;) { + efi_uintn_t data_length, var_name_length; + u8 *data; + efi_status_t ret; + + if ((uintptr_t)buf + len <= + (uintptr_t)var->name + old_var_name_length) + return EFI_BUFFER_TOO_SMALL; + + var_name_length = (uintptr_t)buf + len - (uintptr_t)var->name; + memcpy(var->name, old_var->name, old_var_name_length); + guidcpy(&var->guid, &old_var->guid); + ret = efi_get_next_variable_name_int( + &var_name_length, var->name, &var->guid); + if (ret == EFI_NOT_FOUND) + break; + if (ret != EFI_SUCCESS) { + free(buf); + return ret; + } + old_var_name_length = var_name_length; + old_var = var; + + data = (u8 *)var->name + old_var_name_length; + data_length = (uintptr_t)buf + len - (uintptr_t)data; + ret = efi_get_variable_int(var->name, &var->guid, + &var->attr, &data_length, data); + if (ret != EFI_SUCCESS) { + free(buf); + return ret; + } + if (!(var->attr & EFI_VARIABLE_NON_VOLATILE)) + continue; + var->length = data_length; + var = (struct efi_var_entry *) + ALIGN((uintptr_t)data + data_length, 8); + } + + buf->reserved = 0; + buf->magic = EFI_VAR_FILE_MAGIC; + len = (uintptr_t)var - (uintptr_t)buf; + buf->crc32 = crc32(0, (u8 *)buf->var, + len - sizeof(struct efi_var_file)); + buf->length = len; + *bufp = buf; + *lenp = len; + + return EFI_SUCCESS; +} + +/** + * efi_var_to_file() - save non-volatile variables as file + * + * File ubootefi.var is created on the EFI system partion. + * + * Return: status code + */ +efi_status_t efi_var_to_file(void) +{ +#ifdef CONFIG_EFI_VARIABLE_FILE_STORE + efi_status_t ret; + struct efi_var_file *buf; + loff_t len; + loff_t actlen; + int r; + + ret = efi_var_collect(&buf, &len); + if (ret != EFI_SUCCESS) + goto error; + + ret = efi_set_blk_dev_to_system_partition(); + if (ret != EFI_SUCCESS) + goto error; + + r = fs_write(EFI_VAR_FILE_NAME, map_to_sysmem(buf), 0, len, &actlen); + if (r || len != actlen) + ret = EFI_DEVICE_ERROR; + +error: + if (ret != EFI_SUCCESS) + printf("Failed to persist EFI variables\n"); + free(buf); + return ret; +#else + return EFI_SUCCESS; +#endif +} + +/** + * efi_var_restore() - restore EFI variables from buffer + * + * @buf: buffer + * Return: status code + */ +static efi_status_t __maybe_unused efi_var_restore(struct efi_var_file *buf) +{ + struct efi_var_entry *var, *last_var; + efi_status_t ret; + + if (buf->reserved || buf->magic != EFI_VAR_FILE_MAGIC || + buf->crc32 != crc32(0, (u8 *)buf->var, + buf->length - sizeof(struct efi_var_file))) { + printf("Invalid EFI variables file\n"); + return EFI_INVALID_PARAMETER; + } + + var = buf->var; + last_var = (struct efi_var_entry *)((u8 *)buf + buf->length); + while (var < last_var) { + u16 *data = var->name + u16_strlen(var->name) + 1; + + if (var->attr & EFI_VARIABLE_NON_VOLATILE && var->length) { + ret = efi_set_variable_int(var->name, &var->guid, + var->attr, var->length, + data); + if (ret != EFI_SUCCESS) + printf("Failed to set EFI variable %ls\n", + var->name); + } + var = (struct efi_var_entry *) + ALIGN((uintptr_t)data + var->length, 8); + } + return EFI_SUCCESS; +} + +/** + * efi_var_from_file() - read variables from file + * + * File ubootefi.var is read from the EFI system partitions and the variables + * stored in the file are created. + * + * In case the file does not exist yet or a variable cannot be set EFI_SUCCESS + * is returned + * + * Return: status code + */ +efi_status_t efi_var_from_file(void) +{ +#ifdef CONFIG_EFI_VARIABLE_FILE_STORE + struct efi_var_file *buf; + loff_t len; + efi_status_t ret; + int r; + + buf = calloc(1, EFI_VAR_BUF_SIZE); + if (!buf) { + printf("Out of memory\n"); + return EFI_OUT_OF_RESOURCES; + } + + ret = efi_set_blk_dev_to_system_partition(); + if (ret != EFI_SUCCESS) { + printf("No EFI system partition\n"); + goto error; + } + r = fs_read(EFI_VAR_FILE_NAME, map_to_sysmem(buf), 0, EFI_VAR_BUF_SIZE, + &len); + if (r || len < sizeof(struct efi_var_file)) { + printf("Failed to load EFI variables\n"); + goto error; + } + if (buf->length != len || efi_var_restore(buf) != EFI_SUCCESS) + printf("Invalid EFI variables file\n"); +error: + free(buf); +#endif + return EFI_SUCCESS; +} From patchwork Fri Mar 27 05:27:55 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 1262560 X-Patchwork-Delegate: xypron.glpk@gmx.de Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.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 Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.a=rsa-sha256 header.s=badeba3b8450 header.b=h2Pu8pRw; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 48pVm05B1wz9sR4 for ; Fri, 27 Mar 2020 16:29:36 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id E3ED4818AF; Fri, 27 Mar 2020 06:29:01 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.b="h2Pu8pRw"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 606DD818B7; Fri, 27 Mar 2020 06:28:35 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, FREEMAIL_FROM, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mout.gmx.net (mout.gmx.net [212.227.17.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id B21BF81883 for ; Fri, 27 Mar 2020 06:28:25 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=xypron.glpk@gmx.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1585286896; bh=Q2KP1ZFLyKPi7X0uFr5ac+xEOzHI2NTMpUw88aOQ9Ok=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=h2Pu8pRw9L8hSg6BxWaTJoV0aT21Fl82mSgTxjelWgtoInoUGFngv9bkGRWYlLrmW UYNk4Hz4SskvyL9abzEMcGXnRn5D0P13j74SbTVNzlmK6/WDpqba+buMa4s4DEFBu/ LzpGzQ7BGBIbhCFgFmLSgdA5U6h1/ZKRHiYtb2/g= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from LT02.fritz.box ([84.119.33.226]) by mail.gmx.com (mrgmx105 [212.227.17.174]) with ESMTPSA (Nemesis) id 1MvsEx-1jYOsZ2Q1n-00svxA; Fri, 27 Mar 2020 06:28:16 +0100 From: Heinrich Schuchardt To: Alexander Graf , AKASHI Takahiro Cc: Ilias Apalodimas , Sughosh Ganu , Alexey Brodkin , Paul Emge , Faiz Abbas , Eugeniu Rosca , Urja Rannikko , Kever Yang , Simon Glass , Alistair Strachan , Ruslan Trofymenko , Igor Opaniuk , u-boot@lists.denx.de, Heinrich Schuchardt Subject: [PATCH 11/16] efi_loader: export efi_convert_pointer() Date: Fri, 27 Mar 2020 06:27:55 +0100 Message-Id: <20200327052800.11022-12-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200327052800.11022-1-xypron.glpk@gmx.de> References: <20200327052800.11022-1-xypron.glpk@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:DyJ+7DWjlaHXS9y4V4gLKptayc2LrY/qedn5ElbLyTjdOQaqufJ ygBmyUogzIYLaBvXPR4n8ucboPQVfSiXCeWKzNmsPLsGR6YugTYsgRoNnAm8IqGNBQn9hml 3mjUynOu2AkP0rZ9l0AddcLdcPVLbTmsTQxAmoaid7SQBtlQAkzi5dsmdKph1UebMch7a3W ODjhe101uQdfR4N7b8Hsg== X-UI-Out-Filterresults: notjunk:1; V03:K0:GraB59zeqSw=:C8qMLfvN3nvG0UNyvsGWvY eOhptfkTgOsfhW4PC5aeI6/yJ5d0P+wPYd5ipJOm7LfOAbxdoEgRgOWGD93vOm55Cwe2iWJ/I AajxwKw4nkjAv3xvhISPmy7Ffiq7TNqvJxLhfTK+0uGl1iHr+OHXkUWP74dE8bym04yYzDviQ WXjfzUNbhs/fQKEBpP1G8Gvvfj/Ew9WkUPZz9QZEhulXRDBbe51CwCEHHY5pIzLWEiSW+D/5u EZpf0Zypi2R3TmIeh/GVXS1+KHRcTlBQGjQ3iyQEKpXFtmIu2uHIAZtFOkNNUbVFCjtU3yvQG L5s33GK50HVaBlNzIiD/T65b04ZeC01n0lsaqS97FCQwTxcsUY6lAdee2ZKqSRTPmEaK3mVfk YxPS7yLxcNMz6YEZ1/eycEfHMs5fJmMB8ZqrFxpx0I9I6JabcuaMF/ocrHSFZOZdPJcrCtA8n EhBjpb7Zr521zLh3LK94UrEWFKSrq2F9xV4rX+JOPnlPyxSg+20vXyXaFhcMR8oaqtx++VocH MNLLyxD9vknEY/29A6o2NcIXMWtqbynwFnCaAn4F9/lArYapBwZqpPoYhhuFx+ieHbX1Q9Jc1 f9SbvPTH3VSEfl8XthhlVvWYKKW9dWiBLCiRxOioGdPWymwYPGZM+ZZssgELWcMxKnXIruWdD ZI+WxfcVwovSiN8jQw0ioFfZU2HBG8WiJdUqDDI7VSITyQKNgSGYADbuLtoPnmGaEbB0yJ0Bi kCb5mjJrGPIra4Nt0QXh0QrWM4OFtDZRd7qls+Xa/QP+w/Vrfws7p5rrOlE0zyQYxB7I4VAw8 WUVHNC2oVF9GzpFzt15NfpGyWelXRj9MCzpvw5Z+TU449BSGBm/cYo/iJERHkNjkbP3lcC/kw BG3tfSrxGm1J9c90vnqCzliJHJJgS7j/f/lWyRoN3DG/Uehr2wcDtu+XkbsPGFWAAVbD9vkBt 3MCBTqAFy0HeuX5q0fxQTZy/WwI8oL+nTreFi0UsAnxfrpSuW1LwxoAGjGfoUnqSRrnO6zQWJ 7msHOZOz8n23EEOmpBXKHcCZEp2Y2RylPzJ7tfcPCfzWYz3xa0RXnzJkSuevePaL6Wuc0E76k LvZaUqK4cfDSXxlX5OOJlEW5dq8yGJQ5TwGWaIAZ09/crpRRhVveiGFX38wZe+7Y8h+07RTNk EJEjmw7+F48Sv7S8HXaYqFL6dO3MwD2g9alC4CBCQ4QU4ndqi2822muKOVH1GrKW23JirprMB nnH7BWaopYkWS7Q7k X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.30rc1 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.2 at phobos.denx.de X-Virus-Status: Clean We need ConvertPointer() to adjust pointers when implementing runtime services within U-Boot. After ExitBootServices() gd is not available anymore. So we should not use EFI_ENTRY() and EFI_EXIT(). Signed-off-by: Heinrich Schuchardt --- include/efi_loader.h | 3 +++ lib/efi_loader/efi_runtime.c | 8 +++----- 2 files changed, 6 insertions(+), 5 deletions(-) -- 2.25.1 diff --git a/include/efi_loader.h b/include/efi_loader.h index 510f39fe9e..d17a3c5ae1 100644 --- a/include/efi_loader.h +++ b/include/efi_loader.h @@ -374,6 +374,9 @@ efi_status_t efi_root_node_register(void); efi_status_t efi_initialize_system_table(void); /* efi_runtime_detach() - detach unimplemented runtime functions */ void efi_runtime_detach(void); +/* efi_convert_pointer() - convert pointer to virtual address */ +efi_status_t EFIAPI efi_convert_pointer(efi_uintn_t debug_disposition, + void **address); /* Called by bootefi to make console interface available */ efi_status_t efi_console_register(void); /* Called by bootefi to make all disk storage accessible as EFI objects */ diff --git a/lib/efi_loader/efi_runtime.c b/lib/efi_loader/efi_runtime.c index 6a25acbbcd..67fa693e41 100644 --- a/lib/efi_loader/efi_runtime.c +++ b/lib/efi_loader/efi_runtime.c @@ -495,15 +495,13 @@ static __efi_runtime efi_status_t EFIAPI efi_convert_pointer_runtime( * @address: pointer to be converted * Return: status code */ -static __efi_runtime efi_status_t EFIAPI efi_convert_pointer( - efi_uintn_t debug_disposition, void **address) +__efi_runtime efi_status_t EFIAPI +efi_convert_pointer(efi_uintn_t debug_disposition, void **address) { efi_physical_addr_t addr = (uintptr_t)*address; efi_uintn_t i; efi_status_t ret = EFI_NOT_FOUND; - EFI_ENTRY("%zu %p", debug_disposition, address); - if (!efi_virtmap) { ret = EFI_UNSUPPORTED; goto out; @@ -531,7 +529,7 @@ static __efi_runtime efi_status_t EFIAPI efi_convert_pointer( } out: - return EFI_EXIT(ret); + return ret; } static __efi_runtime void efi_relocate_runtime_table(ulong offset) From patchwork Fri Mar 27 05:27:56 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 1262564 X-Patchwork-Delegate: xypron.glpk@gmx.de Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.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 Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.a=rsa-sha256 header.s=badeba3b8450 header.b=ZB2PbekF; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 48pVmz1RYYz9sR4 for ; Fri, 27 Mar 2020 16:30:27 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 39437818BA; Fri, 27 Mar 2020 06:29:21 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.b="ZB2PbekF"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 9E4248188A; Fri, 27 Mar 2020 06:28:42 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, FREEMAIL_FROM, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mout.gmx.net (mout.gmx.net [212.227.17.20]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 672E0818A2 for ; Fri, 27 Mar 2020 06:28:27 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=xypron.glpk@gmx.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1585286897; bh=l2taOsZiSySQ6c+6MJhWwXXmDEkV5T1cxdWkrAI86Sw=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=ZB2PbekFfXu/rXHJ29YjOFsOrYTBdu/rEzydJdQyXII0WeFFSr/Zpy63yB97y6ZxQ +OTPLtfE7Zg+DVObpaPRVTMuGYWVYp/75FiJB5gN+o7Xt2IzRtVZPd7KnutUEHyxuS 1yyg26YEuvDCGVrom3rDGIIB4pQ1Sq6cCcQM1Y+Y= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from LT02.fritz.box ([84.119.33.226]) by mail.gmx.com (mrgmx105 [212.227.17.174]) with ESMTPSA (Nemesis) id 1MEV3C-1j2tQ30bdq-00G0nN; Fri, 27 Mar 2020 06:28:17 +0100 From: Heinrich Schuchardt To: Alexander Graf , AKASHI Takahiro Cc: Ilias Apalodimas , Sughosh Ganu , Alexey Brodkin , Paul Emge , Faiz Abbas , Eugeniu Rosca , Urja Rannikko , Kever Yang , Simon Glass , Alistair Strachan , Ruslan Trofymenko , Igor Opaniuk , u-boot@lists.denx.de, Heinrich Schuchardt Subject: [PATCH 12/16] efi_loader: optional pointer for ConvertPointer Date: Fri, 27 Mar 2020 06:27:56 +0100 Message-Id: <20200327052800.11022-13-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200327052800.11022-1-xypron.glpk@gmx.de> References: <20200327052800.11022-1-xypron.glpk@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:lCaVxyu71Bm2EEwRX3osymA6gqH+blxvAo1Dk3S2nwGA7oRJTDu d5QujPlOe2vlWeDgvrk4i9wP0ythY7Gd7GWbD3sATHpAe4Afza4j0XZe8V3JtyvBZNQsFOO rJWV/9oD1BiCwCD4e6b8ad+6qup5A6DHbeHhHpHH/hdgG1bec1IBmPgbNm1ls4DWYVByf5v jICzi6Rudkz3GdQp9qLpA== X-UI-Out-Filterresults: notjunk:1; V03:K0:Lh6OIj3H+sw=:D4LIMvtEeG/cD0X1UTN5Qo Tm8zIxaG445pm3a/ZpUTFtWYnOf2trlZjBSnfG+nhHM3VH4N/UgViQeW8+1Ni4JMb5gbrbjLt KKnqQ9c+zmDJkEfNfnxeCwPaTEnxmg1YXXAmGMGs6Ttkylx3iImHhnlC2n8JB8EG6PBIPI4sD fDqnCsOdWV99JtQYGD7Fpor5xkzfFZsUpvSjkXBlU3v1CiGYurStArbL/DBFHu5kncz77QO+i PEQeetvVBiBfNbB5OeSbzs2bV0gg6DAzmSK6/llhISziRarnfTh0If8xEkULFKqJ5whMT86Jk i7V+mQeDaY/Dmo4vcXI2puKsUUtSLcfHOE1tHXOwZ7uDUk+QIDZeFetETT34UYAg8ulp8QfX4 1MY4cUNqpknbJZdTclQuVH18nmNnxGCtVEcwgMAbUAPUV5LtZttyHLSkOY3O+Kusl/cn4YS4/ gTAFPK/JrN1BsmGf5YBIjIceuKAfHVnX7Q2zOR+uiEciZLK98oVSMIO4xxytFs1FSJo3+JPVa d2B9l5ylsZlV2Z1cNoS2oZ4SkEojdIKOUXQ8Oq1JyGXmQ4Fd9Yd5Fv6bwHuoFQSKd+cF/mqeg lNwu/J+/PCA1sXxAGaHPqW+HfW01KWFuFkL87F7w0rzh5uLR2h8H00NVoOLQQBHdNiJL57c5x PhWJ9oqmyetnK2sX6bPcvk8PdpCcZXnqFcLlnIKTTOSp6LyZ+Rl9waWRWi+6dW4vqIeO4qh7C kOhYb7uvXtZu5n7V2siBOiyaOysA57DgHSuKArdukAbQm24zAZCK8Ejt3QifgRDPcuGsZpIf/ DRaNoSVFlwoa1RDlB/OEZ1MYF31G065s1CsgkbcFY1n81ivMP1BcdHAIXDle2VESzSO0Tzo6K Lt5fzi1a8DVxDxcWBVHXifoxCLj1dnuImdBe4lqnb8b6NwKyVkDC9g1Ow40PEotCaSfXjIK5z rZJcyVQLO7Umg+3oStAV1l4CDFTvmOEZE3Dqcru3c7HPK3/JHfJeqYZFkWUuRsGih0dxqCqNk tC7Smkp9PHswJSPSr35eXfWzIYR47YSk2m+KjfTh5fUBGUugFbrH/V1hzRYooZuNp9/0SHjk5 s/x11CdgOyQ4Z+o+7XpWyisMy/CDbxskIZ9FoHbPbarrNyvZ2a9LlZXHotLEaxCb3DRGsPDee jFBTTxlLxlpcqnJI2DxptQLBgY5gQZDvZkrcfuV5e6k5ZW4Nfo5M1EyZ5nStKh3lMkfxb1xXL AMJGV76d/ssvufk6D X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.30rc1 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.2 at phobos.denx.de X-Virus-Status: Clean If the EFI_OPTIONAL_PTR is set in DebugDisposition, a NULL pointer does not constitute an invalid parameter. Signed-off-by: Heinrich Schuchardt --- include/efi_api.h | 2 ++ lib/efi_loader/efi_runtime.c | 6 ++++++ 2 files changed, 8 insertions(+) -- 2.25.1 diff --git a/include/efi_api.h b/include/efi_api.h index 1c40ffc4f5..c56703fc5e 100644 --- a/include/efi_api.h +++ b/include/efi_api.h @@ -250,6 +250,8 @@ struct efi_rt_properties_table { u32 runtime_services_supported; }; +#define EFI_OPTIONAL_PTR 0x00000001 + struct efi_runtime_services { struct efi_table_hdr hdr; efi_status_t (EFIAPI *get_time)(struct efi_time *time, diff --git a/lib/efi_loader/efi_runtime.c b/lib/efi_loader/efi_runtime.c index 67fa693e41..664a0422e2 100644 --- a/lib/efi_loader/efi_runtime.c +++ b/lib/efi_loader/efi_runtime.c @@ -511,6 +511,12 @@ efi_convert_pointer(efi_uintn_t debug_disposition, void **address) ret = EFI_INVALID_PARAMETER; goto out; } + if (!*address) { + if (debug_disposition & EFI_OPTIONAL_PTR) + return EFI_SUCCESS; + else + return EFI_INVALID_PARAMETER; + } for (i = 0; i < efi_descriptor_count; i++) { struct efi_mem_desc *map = (void *)efi_virtmap + From patchwork Fri Mar 27 05:27:57 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 1262565 X-Patchwork-Delegate: xypron.glpk@gmx.de Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=85.214.62.61; helo=phobos.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 Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.a=rsa-sha256 header.s=badeba3b8450 header.b=dR5SGn9R; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 48pVnB3v27z9sR4 for ; Fri, 27 Mar 2020 16:30:38 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 25DF7818F6; Fri, 27 Mar 2020 06:29:24 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.b="dR5SGn9R"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 703CF81885; Fri, 27 Mar 2020 06:28:46 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, FREEMAIL_FROM, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mout.gmx.net (mout.gmx.net [212.227.17.20]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id E5C5E81888 for ; Fri, 27 Mar 2020 06:28:27 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=xypron.glpk@gmx.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1585286898; bh=Xm60IRHsMnIaazbLH+/xTlhePDzjJWKauyPRePYDysI=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=dR5SGn9RFg4bPYr2cj6oOZiCT2nSlsgyV/2pM6ZB27+tMoKj4Un8cdAHE+gpR4YaT rvR6rj9X1HZNAtnNV0UMFVGmAPG+Er7Ue6n7ficAydvBU0EBfl2tIcwPOCvC4d6HVk ylQX9JkHYNNsOB70YDqphu3ZVOsiHuqnVj85DTHM= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from LT02.fritz.box ([84.119.33.226]) by mail.gmx.com (mrgmx105 [212.227.17.174]) with ESMTPSA (Nemesis) id 1Mlw3X-1jiGmY2xmd-00izoy; Fri, 27 Mar 2020 06:28:17 +0100 From: Heinrich Schuchardt To: Alexander Graf , AKASHI Takahiro Cc: Ilias Apalodimas , Sughosh Ganu , Alexey Brodkin , Paul Emge , Faiz Abbas , Eugeniu Rosca , Urja Rannikko , Kever Yang , Simon Glass , Alistair Strachan , Ruslan Trofymenko , Igor Opaniuk , u-boot@lists.denx.de, Heinrich Schuchardt Subject: [PATCH 13/16] efi_loader: memory buffer for variables Date: Fri, 27 Mar 2020 06:27:57 +0100 Message-Id: <20200327052800.11022-14-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200327052800.11022-1-xypron.glpk@gmx.de> References: <20200327052800.11022-1-xypron.glpk@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:7d/Tl2wqltYhhXq+j5mokS2H2ZxmLcL9CsVo806rxPhR/ghueyd jT0Z/2a/TwMi7XGe5HqMpjyyVSPhwoxPQv37o55tCT+69gtDnVVpUv1QtycM1MobwtQVqcF 4ukmB+4U94OmxtMLdVRs5UpUuo4q6C7BGmyIozgOn/oR1joYfQrvlbUHhK176iDKujeuij6 DQILI6vpzzwvjbmUsyMOQ== X-UI-Out-Filterresults: notjunk:1; V03:K0:Wh0B75hMCWI=:5bMLVCFeAlwZrVXgMByx29 7bs9h5MYv/0tMp5Ue0sbbLayEwitISZTuM8M4+mRohGGTUGWFnDH0YAKJJ228WMPDfWbh1n39 6JCQbjGh665Ne7JSrOVntTT6t9uvA//c5qVJRA6BzlaD49bW5GiqR7T1e5I92MgdSgzetv8fV 1I9z2/+18whrDdxLzYW/7FJlczOIwCMW0a4Hh1XTm3PTCVXpAjK9N2+mKnA7VpCAs+BbVdGU8 CLl9bwb6qGO+GNaRhJfit1jsDxsXZXfli1RkRJODkzBxFKgIOmR55zHtHlqLXNwqjEM5MkZG8 1UkpHVHKgUIqOJBMJAbH5oksGrjrbrC5HpvrKdzNHuEQ3tmmO8QJzll0VZg9aRRuFYYHyJgGG FR33ALacmH89tA+ekwOexLbOmZVawfY7XRnviwSlQ2xxV8cYlTx7T1F9keoO+GXgozQbi0ufV SApqxdivoy/YIVWX76ZMaKkuMKjvxrnQ8FADnqjnmugjvdHfoWDk3FmtXvqdpr9CA9Vn43kzp Lm0I844QBBmMwm+e4E2uT2l3HWU8N8I1uxyodBnlIzG9Mt7RUGvwFaauwBYfP9CleRZA39Pi6 QkZzAh8C2Kh2SRJfSS+Ey8FFu5GplzSVR0PTAMs5fbbOL2e5zwce+9LrUXRwI6Yf2YkKXV1Pb cBJnv48Gg2liV9ejVUJVh2CFXdgRjoNIlPne6crd71CRi4hnS6Tn79u+s80s0OGGmRf5yhU9o QvI4XkDG3djdwKy7cZygCmYs2BBJ5pSH96zbALlOvB/Jy6mZo+jQCjHo2iTGYymrYvogXLf++ KwoAp1Yl2hl6bWaSxZJ4ftWjIqWa4ln12LomvNigwKJIj2hEgW6oI/JGg7AeZWFC28s3UA2O0 47MXHUwcNhCdUFhX0Ny2/Qg1Ns0mv7Pl5owQsjB81CQvvPnaPYt5wwEUGu4nAJqyXe9nvS+7M Rt4UbRV3dVi9LugpmlWC+Gafmrt+Eib6k1bvA3PcM9avRkhcuPzFxMRBYp8Iz/qWlBillrnh6 erUt7MuN/Ee5Y4PR01o7ZZDgwx45MmAd+ogs9WBcZ/uPTmudRDyZpYVhSLg5daVsDPgUYUHC8 VKXaaiKUGCYtkopi954iIrmxt+HgP0H7Ga5cUgtj3xSHieayGqHR3Dpl+gIbtVQXYKp4D6CcY KuQnr9692pQmTTcqui/heXWhjKzbLWh8Vrvc2oefA9F7PcEnofJXDKKzQXW7dfuZnIssh8xnj XCfweGcJQUJd0qPrl X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.30rc1 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.2 at phobos.denx.de X-Virus-Status: Clean Saving UEFI variable as encoded U-Boot environment variables does not allow support at runtime. Provide functions to manage a memory buffer with UEFI variables. Signed-off-by: Heinrich Schuchardt --- include/efi_variable.h | 16 ++ lib/efi_loader/Makefile | 1 + lib/efi_loader/efi_variables_mem.c | 317 +++++++++++++++++++++++++++++ 3 files changed, 334 insertions(+) create mode 100644 lib/efi_loader/efi_variables_mem.c -- 2.25.1 diff --git a/include/efi_variable.h b/include/efi_variable.h index fb8294fc2e..037d268085 100644 --- a/include/efi_variable.h +++ b/include/efi_variable.h @@ -33,4 +33,20 @@ efi_status_t efi_var_to_file(void); efi_status_t efi_var_from_file(void); +void efi_var_mem_memcpy(void *dest, const void *src, size_t n); + +efi_status_t efi_var_mem_init(void); + +struct efi_var_entry *efi_var_mem_find(const efi_guid_t *guid, const u16 *name, + struct efi_var_entry **next); + +void efi_var_mem_del(struct efi_var_entry *var); + +efi_status_t efi_var_mem_ins(u16 *variable_name, + const efi_guid_t *vendor, u32 attributes, + const efi_uintn_t size1, const void *data1, + const efi_uintn_t size2, const void *data2); + +u64 efi_var_mem_free(void); + #endif diff --git a/lib/efi_loader/Makefile b/lib/efi_loader/Makefile index 621a767ab3..14b210e189 100644 --- a/lib/efi_loader/Makefile +++ b/lib/efi_loader/Makefile @@ -36,6 +36,7 @@ obj-y += efi_setup.o obj-$(CONFIG_EFI_UNICODE_COLLATION_PROTOCOL2) += efi_unicode_collation.o obj-y += efi_variable.o obj-y += efi_variables_file.o +obj-y += efi_variables_mem.o obj-y += efi_watchdog.o obj-$(CONFIG_LCD) += efi_gop.o obj-$(CONFIG_DM_VIDEO) += efi_gop.o diff --git a/lib/efi_loader/efi_variables_mem.c b/lib/efi_loader/efi_variables_mem.c new file mode 100644 index 0000000000..f70cc65f8b --- /dev/null +++ b/lib/efi_loader/efi_variables_mem.c @@ -0,0 +1,317 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * File interface for UEFI variables + * + * Copyright (c) 2020, Heinrich Schuchardt + */ + +#include +#include +#include +#include + +static struct efi_var_file __efi_runtime_data *efi_var_buf; +static struct efi_var_entry __efi_runtime_data *efi_current_var; + +/** + * memcpy() - copy memory area + * + * At runtime memcpy() is not available. + * + * @dest: destination buffer + * @src: source buffer + * @n: number of bytes to copy + * Return: pointer to destination buffer + */ +void __efi_runtime efi_var_mem_memcpy(void *dest, const void *src, size_t n) +{ + u8 *d = dest; + const u8 *s = src; + + for (; n; --n) + *d++ = *s++; +} + +/** + * efi_var_mem_compare() - compare GUID and name with a variable + * + * @var: variable to compare + * @guid: GUID to compare + * @name: variable name to compare + * @next: pointer to next variable + * Return: true if match + */ +static bool __efi_runtime +efi_var_mem_compare(struct efi_var_entry *var, const efi_guid_t *guid, + const u16 *name, struct efi_var_entry **next) +{ + int i; + u8 *guid1, *guid2; + const u16 *data, *var_name; + bool match = true; + + for (guid1 = (u8 *)&var->guid, guid2 = (u8 *)guid, i = 0; + i < sizeof(efi_guid_t) && match; ++i) + match = (guid1[i] == guid2[i]); + + for (data = var->name, var_name = name;; ++data, ++var_name) { + if (match) + match = (*data == *var_name); + if (!*data) + break; + } + + ++data; + + if (next) + *next = (struct efi_var_entry *) + ALIGN((uintptr_t)data + var->length, 8); + + return match; +} + +/** + * efi_var_mem_find() - find a variable in the list + * + * @guid: GUID of the variable + * @name: name of the variable + * @next: on exit pointer to the next variable after the found one + * Return: found variable + */ +struct efi_var_entry __efi_runtime +*efi_var_mem_find(const efi_guid_t *guid, const u16 *name, + struct efi_var_entry **next) +{ + struct efi_var_entry *var, *last; + + last = (struct efi_var_entry *) + ((uintptr_t)efi_var_buf + efi_var_buf->length); + + if (!*name) { + if (next) { + *next = efi_var_buf->var; + if (*next >= last) + *next = NULL; + } + return NULL; + } + if (efi_current_var && + efi_var_mem_compare(efi_current_var, guid, name, next)) { + if (next && *next >= last) + *next = NULL; + return efi_current_var; + } + + var = efi_var_buf->var; + if (var < last) { + for (; var;) { + struct efi_var_entry *pos; + bool match; + + match = efi_var_mem_compare(var, guid, name, &pos); + if (pos >= last) + pos = NULL; + if (match) { + if (next) + *next = pos; + return var; + } + var = pos; + } + } + if (next) + *next = NULL; + return NULL; +} + +/** + * efi_var_mem_del() - delete a variable from the list of variables + * + * @var: variable to delete + */ +void __efi_runtime efi_var_mem_del(struct efi_var_entry *var) +{ + u16 *data = var->name; + struct efi_var_entry *next, *last; + u64 *from, *to; + + if (!var) + return; + + last = (struct efi_var_entry *) + ((uintptr_t)efi_var_buf + efi_var_buf->length); + if (var < efi_current_var) + efi_current_var = NULL; + + for (data = var->name; *data; ++data) + ; + ++data; + next = (struct efi_var_entry *) + ALIGN((uintptr_t)data + var->length, 8); + efi_var_buf->length -= (uintptr_t)next - (uintptr_t)var; + + for (to = (u64 *)var, from = (u64 *)next; from < (u64 *)last; + ++to, ++from) + *to = *from; + efi_var_buf->crc32 = crc32(0, (u8 *)efi_var_buf->var, + efi_var_buf->length - + sizeof(struct efi_var_file)); +} + +/** + * efi_var_mem_ins() - append a variable to the list of variables + * + * The variable is appended without checking if a variable of the same name + * already exists. The two data buffers are concatenated. + * + * @name: variable name + * @vendor: GUID + * @attributes: variable attributes + * @size1: size of the first data buffer + * @data1: first data buffer + * @size2: size of the second data field + * @data2: second data buffer + * Result: status code + */ +efi_status_t __efi_runtime efi_var_mem_ins( + u16 *variable_name, + const efi_guid_t *vendor, u32 attributes, + const efi_uintn_t size1, const void *data1, + const efi_uintn_t size2, const void *data2) +{ + u16 *data; + struct efi_var_entry *var; + u32 var_name_len; + + var = (struct efi_var_entry *) + ((uintptr_t)efi_var_buf + efi_var_buf->length); + for (var_name_len = 0; variable_name[var_name_len]; ++var_name_len) + ; + ++var_name_len; + data = var->name + var_name_len; + + if ((uintptr_t)data - (uintptr_t)efi_var_buf + size1 + size2 > + EFI_VAR_BUF_SIZE) + return EFI_OUT_OF_RESOURCES; + + var->attr = attributes; + var->length = size1 + size2; + + efi_var_mem_memcpy(&var->guid, vendor, sizeof(efi_guid_t)); + efi_var_mem_memcpy(var->name, variable_name, + sizeof(u16) * var_name_len); + efi_var_mem_memcpy(data, data1, size1); + efi_var_mem_memcpy((u8 *)data + size1, data2, size2); + + var = (struct efi_var_entry *) + ALIGN((uintptr_t)data + var->length, 8); + efi_var_buf->length = (uintptr_t)var - (uintptr_t)efi_var_buf; + efi_var_buf->crc32 = crc32(0, (u8 *)efi_var_buf->var, + efi_var_buf->length - + sizeof(struct efi_var_file)); + + return EFI_SUCCESS; +} + +/** + * efi_var_mem_free() - determine free memory for variables + * + * Return: maximum data size plus variable name size + */ +u64 __efi_runtime efi_var_mem_free(void) +{ + return EFI_VAR_BUF_SIZE - efi_var_buf->length - + sizeof(struct efi_var_entry); +} + +/** + * efi_var_mem_bs_del() - delete boot service only variables + */ +static void efi_var_mem_bs_del(void) +{ + struct efi_var_entry *var = efi_var_buf->var; + + for (;;) { + struct efi_var_entry *last; + + last = (struct efi_var_entry *) + ((uintptr_t)efi_var_buf + efi_var_buf->length); + if (var >= last) + break; + if (var->attr & EFI_VARIABLE_RUNTIME_ACCESS) { + u16 *data; + + /* skip variable */ + for (data = var->name; *data; ++data) + ; + ++data; + var = (struct efi_var_entry *) + ALIGN((uintptr_t)data + var->length, 8); + } else { + /* delete variable */ + efi_var_mem_del(var); + } + } +} + +/** + * efi_var_mem_notify_exit_boot_services() - ExitBootService callback + * + * @event: callback event + * @context: callback context + */ +static void EFIAPI __efi_runtime +efi_var_mem_notify_exit_boot_services(struct efi_event *event, void *context) +{ + /* Delete boot service only variables */ + efi_var_mem_bs_del(); +} + +/** + * efi_var_mem_notify_exit_boot_services() - SetVirtualMemoryMap callback + * + * @event: callback event + * @context: callback context + */ +static void EFIAPI __efi_runtime +efi_var_mem_notify_virtual_address_map(struct efi_event *event, void *context) +{ + efi_convert_pointer(0, (void **)&efi_var_buf); +} + +/** + * efi_var_mem_init() - set-up variable list + * + * Return: status code + */ +efi_status_t efi_var_mem_init(void) +{ + u64 memory; + efi_status_t ret; + struct efi_event *event; + + ret = efi_allocate_pages(EFI_ALLOCATE_ANY_PAGES, + EFI_RUNTIME_SERVICES_DATA, + efi_size_in_pages(EFI_VAR_BUF_SIZE), + &memory); + if (ret != EFI_SUCCESS) + return ret; + efi_var_buf = (struct efi_var_file *)(uintptr_t)memory; + memset(efi_var_buf, 0, EFI_VAR_BUF_SIZE); + efi_var_buf->magic = EFI_VAR_FILE_MAGIC; + efi_var_buf->length = (uintptr_t)efi_var_buf->var - + (uintptr_t)efi_var_buf; + /* crc32 for 0 bytes = 0 */ + + ret = efi_create_event(EVT_SIGNAL_EXIT_BOOT_SERVICES, TPL_CALLBACK, + efi_var_mem_notify_exit_boot_services, NULL, + NULL, &event); + if (ret != EFI_SUCCESS) + return ret; + ret = efi_create_event(EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE, TPL_CALLBACK, + efi_var_mem_notify_virtual_address_map, NULL, + NULL, &event); + if (ret != EFI_SUCCESS) + return ret; + return ret; +} From patchwork Fri Mar 27 05:27:58 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 1262569 X-Patchwork-Delegate: xypron.glpk@gmx.de Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=85.214.62.61; helo=phobos.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 Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.a=rsa-sha256 header.s=badeba3b8450 header.b=SePQeE7o; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 48pVp34Xhvz9sRR for ; Fri, 27 Mar 2020 16:31:23 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 16BAB8190D; Fri, 27 Mar 2020 06:29:40 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.b="SePQeE7o"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 67B5881885; Fri, 27 Mar 2020 06:28:56 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,FREEMAIL_FROM,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mout.gmx.net (mout.gmx.net [212.227.17.21]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id CE350818AA for ; Fri, 27 Mar 2020 06:28:28 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=xypron.glpk@gmx.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1585286898; bh=ukiFedVbmhPFcgvdXVHTPor9Zj+rX8hh1yk6ujVabUA=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=SePQeE7o8P/ESCtScGv7iQKIX/5w1XcscAUTTaO5q6wZUo7bez/YF/4Vu+i90BIXF 7VnXuEWGU+Bc0REUI2Bnae9nBOGOOPHPVqzdOKSg+g+IeNwK11F/yjQD1d6vxcK2Xv WxfQAzTHJh1eWybuD5miIQoGNNCyqCzniN1GE1po= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from LT02.fritz.box ([84.119.33.226]) by mail.gmx.com (mrgmx105 [212.227.17.174]) with ESMTPSA (Nemesis) id 1N33ET-1jMsYB177d-013QLi; Fri, 27 Mar 2020 06:28:18 +0100 From: Heinrich Schuchardt To: Alexander Graf , AKASHI Takahiro Cc: Ilias Apalodimas , Sughosh Ganu , Alexey Brodkin , Paul Emge , Faiz Abbas , Eugeniu Rosca , Urja Rannikko , Kever Yang , Simon Glass , Alistair Strachan , Ruslan Trofymenko , Igor Opaniuk , u-boot@lists.denx.de, Heinrich Schuchardt Subject: [PATCH 14/16] efi_loader: use memory based variable storage Date: Fri, 27 Mar 2020 06:27:58 +0100 Message-Id: <20200327052800.11022-15-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200327052800.11022-1-xypron.glpk@gmx.de> References: <20200327052800.11022-1-xypron.glpk@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:cR4J1Egf/rQ0NEEbGXSuYWAkD6yw4C/BwjXAtUbJtyb/3HbvcY4 dBoDqA0J+vL6cFuumr3E75mjQNi42Ey0UmYRlcRyWgEnzBrIBZuF+a7P/iLz5VbbBeumCLg UVNhgqGNxIqTgB88tiAM4oUluiWGmWVZxrQCUrgN8iSiQk9CxxpjB1jRvwr0qVs9y+wCpc3 6xpN1FR5NRL8n3kB0KlWQ== X-UI-Out-Filterresults: notjunk:1; V03:K0:2TQDoGN12wM=:mz9B8DofSpcH4FpOK49pkR nflGe0XuBhs6HbmV+boQiIO/+fivi5zH3/TGz3rRAElK4fPGBBbEHfn2qeRb/khD9e1n+vN6m oz86JB+n+kYxRJnsyYDJa/bcbnlxBla7T9rWYbGvx+fF05VOTlGi3YiYGu7bzkQKqnTXjSjrZ CRMJJUKpi2tsKX9pX29/m3s8Ikvuu+XKV2qCuWQv8ONw3hHeTIcZvFGP8WS0RPjdbWzQQWElw N60UPhshZ6SIZd+saNedx9J5IVYLvqaiuRSavCLQ73tCppIdpZkfN1o5ekjg9NpQgq156pYIb 1urOBLO6HcMFz4EuzRADc4JRAobakWJFrpApGEKwyyTBW90oTcrdDm0pCEQZUUMJipdTduL80 mfj4HkKV3MMQ+Reuz8crSBO5GNOQHmf07E6aq4YEUafqjsGnU1PRclG2m0F2qRhWZLiARPuRg OogwG3Dgrrh4ze4rsZvb+wfyu9SbTltWYhgVCbZTrJGNN1haEu80bp1YqSRPCOu8F7BK7Blj3 PHxh4cksZ9wLSewoPsE+371A+DVBHg0cDwoqVljCjfBkKM9k+IGc9Msr7W8WJjGrN6bulfR5h E5pFmIdI56yrJj6CCERmvIIWQ1qn5JbykYL861fn7gJc2Si+EGpH9hwzDlASylf//Ieot32aT rL65FAKOnsL+scGdS2jPLuWrp3vvwB5ILc+9EtLDi/59YeyC4pBGhg4zU5EJKw4TdKYUMI1Ax tW38n2+0EHG4ksc+PLjnLza6Av1TU6HC8XNk3ctE7gX9A1dVJ075U3txdkIMw8MMJT5xOmaw/ f4OvdZa9V9+WOC9L0jRZyPctFHhu9gFT1SVY2PrzDIvkok7bsrd5bpWCaUnon6oYT5noCWN/G oBZca4YHArwc3JAMhwnCs6KraVr/xk0OE5Njtk3rhHndLGSgj7lxWNeSDn0uUedO4o3yCvZZF L2Jo5gUm1ftqXl0yg299Ly0HVBMZvIorG7OXEcqZsV0FtUCC/PeLxg5yiR7mMZ5hdThgAIi54 YLsZIfXmmMYTEX0W2mvPjDVWlY5pZhN7xli1UpjcKTHYSy1YLIuG+z3quY3QyrBzMWyNouJ8k 0Rehyt55PYZdOePG6rMmZI0k7+cnwKpTc29dx9fKHrCEWl+Vfy7Z2eMNxOfu4iTrr4ucqrj4i 8hAvf2oereYYGimFYyabjU76RmQ8TVEbpWKpfbwnNDx/O/B9kjIkEnMj2mtXnjLDY9nbNSUJ4 WhqRRUdBW6qowkeoE X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.30rc1 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.2 at phobos.denx.de X-Virus-Status: Clean Saving UEFI variable as encoded U-Boot environment variables does not allow implement run-time support. Use a memory buffer for storing UEFI variables. Signed-off-by: Heinrich Schuchardt --- lib/efi_loader/efi_variable.c | 584 +++++++---------------------- lib/efi_loader/efi_variables_mem.c | 7 + 2 files changed, 147 insertions(+), 444 deletions(-) -- 2.25.1 diff --git a/lib/efi_loader/efi_variable.c b/lib/efi_loader/efi_variable.c index 952a0a0db7..7c39542968 100644 --- a/lib/efi_loader/efi_variable.c +++ b/lib/efi_loader/efi_variable.c @@ -2,152 +2,15 @@ /* * UEFI runtime variable services * - * Copyright (c) 2017 Rob Clark + * Copyright (c) 2019 Heinrich Schuchardt */ #include #include #include -#include -#include -#include -#include -#include #define READ_ONLY BIT(31) -/* - * Mapping between EFI variables and u-boot variables: - * - * efi_$guid_$varname = {attributes}(type)value - * - * For example: - * - * efi_8be4df61-93ca-11d2-aa0d-00e098032b8c_OsIndicationsSupported= - * "{ro,boot,run}(blob)0000000000000000" - * efi_8be4df61-93ca-11d2-aa0d-00e098032b8c_BootOrder= - * "(blob)00010000" - * - * The attributes are a comma separated list of these possible - * attributes: - * - * + ro - read-only - * + boot - boot-services access - * + run - runtime access - * - * NOTE: with current implementation, no variables are available after - * ExitBootServices, and all are persisted (if possible). - * - * If not specified, the attributes default to "{boot}". - * - * The required type is one of: - * - * + utf8 - raw utf8 string - * + blob - arbitrary length hex string - * - * Maybe a utf16 type would be useful to for a string value to be auto - * converted to utf16? - */ - -#define PREFIX_LEN (strlen("efi_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx_")) - -/** - * efi_to_native() - convert the UEFI variable name and vendor GUID to U-Boot - * variable name - * - * The U-Boot variable name is a concatenation of prefix 'efi', the hexstring - * encoded vendor GUID, and the UTF-8 encoded UEFI variable name separated by - * underscores, e.g. 'efi_8be4df61-93ca-11d2-aa0d-00e098032b8c_BootOrder'. - * - * @native: pointer to pointer to U-Boot variable name - * @variable_name: UEFI variable name - * @vendor: vendor GUID - * Return: status code - */ -static efi_status_t efi_to_native(char **native, const u16 *variable_name, - const efi_guid_t *vendor) -{ - size_t len; - char *pos; - - len = PREFIX_LEN + utf16_utf8_strlen(variable_name) + 1; - *native = malloc(len); - if (!*native) - return EFI_OUT_OF_RESOURCES; - - pos = *native; - pos += sprintf(pos, "efi_%pUl_", vendor); - utf16_utf8_strcpy(&pos, variable_name); - - return EFI_SUCCESS; -} - -/** - * prefix() - skip over prefix - * - * Skip over a prefix string. - * - * @str: string with prefix - * @prefix: prefix string - * Return: string without prefix, or NULL if prefix not found - */ -static const char *prefix(const char *str, const char *prefix) -{ - size_t n = strlen(prefix); - if (!strncmp(prefix, str, n)) - return str + n; - return NULL; -} - -/** - * parse_attr() - decode attributes part of variable value - * - * Convert the string encoded attributes of a UEFI variable to a bit mask. - * TODO: Several attributes are not supported. - * - * @str: value of U-Boot variable - * @attrp: pointer to UEFI attributes - * Return: pointer to remainder of U-Boot variable value - */ -static const char *parse_attr(const char *str, u32 *attrp) -{ - u32 attr = 0; - char sep = '{'; - - if (*str != '{') { - *attrp = EFI_VARIABLE_BOOTSERVICE_ACCESS; - return str; - } - - while (*str == sep) { - const char *s; - - str++; - - if ((s = prefix(str, "ro"))) { - attr |= READ_ONLY; - } else if ((s = prefix(str, "nv"))) { - attr |= EFI_VARIABLE_NON_VOLATILE; - } else if ((s = prefix(str, "boot"))) { - attr |= EFI_VARIABLE_BOOTSERVICE_ACCESS; - } else if ((s = prefix(str, "run"))) { - attr |= EFI_VARIABLE_RUNTIME_ACCESS; - } else { - printf("invalid attribute: %s\n", str); - break; - } - - str = s; - sep = ','; - } - - str++; - - *attrp = attr; - - return str; -} - /** * efi_get_variable() - retrieve value of a UEFI variable * @@ -167,11 +30,18 @@ efi_status_t EFIAPI efi_get_variable(u16 *variable_name, const efi_guid_t *vendor, u32 *attributes, efi_uintn_t *data_size, void *data) { + efi_status_t ret; + EFI_ENTRY("\"%ls\" %pUl %p %p %p", variable_name, vendor, attributes, data_size, data); - return EFI_EXIT(efi_get_variable_int(variable_name, vendor, attributes, - data_size, data)); + ret = efi_get_variable_int(variable_name, vendor, attributes, data_size, + data); + /* Remove read-only bit */ + if (attributes) + *attributes &= EFI_VARIABLE_MASK; + + return EFI_EXIT(ret); } /** @@ -187,152 +57,37 @@ efi_status_t EFIAPI efi_get_variable(u16 *variable_name, * @data: buffer to which the variable value is copied * Return: status code */ -efi_status_t efi_get_variable_int(u16 *variable_name, - const efi_guid_t *vendor, u32 *attributes, - efi_uintn_t *data_size, void *data) +efi_status_t __efi_runtime +efi_get_variable_int(u16 *variable_name, const efi_guid_t *vendor, + u32 *attributes, efi_uintn_t *data_size, void *data) { - char *native_name; - efi_status_t ret; - unsigned long in_size; - const char *val, *s; - u32 attr; - + efi_uintn_t old_size; + struct efi_var_entry *var; + u16 *pdata; if (!variable_name || !vendor || !data_size) return EFI_INVALID_PARAMETER; - ret = efi_to_native(&native_name, variable_name, vendor); - if (ret) - return ret; - - EFI_PRINT("get '%s'\n", native_name); - - val = env_get(native_name); - free(native_name); - if (!val) + var = efi_var_mem_find(vendor, variable_name, NULL); + if (!var) return EFI_NOT_FOUND; - val = parse_attr(val, &attr); - - in_size = *data_size; - - if ((s = prefix(val, "(blob)"))) { - size_t len = strlen(s); - - /* number of hexadecimal digits must be even */ - if (len & 1) - return EFI_DEVICE_ERROR; - - /* two characters per byte: */ - len /= 2; - *data_size = len; - - if (in_size < len) { - ret = EFI_BUFFER_TOO_SMALL; - goto out; - } - - if (!data) - return EFI_INVALID_PARAMETER; - - if (hex2bin(data, s, len)) - return EFI_DEVICE_ERROR; - - EFI_PRINT("got value: \"%s\"\n", s); - } else if ((s = prefix(val, "(utf8)"))) { - unsigned len = strlen(s) + 1; - - *data_size = len; - - if (in_size < len) { - ret = EFI_BUFFER_TOO_SMALL; - goto out; - } - - if (!data) - return EFI_INVALID_PARAMETER; - - memcpy(data, s, len); - ((char *)data)[len] = '\0'; - - EFI_PRINT("got value: \"%s\"\n", (char *)data); - } else { - EFI_PRINT("invalid value: '%s'\n", val); - return EFI_DEVICE_ERROR; - } - -out: if (attributes) - *attributes = attr & EFI_VARIABLE_MASK; + *attributes = var->attr; - return ret; -} - -static char *efi_variables_list; -static char *efi_cur_variable; - -/** - * parse_uboot_variable() - parse a u-boot variable and get uefi-related - * information - * @variable: whole data of u-boot variable (ie. name=value) - * @variable_name_size: size of variable_name buffer in byte - * @variable_name: name of uefi variable in u16, null-terminated - * @vendor: vendor's guid - * @attributes: attributes - * - * A uefi variable is encoded into a u-boot variable as described above. - * This function parses such a u-boot variable and retrieve uefi-related - * information into respective parameters. In return, variable_name_size - * is the size of variable name including NULL. - * - * Return: EFI_SUCCESS if parsing is OK, EFI_NOT_FOUND when - * the entire variable list has been returned, - * otherwise non-zero status code - */ -static efi_status_t parse_uboot_variable(char *variable, - efi_uintn_t *variable_name_size, - u16 *variable_name, - const efi_guid_t *vendor, - u32 *attributes) -{ - char *guid, *name, *end, c; - size_t name_len; - efi_uintn_t old_variable_name_size; - u16 *p; - - guid = strchr(variable, '_'); - if (!guid) - return EFI_INVALID_PARAMETER; - guid++; - name = strchr(guid, '_'); - if (!name) - return EFI_INVALID_PARAMETER; - name++; - end = strchr(name, '='); - if (!end) - return EFI_INVALID_PARAMETER; - - name_len = end - name; - old_variable_name_size = *variable_name_size; - *variable_name_size = sizeof(u16) * (name_len + 1); - if (old_variable_name_size < *variable_name_size) + old_size = *data_size; + *data_size = var->length; + if (old_size < var->length) return EFI_BUFFER_TOO_SMALL; - end++; /* point to value */ - - /* variable name */ - p = variable_name; - utf8_utf16_strncpy(&p, name, name_len); - variable_name[name_len] = 0; + if (!data) + return EFI_INVALID_PARAMETER; - /* guid */ - c = *(name - 1); - *(name - 1) = '\0'; /* guid need be null-terminated here */ - uuid_str_to_bin(guid, (unsigned char *)vendor, UUID_STR_FORMAT_GUID); - *(name - 1) = c; + for (pdata = var->name; *pdata; ++pdata) + ; + ++pdata; - /* attributes */ - parse_attr(end, attributes); + efi_var_mem_memcpy(data, pdata, var->length); return EFI_SUCCESS; } @@ -378,78 +133,38 @@ efi_status_t EFIAPI efi_get_next_variable_name(efi_uintn_t *variable_name_size, * * Return: status code */ -efi_status_t efi_get_next_variable_name_int(efi_uintn_t *variable_name_size, - u16 *variable_name, - efi_guid_t *vendor) +efi_status_t __efi_runtime +efi_get_next_variable_name_int(efi_uintn_t *variable_name_size, + u16 *variable_name, efi_guid_t *vendor) { - char *native_name, *variable; - ssize_t name_len, list_len; - char regex[256]; - char * const regexlist[] = {regex}; - u32 attributes; - int i; - efi_status_t ret; + struct efi_var_entry *var; + efi_uintn_t old_size; + u16 *pdata; if (!variable_name_size || !variable_name || !vendor) return EFI_INVALID_PARAMETER; - if (variable_name[0]) { - /* check null-terminated string */ - for (i = 0; i < *variable_name_size; i++) - if (!variable_name[i]) - break; - if (i >= *variable_name_size) - return EFI_INVALID_PARAMETER; - - /* search for the last-returned variable */ - ret = efi_to_native(&native_name, variable_name, vendor); - if (ret) - return ret; - - name_len = strlen(native_name); - for (variable = efi_variables_list; variable && *variable;) { - if (!strncmp(variable, native_name, name_len) && - variable[name_len] == '=') - break; + if (!variable_name[0]) + var = NULL; - variable = strchr(variable, '\n'); - if (variable) - variable++; - } + efi_var_mem_find(vendor, variable_name, &var); + if (!var) + return EFI_NOT_FOUND; - free(native_name); - if (!(variable && *variable)) - return EFI_INVALID_PARAMETER; + for (pdata = var->name; *pdata; ++pdata) + ; + ++pdata; - /* next variable */ - variable = strchr(variable, '\n'); - if (variable) - variable++; - if (!(variable && *variable)) - return EFI_NOT_FOUND; - } else { - /* - *new search: free a list used in the previous search - */ - free(efi_variables_list); - efi_variables_list = NULL; - efi_cur_variable = NULL; - - snprintf(regex, 256, "efi_.*-.*-.*-.*-.*_.*"); - list_len = hexport_r(&env_htab, '\n', - H_MATCH_REGEX | H_MATCH_KEY, - &efi_variables_list, 0, 1, regexlist); - /* 1 indicates that no match was found */ - if (list_len <= 1) - return EFI_NOT_FOUND; + old_size = *variable_name_size; + *variable_name_size = (uintptr_t)pdata - (uintptr_t)var->name; - variable = efi_variables_list; - } + if (old_size < *variable_name_size) + return EFI_BUFFER_TOO_SMALL; - ret = parse_uboot_variable(variable, variable_name_size, variable_name, - vendor, &attributes); + efi_var_mem_memcpy(variable_name, var->name, *variable_name_size); + efi_var_mem_memcpy(vendor, &var->guid, sizeof(efi_guid_t)); - return ret; + return EFI_SUCCESS; } /** @@ -471,17 +186,26 @@ efi_status_t EFIAPI efi_set_variable(u16 *variable_name, const efi_guid_t *vendor, u32 attributes, efi_uintn_t data_size, const void *data) { + efi_status_t ret; + EFI_ENTRY("\"%ls\" %pUl %x %zu %p", variable_name, vendor, attributes, data_size, data); - return EFI_EXIT(efi_set_variable_int(variable_name, vendor, attributes, - data_size, data)); + ret = efi_set_variable_int(variable_name, vendor, attributes, + data_size, data); + + /* Write non-volatile EFI variables to file */ + if (ret == EFI_SUCCESS && (attributes & EFI_VARIABLE_NON_VOLATILE) && + efi_obj_list_initialized == EFI_SUCCESS) + efi_var_to_file(); + + return EFI_EXIT(ret); } /** - * efi_set_variable_int() - set value of a UEFI variable internal + * efi_set_variable_rt_int() - set value of a UEFI variable internal * - * This function can be used to set a UEFI variable without using EFI_CALL(). + * This implements SetVariable() without persistence. * * @variable_name: name of the variable * @vendor: vendor GUID @@ -490,130 +214,91 @@ efi_status_t EFIAPI efi_set_variable(u16 *variable_name, * @data: buffer with the variable value * Return: status code */ -efi_status_t efi_set_variable_int(u16 *variable_name, - const efi_guid_t *vendor, u32 attributes, - efi_uintn_t data_size, const void *data) +static efi_status_t __efi_runtime +efi_set_variable_rt_int(u16 *variable_name, const efi_guid_t *vendor, + u32 attributes, efi_uintn_t data_size, const void *data) { - char *native_name = NULL, *val = NULL, *s; - const char *old_val; - size_t old_size; - efi_status_t ret = EFI_SUCCESS; - u32 attr; - + struct efi_var_entry *var; + efi_uintn_t ret; + bool append; if (!variable_name || !*variable_name || !vendor || ((attributes & EFI_VARIABLE_RUNTIME_ACCESS) && !(attributes & EFI_VARIABLE_BOOTSERVICE_ACCESS))) { - ret = EFI_INVALID_PARAMETER; - goto out; + return EFI_INVALID_PARAMETER; } - ret = efi_to_native(&native_name, variable_name, vendor); - if (ret) - goto out; - - old_val = env_get(native_name); - if (old_val) { - old_val = parse_attr(old_val, &attr); - - /* check read-only first */ - if (attr & READ_ONLY) { - ret = EFI_WRITE_PROTECTED; - goto out; - } - - if ((data_size == 0 && - !(attributes & EFI_VARIABLE_APPEND_WRITE)) || - !attributes) { - /* delete the variable: */ - env_set(native_name, NULL); - ret = EFI_SUCCESS; - goto out; - } - - /* attributes won't be changed */ - if (attr != (attributes & ~EFI_VARIABLE_APPEND_WRITE)) { - ret = EFI_INVALID_PARAMETER; + var = efi_var_mem_find(vendor, variable_name, NULL); + append = attributes & EFI_VARIABLE_APPEND_WRITE; + attributes &= ~EFI_VARIABLE_APPEND_WRITE; + + /* + * TODO: + * * authentication + * * checks for EFI_VARIABLE_HARDWARE_ERROR_RECORD + */ + if (var) { + if (attributes && var->attr != attributes) + return EFI_INVALID_PARAMETER; + if (var->attr & READ_ONLY) + return EFI_WRITE_PROTECTED; + if ((!attributes || !data_size) && !append) { + attributes = var->attr; goto out; } - - if (attributes & EFI_VARIABLE_APPEND_WRITE) { - if (!prefix(old_val, "(blob)")) { - ret = EFI_DEVICE_ERROR; - goto out; - } - old_size = strlen(old_val); - } else { - old_size = 0; - } } else { - if (data_size == 0 || !attributes || - (attributes & EFI_VARIABLE_APPEND_WRITE)) { - /* - * Trying to delete or to update a non-existent - * variable. - */ - ret = EFI_NOT_FOUND; - goto out; - } - - old_size = 0; + if (!attributes || !data_size || append) + return EFI_NOT_FOUND; } - val = malloc(old_size + 2 * data_size - + strlen("{ro,run,boot,nv}(blob)") + 1); - if (!val) { - ret = EFI_OUT_OF_RESOURCES; - goto out; - } + if (append) { + u16 *old_data = var->name; + + for (; *old_data; ++old_data) + ; + ++old_data; - s = val; - - /* store attributes */ - attributes &= (EFI_VARIABLE_NON_VOLATILE | - EFI_VARIABLE_BOOTSERVICE_ACCESS | - EFI_VARIABLE_RUNTIME_ACCESS); - s += sprintf(s, "{"); - for (u32 attr_rem = attributes; attr_rem;) { - u32 attr = 1 << (ffs(attr_rem) - 1); - - if (attr == EFI_VARIABLE_NON_VOLATILE) - s += sprintf(s, "nv"); - else if (attr == EFI_VARIABLE_BOOTSERVICE_ACCESS) - s += sprintf(s, "boot"); - else if (attr == EFI_VARIABLE_RUNTIME_ACCESS) - s += sprintf(s, "run"); - - attr_rem &= ~attr; - if (attr_rem) - s += sprintf(s, ","); + ret = efi_var_mem_ins(variable_name, vendor, attributes, + var->length, old_data, data_size, data); + } else { + ret = efi_var_mem_ins(variable_name, vendor, attributes, + data_size, data, 0, NULL); } - s += sprintf(s, "}"); + if (ret != EFI_SUCCESS) + return ret; - if (old_size) - /* APPEND_WRITE */ - s += sprintf(s, old_val); - else - s += sprintf(s, "(blob)"); +out: + efi_var_mem_del(var); - /* store payload: */ - s = bin2hex(s, data, data_size); - *s = '\0'; + return EFI_SUCCESS; +} - EFI_PRINT("setting: %s=%s\n", native_name, val); +/** + * efi_set_variable_int() - set value of a UEFI variable internal + * + * This function can be used to set a UEFI variable without using EFI_CALL(). + * + * @variable_name: name of the variable + * @vendor: vendor GUID + * @attributes: attributes of the variable + * @data_size: size of the buffer with the variable value + * @data: buffer with the variable value + * Return: status code + */ +efi_status_t +efi_set_variable_int(u16 *variable_name, const efi_guid_t *vendor, + u32 attributes, efi_uintn_t data_size, const void *data) +{ + efi_status_t ret; - if (env_set(native_name, val)) - ret = EFI_DEVICE_ERROR; + ret = efi_set_variable_rt_int(variable_name, vendor, attributes, + data_size, data); /* Write non-volatile EFI variables to file */ - if (attributes && EFI_VARIABLE_NON_VOLATILE && - ret == EFI_SUCCESS && efi_obj_list_initialized == EFI_SUCCESS) + if (ret == EFI_SUCCESS && (attributes & EFI_VARIABLE_NON_VOLATILE) && + efi_obj_list_initialized == EFI_SUCCESS) efi_var_to_file(); -out: - free(native_name); - free(val); - return ret; } @@ -629,7 +314,7 @@ out: * queried * @maximum_variable_storage_size: maximum size of storage area for the * selected variable types - * @remaining_variable_storage_size: remaining size of storage are for the + * @remaining_variable_storage_size: remaining size of storage for the * selected variable types * @maximum_variable_size: maximum size of a variable of the * selected type @@ -641,6 +326,14 @@ efi_status_t __efi_runtime EFIAPI efi_query_variable_info( u64 *remaining_variable_storage_size, u64 *maximum_variable_size) { + /* + *maximum_variable_storage_size = EFI_VAR_BUF_SIZE - + sizeof(struct efi_var_file); + *remaining_variable_storage_size = efi_var_mem_free(); + *maximum_variable_size = EFI_VAR_BUF_SIZE - + sizeof(struct efi_var_file) - + sizeof(struct efi_var_entry); + */ return EFI_UNSUPPORTED; } @@ -700,9 +393,6 @@ efi_set_variable_runtime(u16 *variable_name, const efi_guid_t *vendor, */ void efi_variables_boot_exit_notify(void) { - /* Write non-volatile EFI variables to file */ - efi_var_to_file(); - /* Switch variable services functions to runtime version */ efi_runtime_services.get_variable = efi_get_variable_runtime; efi_runtime_services.get_next_variable_name = @@ -718,5 +408,11 @@ void efi_variables_boot_exit_notify(void) */ efi_status_t efi_init_variables(void) { + efi_status_t ret; + + ret = efi_var_mem_init(); + if (ret != EFI_SUCCESS) + return ret; + return efi_var_from_file(); } diff --git a/lib/efi_loader/efi_variables_mem.c b/lib/efi_loader/efi_variables_mem.c index f70cc65f8b..939fbaa972 100644 --- a/lib/efi_loader/efi_variables_mem.c +++ b/lib/efi_loader/efi_variables_mem.c @@ -263,8 +263,15 @@ static void efi_var_mem_bs_del(void) static void EFIAPI __efi_runtime efi_var_mem_notify_exit_boot_services(struct efi_event *event, void *context) { + EFI_ENTRY("%p, %p", event, context); + + /* Write non-volatile EFI variables to file */ + efi_var_to_file(); + /* Delete boot service only variables */ efi_var_mem_bs_del(); + + EFI_EXIT(EFI_SUCCESS); } /** From patchwork Tue Mar 31 06:05:40 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 1264537 X-Patchwork-Delegate: xypron.glpk@gmx.de Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=85.214.62.61; helo=phobos.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 Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.a=rsa-sha256 header.s=badeba3b8450 header.b=apFZva/J; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 48rzN65t9Zz9sR4 for ; Tue, 31 Mar 2020 17:05:58 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 84E4D81901; Tue, 31 Mar 2020 08:05:52 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.b="apFZva/J"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 39EC681923; Tue, 31 Mar 2020 08:05:51 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, FREEMAIL_FROM, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mout.gmx.net (mout.gmx.net [212.227.17.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 83FE5811FC for ; Tue, 31 Mar 2020 08:05:48 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=xypron.glpk@gmx.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1585634746; bh=2iTX+KlvWNvkQt7rFTw2e1P/a1pfMUumNwXW4g29hkg=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=apFZva/JxLJAQov8c+Ti8LV8O68pb9UB4pRk6JsOIyphcWc0oWUyp54Sirk2nwnvC FZeP72FpJyvOav2oYNhKK6i2EL04BWz1S7YYzk6G/aG+Z7YPjSERRNTeT53L9wp0d9 C6UvfBmsZOwABV0jvFJXo020TrZRgDisQdCRCBmk= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from LT02.fritz.box ([84.119.33.226]) by mail.gmx.com (mrgmx104 [212.227.17.174]) with ESMTPSA (Nemesis) id 1M1HZi-1jKnvE3E7u-002rRz; Tue, 31 Mar 2020 08:05:46 +0200 From: Heinrich Schuchardt To: AKASHI Takahiro , Alexander Graf Cc: Ilias Apalodimas , Sughosh Ganu , u-boot@lists.denx.de, Heinrich Schuchardt Subject: [PATCH 15/16] efi_loader: enable UEFI variables at runtime Date: Tue, 31 Mar 2020 08:05:40 +0200 Message-Id: <20200331060541.4212-1-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200327052800.11022-1-xypron.glpk@gmx.de> References: <20200327052800.11022-1-xypron.glpk@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:UwW26r1L/MMyXlxEolraR8lNxrooKaj53JMAJFhdwdlvWezmfXw yxDC0vOHcGJWjyTtWHEaKa5uB99cd8dG/wP5JlzYLAuzCldQcxLMWVSp/UO1kdQmzZSPVkv TIOxJ1V/gvTyg1lZdgNxm4yIOj4SCxkdv0ff4crFJIZ7PVKE20tZGiG2rPQ4V5H6Ix/UwKx Y5xSqHMlfAvJJ50XA45+g== X-UI-Out-Filterresults: notjunk:1; V03:K0:wKzhIIpv7eU=:2g4k97tBAfFhANfijvpFmK j8sIb22nKlf5cT0Rp1yQ94hVpkwqmpOIUonPWMMSwcO9ws5ryfnKL6mcrhWE6q1xk+/dCFXAG y+/uWsAbRDLfClYzfkhTwMaGw6cxDJwqJQmAzRwY7Uyz8rJG4udPr/RVbdi1G1mNeW5v/1UWz fByF1zrggFvSvdZdF3gRrO2jeblKpRTavGaOWS2P00iB9+TbMy8NENqVFEjO6bENSgsEFcfL3 LgY956+en1V8re9orNWAcmVOx2xgLLh6wf3jaczvCUu4fYMmZS8dp1Z9VnXH7qVS+GP72nQDH o13ruF3BSeySMZnvSA50hr6aOCxgynGyxmEXN2hkbFnrocIhuLbQPRISxKv6py/opkB4LoOnb /GBgd5ERljGtYnnMkiQDcLDiPaMjBzOHca19OFdoARzedFOkPEFWStp94Bhuyor8qbXAEiKpe h/XfDwUvBHDjtWTAIASZKYwA2LDXQQE+5T8DEYzGrsYrBV5TytNH8FJspfe1q/J+4BS/BrwHF i6TOLMOD3+oU42QtLZcJjwU2OFZRbPu3E2s/8g4gJxJ+isgXC8vnm0utOUey7eRenbMBDIXbc rD1JwDmpsPVryWWtBfaE24WUl3wsUTmUTJyaBlOVIHwVvpDivabQx7aaMSK0HsnCzl3b7n3lt UaQ+t4tdXaQOypnahIyYDZ7u8yBvyQLh+y74dbw6rt+nniZVEth0lrsKPkI4HroGC2bOKUjjs 27514nmRpDakO5UNKv0AHFLo2afIaqc0AZATrVZqWU3Zp7FFLscfHrDQrEpXVyq3AJozkDcwi /839GRjZMCNRBdptWSxw+pT1+4inVUVvv1/HP+a9Ad6qyrl/z9UiCR/YCQZNGIZITfeLg+12d xe9+F6zJ+8bn/PFxUdIig+rQLcxVIFjnEFREvzBpuDi77mnIGI02uUm8OleZzUAcs9c69w+Np SmRyNZD+levZKHcIIN7UL5qTOgoBjEGfWVsLOu/h923RYiMnvdey9rFyHQQiBTRxGrLPwiYxP cNcY5wzE6rZnwNg2mibMzeUkGAws8EeONLZQ9u5yUlDbY1FusktafbDW+aHAT6ZyyzQY9FmsU fzGyXyPELnMfmgCiiD5dQmdprTYiF1ObtC+K52H2Oaj8+c81zmJvuVgPUGtwlxzX1UrZUwKhJ h0+8H5Q+HS8SVh4U2w8R+ICCzmxRU9wH9EOlb9nSyNGYpp2u5Yih8AqQ4RRc1W7E8bHq6Fyb9 4zoNXAIeZHRX+X4Uf X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.30rc1 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.2 at phobos.denx.de X-Virus-Status: Clean Enable UEFI variables at runtime. Signed-off-by: Heinrich Schuchardt --- lib/efi_loader/efi_runtime.c | 6 +++++- lib/efi_loader/efi_variable.c | 23 +++++++++++++++++------ 2 files changed, 22 insertions(+), 7 deletions(-) -- 2.25.1 diff --git a/lib/efi_loader/efi_runtime.c b/lib/efi_loader/efi_runtime.c index 664a0422e2..acd644202d 100644 --- a/lib/efi_loader/efi_runtime.c +++ b/lib/efi_loader/efi_runtime.c @@ -120,8 +120,12 @@ efi_status_t efi_init_runtime_supported(void) rt_table->version = EFI_RT_PROPERTIES_TABLE_VERSION; rt_table->length = sizeof(struct efi_rt_properties_table); rt_table->runtime_services_supported = + EFI_RT_SUPPORTED_GET_VARIABLE | + EFI_RT_SUPPORTED_GET_NEXT_VARIABLE_NAME | + EFI_RT_SUPPORTED_SET_VARIABLE | EFI_RT_SUPPORTED_SET_VIRTUAL_ADDRESS_MAP | - EFI_RT_SUPPORTED_CONVERT_POINTER; + EFI_RT_SUPPORTED_CONVERT_POINTER | + EFI_RT_SUPPORTED_QUERY_VARIABLE_INFO; /* * This value must be synced with efi_runtime_detach_list diff --git a/lib/efi_loader/efi_variable.c b/lib/efi_loader/efi_variable.c index 7c39542968..cf8b44c535 100644 --- a/lib/efi_loader/efi_variable.c +++ b/lib/efi_loader/efi_variable.c @@ -326,15 +326,13 @@ efi_status_t __efi_runtime EFIAPI efi_query_variable_info( u64 *remaining_variable_storage_size, u64 *maximum_variable_size) { - /* *maximum_variable_storage_size = EFI_VAR_BUF_SIZE - sizeof(struct efi_var_file); *remaining_variable_storage_size = efi_var_mem_free(); *maximum_variable_size = EFI_VAR_BUF_SIZE - sizeof(struct efi_var_file) - sizeof(struct efi_var_entry); - */ - return EFI_UNSUPPORTED; + return EFI_SUCCESS; } /** @@ -351,7 +349,8 @@ static efi_status_t __efi_runtime EFIAPI efi_get_variable_runtime(u16 *variable_name, const efi_guid_t *vendor, u32 *attributes, efi_uintn_t *data_size, void *data) { - return EFI_UNSUPPORTED; + return efi_get_variable_int(variable_name, vendor, attributes, + data_size, data); } /** @@ -367,7 +366,8 @@ static efi_status_t __efi_runtime EFIAPI efi_get_next_variable_name_runtime(efi_uintn_t *variable_name_size, u16 *variable_name, efi_guid_t *vendor) { - return EFI_UNSUPPORTED; + return efi_get_next_variable_name_int(variable_name_size, variable_name, + vendor); } /** @@ -385,7 +385,18 @@ efi_set_variable_runtime(u16 *variable_name, const efi_guid_t *vendor, u32 attributes, efi_uintn_t data_size, const void *data) { - return EFI_UNSUPPORTED; + const u32 required_attributes = EFI_VARIABLE_NON_VOLATILE | + EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_RUNTIME_ACCESS; + + if (attributes && + (attributes & required_attributes) != required_attributes) + return EFI_INVALID_PARAMETER; + if ((attributes & ~(u32)EFI_VARIABLE_MASK)) + return EFI_INVALID_PARAMETER; + + return efi_set_variable_rt_int(variable_name, vendor, attributes, + data_size, data); } /** From patchwork Tue Mar 31 06:07:39 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 1264539 X-Patchwork-Delegate: xypron.glpk@gmx.de Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.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 Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.a=rsa-sha256 header.s=badeba3b8450 header.b=BTZYKkVD; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 48rzQH4THZz9sR4 for ; Tue, 31 Mar 2020 17:07:51 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id DEB6281901; Tue, 31 Mar 2020 08:07:48 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.b="BTZYKkVD"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id BF859811FC; Tue, 31 Mar 2020 08:07:47 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, FREEMAIL_FROM, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mout.gmx.net (mout.gmx.net [212.227.17.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 1F1DC811FC for ; Tue, 31 Mar 2020 08:07:45 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=xypron.glpk@gmx.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1585634864; bh=1qRWFCOMDRvLkwk78tyCZoYm44l2gApUmCmBxoV8HA8=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=BTZYKkVDGcsyK6W9UAj3KNQRIOQPfEhmLfmGtoWc9hoBsloJNiNCil3kJk11/oCgK uSaZUxVHkeZd+Xch8lN8prhCi788c1qvkwBwAcT93qEBJhCvOGRvbz85JDauAclgq2 QpeLOVStQq67qXir+myCfP53rQzFwI53ruCQ23V4= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from LT02.fritz.box ([84.119.33.226]) by mail.gmx.com (mrgmx104 [212.227.17.174]) with ESMTPSA (Nemesis) id 1Mw9QC-1j2S7f3ZYK-00s4WH; Tue, 31 Mar 2020 08:07:43 +0200 From: Heinrich Schuchardt To: AKASHI Takahiro , Alexander Graf Cc: Ilias Apalodimas , Sughosh Ganu , u-boot@lists.denx.de, Heinrich Schuchardt Subject: [PATCH 16/16] efi_selftest: adjust runtime test for variables Date: Tue, 31 Mar 2020 08:07:39 +0200 Message-Id: <20200331060739.4570-1-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200327052800.11022-1-xypron.glpk@gmx.de> References: <20200327052800.11022-1-xypron.glpk@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:nTQptYyy9HL4Zo6lIkemRSeiiASHW1Lv+8JOPZWCOck9TjdvhCp 87jwy2Y+5Sb2rxqsoBHauJY8b8nqWyVp2EepmQuFrzjRLNnGVLG4kNyStk16phgL+k+ZB+f javL2VKOi2z38Q6TmB5DSwx6PZXPmxBnc5tu7qfxQpe/gPbQN8cpGNeDa1XX/j8eeCv46Wx cPBRvsfNpnsrvmaZc0ySQ== X-UI-Out-Filterresults: notjunk:1; V03:K0:WEw8wsIQEHk=:wzHh88DfVN105ZqwXZEd5Q wNtwNlXnJEzP9tNRmXNVmdJ+cKEnD2ZlVTzKTEOLRKdn1kQhcThxFlSQ02emv9tM4IBG9tIK0 AfD1isTBPMxVsIacjtgFxWK+UBLwP1Zafie+/qTMoeVNbVBIXvULq6fJ0FvD4y5aEZspubCDx WBn9WnYrunmCCpmUfn7kmOjvuCuE6+gXP7JQhO1gB90WHsjTgeeuy5CGzvv8g6MgVzvC43Nqj hsXUqQ0CMm2Q3BQLVRid2rsLJBuaWAA/Qa2FGYPbzuzrvsXZdb5MoywAJleh0+NBrHR0NmAPg ymJwYqqGvdG4zmaTgpOayxVFHnETI4phXtRjn/ku/cY7J7u+h1y0ppXx+zmWxhg11VjQTHzQy smkmPXEzSd+yqy388G4mkgPjiMlDv2yANxIst8PEo9K6aATBvjRwf8cFIwFixH/06nH1Vj9GL kaonNsLb4Lkju/cuGSuIyzhnD6PPuVxnek1hdUePSCOx2x8stRjS85Pqk4ySNDLVHvVSPWXBc yY9n+8HsM6ZddVF5T668udRl31am7aO408F/7RnEDLDgBwJFZwOV15ac5E4Dp27CCHYNHg8GN JaitJNrmjjxJyvT+q8EFnSpSBUWZvvwcTLZQHqGeCXu5poRUGawoPZ8TeZwbHbz03lOiSUDCW w1z0fBP/MUPeR2wPuty6tssGh0+2mNJwJvrJ1RthNZYb/N16li8eDQ7KGJ7jvZPgZT05R8uNB gZSofdfIIjkAmZrrdvYX+V5sDuDYbzbyyIiQ19QTT24tBDT2e00Ntk/T+qUwHuxd/+lP6qP6t DQr38USjMupwuHQ+UFSUsVjz2JBHQ9+bE2D+lK3tPEH28t+G06GCgcbk3kYrDsQBssWySeVG2 /DgG1R8SnQVWnNykagjNFhsMA/FJ57/2VOhEUoZSA3Gak41Mo+WZBl+Dy6XaobhtjOlCprx3u tGImlSjoBeofe9uKkK1DeQ3OF1xNve+LbEIv9EwNKKdaZnBhKbVEJZ4t8kPQU8ptPZY7q5h1z 8tElhV11edpw+OZCD0mrqys4KFoP5vbg61rHoaDg9yLoV+5ettxob0ex4Sf5iGNbEctmqK/W8 OseX3LMvGi10hi+F7pHRpO5AWxSOMNh3FPYNUIvzZgKNgmYWeImB4qx/9pUZWKhv8Q8AMuvYy zpDxYIXmtgi4hG1fiq/9A751PJB0c2y3EcBAOMOyYE8h966BPFuYoaIZ/T6ljYEqLSjWYjx2D J73Aus7EqbTEIviTl X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.30rc1 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.2 at phobos.denx.de X-Virus-Status: Clean As variable services are available at runtime we have to expect EFI_SUCCESS when calling the services. Check the SetVariable() only succeeds with EFI_VARIABLE_RUNTIME_ACCESS and EFI_VARIABLE_NON_VOLATILE set. Signed-off-by: Heinrich Schuchardt --- .../efi_selftest_variables_runtime.c | 47 +++++++++++++++---- 1 file changed, 39 insertions(+), 8 deletions(-) -- 2.25.1 diff --git a/lib/efi_selftest/efi_selftest_variables_runtime.c b/lib/efi_selftest/efi_selftest_variables_runtime.c index b3b40ad2cf..c6005eeeaf 100644 --- a/lib/efi_selftest/efi_selftest_variables_runtime.c +++ b/lib/efi_selftest/efi_selftest_variables_runtime.c @@ -20,8 +20,8 @@ static const efi_guid_t guid_vendor0 = EFI_GUID(0x67029eb5, 0x0af2, 0xf6b1, 0xda, 0x53, 0xfc, 0xb5, 0x66, 0xdd, 0x1c, 0xe6); -/* - * Setup unit test. +/** + * setup() - set up unit test. * * @handle handle of the loaded image * @systable system table @@ -38,7 +38,7 @@ static int setup(const efi_handle_t img_handle, /** * execute() - execute unit test * - * As runtime support is not implmented expect EFI_UNSUPPORTED to be returned. + * Test variable services at runtime. */ static int execute(void) { @@ -52,37 +52,68 @@ static int execute(void) efi_guid_t guid; u64 max_storage, rem_storage, max_size; - ret = runtime->query_variable_info(EFI_VARIABLE_BOOTSERVICE_ACCESS, + ret = runtime->query_variable_info(EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_RUNTIME_ACCESS | + EFI_VARIABLE_NON_VOLATILE, &max_storage, &rem_storage, &max_size); - if (ret != EFI_UNSUPPORTED) { + if (ret != EFI_SUCCESS) { efi_st_error("QueryVariableInfo failed\n"); return EFI_ST_FAILURE; } + ret = runtime->set_variable(L"efi_st_var0", &guid_vendor0, + EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_NON_VOLATILE, + 3, v + 4); + if (ret != EFI_INVALID_PARAMETER) { + efi_st_error("SetVariable succeeded w/o EFI_VARIABLE_RUNTIME_ACCESS\n"); + return EFI_ST_FAILURE; + } + ret = runtime->set_variable(L"efi_st_var0", &guid_vendor0, EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, 3, v + 4); - if (ret != EFI_UNSUPPORTED) { + if (ret != EFI_INVALID_PARAMETER) { + efi_st_error("SetVariable succeeded w/o EFI_VARIABLE_NON_VOLATILE\n"); + return EFI_ST_FAILURE; + } + + ret = runtime->set_variable(L"efi_st_var0", &guid_vendor0, + EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_RUNTIME_ACCESS | + EFI_VARIABLE_NON_VOLATILE, + 3, v + 4); + if (ret != EFI_SUCCESS) { efi_st_error("SetVariable failed\n"); return EFI_ST_FAILURE; } + len = 3; ret = runtime->get_variable(L"efi_st_var0", &guid_vendor0, &attr, &len, data); - if (ret != EFI_UNSUPPORTED) { + if (ret != EFI_SUCCESS) { efi_st_error("GetVariable failed\n"); return EFI_ST_FAILURE; } + memset(&guid, 0, 16); *varname = 0; + len = EFI_ST_MAX_VARNAME_SIZE * sizeof(u16); ret = runtime->get_next_variable_name(&len, varname, &guid); - if (ret != EFI_UNSUPPORTED) { + if (ret != EFI_SUCCESS) { efi_st_error("GetNextVariableName failed\n"); return EFI_ST_FAILURE; } + ret = runtime->set_variable(L"efi_st_var0", &guid_vendor0, 0, + 3, v + 4); + if (ret != EFI_SUCCESS) { + efi_st_error("Variable deletion failed\n"); + return EFI_ST_FAILURE; + } + return EFI_ST_SUCCESS; }