From patchwork Sat Jan 20 12:56:19 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 863958 X-Patchwork-Delegate: agraf@suse.de Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 3zNyQZ6hjvz9s74 for ; Sat, 20 Jan 2018 23:57:26 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 7B56EC21F38; Sat, 20 Jan 2018 12:57:22 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=FREEMAIL_FROM, RCVD_IN_DNSWL_BLOCKED,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id AFAF4C21F1F; Sat, 20 Jan 2018 12:57:19 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id A44BCC21F1F; Sat, 20 Jan 2018 12:57:18 +0000 (UTC) Received: from mout.gmx.net (mout.gmx.net [212.227.17.21]) by lists.denx.de (Postfix) with ESMTPS id 49A13C21DA2 for ; Sat, 20 Jan 2018 12:57:18 +0000 (UTC) Received: from workstation4.fritz.box ([95.222.46.37]) by mail.gmx.com (mrgmx101 [212.227.17.174]) with ESMTPSA (Nemesis) id 0M3vCA-1eu8dz2Kpe-00rUUJ; Sat, 20 Jan 2018 13:57:17 +0100 From: Heinrich Schuchardt To: Alexander Graf Date: Sat, 20 Jan 2018 13:56:19 +0100 Message-Id: <20180120125619.11610-1-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.14.2 X-Provags-ID: V03:K0:xVID6ICkthZrP0tC4nK2WoAcSLYMzljGYiO2i/sAEa1Iggze+MH eai3C8Pu54/HVCAJLByJ2lhAbHE4GJdfAkjre2oxdzRI2YbXMDoaTa4YIeJeHTK2AtmY4RK p9mwHV7UzEoSVhamEO3SZ/MdjtTLZyiiHm16hc9szudTjn8+9xtWpOuCpzZUJ4QspjuxIOi hWjjE23nMq6JI5lRTlsJA== X-UI-Out-Filterresults: notjunk:1; V01:K0:MlEwR4a5T2o=:0z2xuT8AvWxr89xFqh58zI EPQ/Yn6n+pGt1AI+Y36PxvEMGwkuZZ+hkEsbEoyqsOVPv6+Bjvav9DF3cFSYV/84j18UxrB/3 Q31OY0m6rSkxgJkqd1W+1AQSKbgldneNGr2DlJI9pVpZllUo3Q6V8xejuMJJeg85o2cos1m/p 7m9pWJapgKJp3Yf6iRnLI9dQ4Lbx+rCKS8+FYtE1KOpwhkiuWfglL0taS/6mB9omYWb9FYn70 ojg6vzwYxY9B8mX/jBzthe/VfcP4k+QUYPjULAIyOhhOKEC918Bk/TJKmLDvXBZcSPebYcpHD JiA31yc7w25SawNz9o7aGqIpGVTDvF9Spi+QLwGz/OxfcUvBDN3U8furvF7VvD8qHTCqZFrKr WOD9E48O8LUUOsskbSj2j7X1Nua/J/IzPHg/IURWXlUwEJST2s6p91tytvl6tMGfxshdV3FbV iMWIKT0HchpstQ3MTQXUEwqze2P78jsru7s+bOnlwoaAbc6JmzwbKVUy3Gw2Zm60GYScG7loU 9x+Q2wyuWjPY28Dnwk1/IVFskWcY0tUCU8q7LzB38yvyFkJb7C/Owo6NEFLtJYPtK+cU4iFIT W5eWyZQufjg5un4O4E+3S7y0CK/KXyQYTv48qzKErs4y/mrrlYSlAdwldPOXgWdMv7DFjAxeD oS3hWRfZyduuKe/PLFsm5z9PQnRNO7MeSpDa4Uelv+s9R9NzNVzSwvJnxQTPL/2J0NSCPCzhA cN8j1Jf6zUxxGeIqAdUvT4u6PrbBa5wtsASDzCOn0+S7a0QlaprVaenU4nj3OIrm+vEv7jVSz VtiFT32DMxNGR6ttir/CCfCkp/TgA== Cc: u-boot@lists.denx.de, Heinrich Schuchardt Subject: [U-Boot] [PATCH 1/1] efi_loader: use built-in device tree in bootefi command X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" The bootefi command has two parameters: the address of the executable and the address of the flattened device tree. When executing the devicetree command in grub this command can only replace an existing device tree. So we always want to pass a device tree. With the patch the device tree defaults to the internal one. But of cause the user still can supply his one via the second parameter. One use case is booting via iPXE from an iSCSI drive. As we may be able to choose between different operating systems in the iPXE menu we cannot know the correct device tree when invoking bootefi. The dtb might not even be installed on a local device. Signed-off-by: Heinrich Schuchardt --- cmd/bootefi.c | 40 +++++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/cmd/bootefi.c b/cmd/bootefi.c index 51213c0293..c7f2887df2 100644 --- a/cmd/bootefi.c +++ b/cmd/bootefi.c @@ -276,7 +276,7 @@ exit: return ret; } -static int do_bootefi_bootmgr_exec(unsigned long fdt_addr) +static int do_bootefi_bootmgr_exec(struct fdt_header *fdt_addr) { struct efi_device_path *device_path, *file_path; void *addr; @@ -310,10 +310,34 @@ static int do_bootefi_bootmgr_exec(unsigned long fdt_addr) /* Interpreter command to boot an arbitrary EFI image from memory */ static int do_bootefi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { - char *saddr, *sfdt; - unsigned long addr, fdt_addr = 0; + char *saddr; + unsigned long addr; + struct fdt_header *fdt_addr = NULL; efi_status_t r; + /* Set the device tree address */ + if (argc > 2) { + fdt_addr = (struct fdt_header *)simple_strtoul( + argv[2], NULL, 16); + } else { + /* If no device tree is supplied, try using the internal one */ + fdt_addr = (struct fdt_header *)gd->fdt_blob; + if (fdt_addr) + printf("Using built-in device tree\n"); + } + + /* Validate the device tree */ + if (fdt_addr) { + int err = fdt_check_header(fdt_addr); + + if (err < 0) { + printf("The device tree is not valid\n"); + debug("libfdt fdt_check_header(): %s\n", + fdt_strerror(err)); + return CMD_RET_FAILURE; + } + } + if (argc < 2) return CMD_RET_USAGE; #ifdef CONFIG_CMD_BOOTEFI_HELLO @@ -362,21 +386,11 @@ static int do_bootefi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) } else #endif if (!strcmp(argv[1], "bootmgr")) { - unsigned long fdt_addr = 0; - - if (argc > 2) - fdt_addr = simple_strtoul(argv[2], NULL, 16); - return do_bootefi_bootmgr_exec(fdt_addr); } else { saddr = argv[1]; addr = simple_strtoul(saddr, NULL, 16); - - if (argc > 2) { - sfdt = argv[2]; - fdt_addr = simple_strtoul(sfdt, NULL, 16); - } } printf("## Starting EFI application at %08lx ...\n", addr);