From patchwork Sat Mar 13 21:47:32 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilias Apalodimas X-Patchwork-Id: 399598 Delivered-To: patch@linaro.org Received: by 2002:a02:8562:0:0:0:0:0 with SMTP id g89csp2272382jai; Sat, 13 Mar 2021 13:48:05 -0800 (PST) X-Google-Smtp-Source: ABdhPJyya64E+sKxvqUTFxUKxEwspRGK91JaLbKoy39eWSAKYg2wT0WGLg5qDEslubTQp4ezrTGR X-Received: by 2002:aa7:c450:: with SMTP id n16mr21216346edr.16.1615672084911; Sat, 13 Mar 2021 13:48:04 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1615672084; cv=none; d=google.com; s=arc-20160816; b=rBsWZUCo13SvWWKNDSDrE4KCAcLlud/W/vcnGaVh+JNKJC7+1UhPLsydqB0jxsI0AO JAAaYyLF+f1+iBfEVWJ2D/yrvpwxeOSU9BCHl8juxIjMz9zS/OHVoY5czDwh+9ZcSrbc kwC+zTKYlbodXK62vHUPezd51PodiR2X8qaKL3KPu0XVLE2PFkYzm+qMYSkUIbmHLLxS TvLz5w4q0FzU6fnzwdLFXS9HG7iHd55tVjjyPSJuIiBeY3uc+g+uj2QVVGf8At2uf7iZ /kXzdrYaXissgHFf690ELV5I6ysZeX03Qem7kOI1+PGFmkk4snuaxC+T5YmgDwxHVbij J3fQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=Qon6nL0U2Weku93eM44LZcRau2CQVcxyMQv7APJraU4=; b=BIRQjnoOGFeWEUjn6FoTygYk3Q6fw6qZXM4Zpck0sHT+9MtcXTSXthcUBoelQRikGa WwjbQiATVd/rTL3dJcmfz3HH/UqlRYr1Ob4DvpszlX0wfGLolBiAvrKzODWYvMpfeSni 7r5nHH7ATUQKsqAQTMpFPUR/WWM5uc6oZDGjmj4iS+tjKWIfCUZHWcDlat3e8p8Q8VaR 4TMen5XtfHvjoY8oDXtSkFtfIpSXv+rp8/khw3Gt//YPEO9Np3h0kVoywY3UhIziH3ur 3FzX8au5jpF+V4kQEdfsxVSoSIpgJ1zTywu+jUEHprKTeJj3zJo9KUUPDVmW56FUG7xL 1+9g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=M4tfaNBD; spf=pass (google.com: domain of u-boot-bounces@lists.denx.de designates 2a01:238:438b:c500:173d:9f52:ddab:ee01 as permitted sender) smtp.mailfrom=u-boot-bounces@lists.denx.de; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from phobos.denx.de (phobos.denx.de. [2a01:238:438b:c500:173d:9f52:ddab:ee01]) by mx.google.com with ESMTPS id bx25si8132294edb.242.2021.03.13.13.48.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 13 Mar 2021 13:48:04 -0800 (PST) Received-SPF: pass (google.com: domain of u-boot-bounces@lists.denx.de designates 2a01:238:438b:c500:173d:9f52:ddab:ee01 as permitted sender) client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=M4tfaNBD; spf=pass (google.com: domain of u-boot-bounces@lists.denx.de designates 2a01:238:438b:c500:173d:9f52:ddab:ee01 as permitted sender) smtp.mailfrom=u-boot-bounces@lists.denx.de; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id F32E082822; Sat, 13 Mar 2021 22:47:50 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="M4tfaNBD"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 72C4582829; Sat, 13 Mar 2021 22:47: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=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-ed1-x534.google.com (mail-ed1-x534.google.com [IPv6:2a00:1450:4864:20::534]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 24B8382806 for ; Sat, 13 Mar 2021 22:47:45 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=ilias.apalodimas@linaro.org Received: by mail-ed1-x534.google.com with SMTP id w18so12926719edc.0 for ; Sat, 13 Mar 2021 13:47:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Qon6nL0U2Weku93eM44LZcRau2CQVcxyMQv7APJraU4=; b=M4tfaNBD91APAqOjYdcAjxldI78Qx89Ativ87AS0+NdN/3ygDwLcNYTYnH3L4HYfEF IhNuCwim2YgWntVV8xHmUstcvBAvZcI9McZkmpQQ+qiifbTygWBqcG5noiLJ4GAQFmJL ozBYBB94Yp20ZT8UsIM7lI5Gz0Cd8XQfjUvgXi1ESuSd7mJDz+uNPJnujVFeQhA6tbnL sCxIvMVkmFm6FFRaNWFwGE1fajzcQeBEASBRATTaz/Up2CJRz0N6FQCGixnyIfiIR0vL vxC3QZnwKbKAgPOJJ2FrwU7OJWGPDzY2SKrL1xFtp74ihfpvhPkyjq6ufrcclzE6Da+C JHEA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Qon6nL0U2Weku93eM44LZcRau2CQVcxyMQv7APJraU4=; b=AW8fJWECgCwf5V+LMxYjZG6UnDc0QQ5ZQIOGQ8N9JHDWsMWrvFvgc+CTrrTUIqcfLm uGX0dmccj9q5KAThQgezd8G/fOrUTgMQKiGa/fsFRiGgWUFqhr3tKD8UAVY7xG6/r8iH z0LMLPSoMdP1r6fbBZ+gK53I1FlR9uOQfz+l5J49dtLrK+4q90rq0ABipVVQ0b96zm4J qWYbfAuB+tVWKNlk62hhWG1VxpuceH0k1Ip1HXKG/wIKzCqlogr+H+RrozC8sy5YGDUH BfSur0g5xLgYgMUxtQqlsfo2pkWUiHPPzPqbNcuRo6DPLEhQdLE2/U92mu08Dq/5Uy9k Smbw== X-Gm-Message-State: AOAM53076tMUf9StjW2rfb2ZGj/z+kJ38frzGJGQlWW2GAOCcXTytBp6 ii2g8PejtwSlfCzhHHiwafuqkw== X-Received: by 2002:aa7:c1d5:: with SMTP id d21mr21440918edp.167.1615672064806; Sat, 13 Mar 2021 13:47:44 -0800 (PST) Received: from apalos.home ([2a02:587:4647:e6c6:2e56:dcff:fe9a:8f06]) by smtp.gmail.com with ESMTPSA id a9sm1571144eds.33.2021.03.13.13.47.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 13 Mar 2021 13:47:44 -0800 (PST) From: Ilias Apalodimas To: xypron.glpk@gmx.de Cc: takahiro.akashi@linaro.org, Ilias Apalodimas , Alexander Graf , Sughosh Ganu , u-boot@lists.denx.de Subject: [PATCH 1/6 v2] efi_selftest: Remove loadfile2 for initrd selftests Date: Sat, 13 Mar 2021 23:47:32 +0200 Message-Id: <20210313214738.3257922-2-ilias.apalodimas@linaro.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210313214738.3257922-1-ilias.apalodimas@linaro.org> References: <20210313214738.3257922-1-ilias.apalodimas@linaro.org> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 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.4 at phobos.denx.de X-Virus-Status: Clean We are redefining how u-boot locates the initrd to load via the kernel LoadFile2 protocol. This selftest is not relevant any more, so remove it. A new one will be added later Signed-off-by: Ilias Apalodimas Reviewed-by: Heinrich Schuchardt --- lib/efi_selftest/Makefile | 1 - lib/efi_selftest/efi_selftest_load_initrd.c | 221 -------------------- 2 files changed, 222 deletions(-) delete mode 100644 lib/efi_selftest/efi_selftest_load_initrd.c -- 2.30.1 diff --git a/lib/efi_selftest/Makefile b/lib/efi_selftest/Makefile index b02fd56e0a79..50de581b7763 100644 --- a/lib/efi_selftest/Makefile +++ b/lib/efi_selftest/Makefile @@ -61,7 +61,6 @@ obj-$(CONFIG_CPU_V7) += efi_selftest_unaligned.o obj-$(CONFIG_EFI_LOADER_HII) += efi_selftest_hii.o obj-$(CONFIG_EFI_RNG_PROTOCOL) += efi_selftest_rng.o obj-$(CONFIG_EFI_GET_TIME) += efi_selftest_rtc.o -obj-$(CONFIG_EFI_LOAD_FILE2_INITRD) += efi_selftest_load_initrd.o obj-$(CONFIG_EFI_TCG2_PROTOCOL) += efi_selftest_tcg2.o ifeq ($(CONFIG_GENERATE_ACPI_TABLE),) diff --git a/lib/efi_selftest/efi_selftest_load_initrd.c b/lib/efi_selftest/efi_selftest_load_initrd.c deleted file mode 100644 index f591dcd2115e..000000000000 --- a/lib/efi_selftest/efi_selftest_load_initrd.c +++ /dev/null @@ -1,221 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0+ -/* - * efi_selftest_load_initrd - * - * Copyright (c) 2020 Ilias Apalodimas - * - * This test checks the FileLoad2 protocol. - * A known file is read from the file system and verified. - * - * An example usage - given a file image with a file system in partition 1 - * holding file initrd - is: - * - * * Configure the sandbox with - * - * CONFIG_EFI_SELFTEST=y - * CONFIG_EFI_LOAD_FILE2_INITRD=y - * CONFIG_EFI_INITRD_FILESPEC="host 0:1 initrd" - * - * * Run ./u-boot and execute - * - * host bind 0 image - * setenv efi_selftest load initrd - * bootefi selftest - * - * This would provide a test output like: - * - * Testing EFI API implementation - * - * Selected test: 'load initrd' - * - * Setting up 'load initrd' - * Setting up 'load initrd' succeeded - * - * Executing 'load initrd' - * Loaded 12378613 bytes - * CRC32 2997478465 - * - * Now the size and CRC32 can be compared to the provided file. - */ - -#include -#include -#include - -static struct efi_boot_services *boottime; - -static struct efi_initrd_dp dp = { - .vendor = { - { - DEVICE_PATH_TYPE_MEDIA_DEVICE, - DEVICE_PATH_SUB_TYPE_VENDOR_PATH, - sizeof(dp.vendor), - }, - EFI_INITRD_MEDIA_GUID, - }, - .end = { - DEVICE_PATH_TYPE_END, - DEVICE_PATH_SUB_TYPE_END, - sizeof(dp.end), - } -}; - -static struct efi_initrd_dp dp_invalid = { - .vendor = { - { - DEVICE_PATH_TYPE_MEDIA_DEVICE, - DEVICE_PATH_SUB_TYPE_VENDOR_PATH, - sizeof(dp.vendor), - }, - EFI_INITRD_MEDIA_GUID, - }, - .end = { - 0x8f, /* invalid */ - 0xfe, /* invalid */ - sizeof(dp.end), - } -}; - -static int setup(const efi_handle_t handle, - const struct efi_system_table *systable) -{ - boottime = systable->boottime; - - return EFI_ST_SUCCESS; -} - -static int execute(void) -{ - struct efi_load_file_protocol *lf2; - struct efi_device_path *dp2, *dp2_invalid; - efi_status_t status; - efi_handle_t handle; - char buffer[64]; - efi_uintn_t buffer_size; - void *buf; - u32 crc32; - - memset(buffer, 0, sizeof(buffer)); - - dp2 = (struct efi_device_path *)&dp; - status = boottime->locate_device_path(&efi_guid_load_file2_protocol, - &dp2, &handle); - if (status != EFI_SUCCESS) { - efi_st_error("Unable to locate device path\n"); - return EFI_ST_FAILURE; - } - - status = boottime->handle_protocol(handle, - &efi_guid_load_file2_protocol, - (void **)&lf2); - if (status != EFI_SUCCESS) { - efi_st_error("Unable to locate protocol\n"); - return EFI_ST_FAILURE; - } - - /* Case 1: - * buffer_size can't be NULL - * protocol can't be NULL - */ - status = lf2->load_file(lf2, dp2, false, NULL, &buffer); - if (status != EFI_INVALID_PARAMETER) { - efi_st_error("Buffer size can't be NULL\n"); - return EFI_ST_FAILURE; - } - buffer_size = sizeof(buffer); - status = lf2->load_file(NULL, dp2, false, &buffer_size, &buffer); - if (status != EFI_INVALID_PARAMETER) { - efi_st_error("Protocol can't be NULL\n"); - return EFI_ST_FAILURE; - } - - /* - * Case 2: Match end node type/sub-type on device path - */ - dp2_invalid = (struct efi_device_path *)&dp_invalid; - buffer_size = sizeof(buffer); - status = lf2->load_file(lf2, dp2_invalid, false, &buffer_size, &buffer); - if (status != EFI_INVALID_PARAMETER) { - efi_st_error("Invalid device path type must return EFI_INVALID_PARAMETER\n"); - return EFI_ST_FAILURE; - } - - status = lf2->load_file(lf2, dp2_invalid, false, &buffer_size, &buffer); - if (status != EFI_INVALID_PARAMETER) { - efi_st_error("Invalid device path sub-type must return EFI_INVALID_PARAMETER\n"); - return EFI_ST_FAILURE; - } - - /* - * Case 3: - * BootPolicy 'true' must return EFI_UNSUPPORTED - */ - buffer_size = sizeof(buffer); - status = lf2->load_file(lf2, dp2, true, &buffer_size, &buffer); - if (status != EFI_UNSUPPORTED) { - efi_st_error("BootPolicy true must return EFI_UNSUPPORTED\n"); - return EFI_ST_FAILURE; - } - - /* - * Case: Pass buffer size as zero, firmware must return - * EFI_BUFFER_TOO_SMALL and an appropriate size - */ - buffer_size = 0; - status = lf2->load_file(lf2, dp2, false, &buffer_size, NULL); - if (status != EFI_BUFFER_TOO_SMALL || !buffer_size) { - efi_st_printf("buffer_size: %u\n", (unsigned int)buffer_size); - efi_st_printf("status: %x\n", (unsigned int)status); - efi_st_error("Buffer size not updated\n"); - return EFI_ST_FAILURE; - } - - /* - * Case: Pass buffer size as smaller than the file_size, - * firmware must return * EFI_BUFFER_TOO_SMALL and an appropriate size - */ - buffer_size = 1; - status = lf2->load_file(lf2, dp2, false, &buffer_size, &buffer); - if (status != EFI_BUFFER_TOO_SMALL || buffer_size <= 1) { - efi_st_error("Buffer size not updated\n"); - return EFI_ST_FAILURE; - } - - status = boottime->allocate_pool(EFI_BOOT_SERVICES_DATA, buffer_size, - &buf); - if (status != EFI_SUCCESS) { - efi_st_error("Cannot allocate buffer\n"); - return EFI_ST_FAILURE; - } - - /* Case: Pass correct buffer, load the file and verify checksum*/ - status = lf2->load_file(lf2, dp2, false, &buffer_size, buf); - if (status != EFI_SUCCESS) { - efi_st_error("Loading initrd failed\n"); - return EFI_ST_FAILURE; - } - - efi_st_printf("Loaded %u bytes\n", (unsigned int)buffer_size); - status = boottime->calculate_crc32(buf, buffer_size, &crc32); - if (status != EFI_SUCCESS) { - efi_st_error("Could not determine CRC32\n"); - return EFI_ST_FAILURE; - } - efi_st_printf("CRC32 %.8x\n", (unsigned int)crc32); - - status = boottime->free_pool(buf); - if (status != EFI_SUCCESS) { - efi_st_error("Cannot free buffer\n"); - return EFI_ST_FAILURE; - } - - return EFI_ST_SUCCESS; -} - -EFI_UNIT_TEST(load_initrd) = { - .name = "load initrd", - .phase = EFI_EXECUTE_BEFORE_BOOTTIME_EXIT, - .setup = setup, - .execute = execute, - .on_request = true, -}; From patchwork Sat Mar 13 21:47:33 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilias Apalodimas X-Patchwork-Id: 399599 Delivered-To: patch@linaro.org Received: by 2002:a02:8562:0:0:0:0:0 with SMTP id g89csp2272446jai; Sat, 13 Mar 2021 13:48:16 -0800 (PST) X-Google-Smtp-Source: ABdhPJwI5fVbWI9Nx3p3PCvX1ksozJf7jo57+5t3N6EKl4oCNC63fwGb7YmyFo8HulqCeRYnhn6L X-Received: by 2002:a17:906:2816:: with SMTP id r22mr15563934ejc.2.1615672096520; Sat, 13 Mar 2021 13:48:16 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1615672096; cv=none; d=google.com; s=arc-20160816; b=snUqlvzi1D+3IrJuWza6VyNfVpjjtIf6mP0fl6bJF+0VevYOaROiMWx4KF/kY3LSK7 YC5dv9aV6Xvp75W1kmkRfeIsS/DJubUaVKAdohjrXqLqbrk16YcGmZKYagQcWZIE4JUM uPS6OX7nBb7q55wuENtZVYqRLALnjJfAgMDktKsUwWM8oAvWcZuan7FxeLych/AmYMrJ Ky3nYO0tKs+O3qEWFCkKsw7Y44vWYDnwMvK3sAchO5XGzXgXe81Uc8VEQB1rbSzxavIV YWV04+sNum/PLRqiTIdeXYSV0MUmxninYTKPaKaB12oqeRSfs12E/UL/KRhUCaZ3/u8i aq2g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=lluyp91O8LViBfEHeVl02veK/6XpIIo8Y3gEQdrAVF4=; b=KI+rCAEllmWklbg7Bv5B/wWSU4fpaySE9J/Fw+nzIowX0IRqoaJFkRS14MoZDLJ9qO grDxSJ/MS/hW2r3RQUBTFjIDlq5QiYxXVAn6aAxeLJbqQC6ErGuWUlf+7JmNDD2rblKh b08zjbZg6Sf+vluxDDb4T+LQUint5rky1d5LhN43JlPMhUPb5QZmmcuzKzgmYaPVaASI JC4uI93P6367eClvFXzqk50P9YjBNGIvIq7k4DVA0MK916ffRIpDtkQgBGs2XF9C6T4V 1UiCqZx5p7GvFfy9zRH24I8NlPBWIDGZ4Z1/2xI8XjXSsu1rLuigQ+Y51WnscYeWnSLq csXw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=dlbl+ve6; spf=pass (google.com: domain of u-boot-bounces@lists.denx.de designates 85.214.62.61 as permitted sender) smtp.mailfrom=u-boot-bounces@lists.denx.de; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from phobos.denx.de (phobos.denx.de. [85.214.62.61]) by mx.google.com with ESMTPS id t14si7454796ejr.191.2021.03.13.13.48.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 13 Mar 2021 13:48:16 -0800 (PST) Received-SPF: pass (google.com: domain of u-boot-bounces@lists.denx.de designates 85.214.62.61 as permitted sender) client-ip=85.214.62.61; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=dlbl+ve6; spf=pass (google.com: domain of u-boot-bounces@lists.denx.de designates 85.214.62.61 as permitted sender) smtp.mailfrom=u-boot-bounces@lists.denx.de; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 261808284A; Sat, 13 Mar 2021 22:47:53 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="dlbl+ve6"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 9A71082829; Sat, 13 Mar 2021 22:47:50 +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=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-ej1-x632.google.com (mail-ej1-x632.google.com [IPv6:2a00:1450:4864:20::632]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 83F9482821 for ; Sat, 13 Mar 2021 22:47:47 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=ilias.apalodimas@linaro.org Received: by mail-ej1-x632.google.com with SMTP id c10so59967516ejx.9 for ; Sat, 13 Mar 2021 13:47:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=lluyp91O8LViBfEHeVl02veK/6XpIIo8Y3gEQdrAVF4=; b=dlbl+ve6IGbDGngE9KHgDLXcDVaBhpSFzN4MjkF4+NFDgM8GCTW9MrRqEIyOeRdfrL FQdGKJSiEEV7HWrSuTKtAUYBmDZYFG0Fsw8S0OocXM3UxiFws2v3BvB966kzCtUm4pLs UBV8f059+BCxHq6jxFmSstJGh2UxHu7uciHzalS2MHFPUzLJzLiJ+O6FflJORpS9c7GS S93kCUry2lGR3qzgiVxtujcfQZ5OWM4zu+bZR2NYClW2jQQZvqUxIZnLziTSoEaAjPPW rj9Gih0XpO6n8kf4m1hd6txbyICrGfg4P3lZHFG5QpwRIxDbSTI9ts8AOJEb4V6NlaAM 4eiQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=lluyp91O8LViBfEHeVl02veK/6XpIIo8Y3gEQdrAVF4=; b=pnAGfGqjFtj+pXd7MyJOu4hVoKnErVOw+EQ30D9GMTb6+yY7Xs50eRXlBT0mN+ukDe w3S1QnJFW9dajB+A8e2v+XfGtL70ea7Rsic0XgBoGiFL9DaQ1GP8H6FYhwvuz1IfWzKK JCaJxh7PM1YEh60kokQXwTSjEuz3D4JO+GV66eBmyrLQdmIxZPptD14zjU5voiml+9cY UlJfnvHfpplQ48sbRRtzrIvoCUnz4h8uGSDyRxlB6X3XOXukwN8AmK2NCaIqq+jQNUJM MuQbT/tK/jtaKL3aIAx49EpG4r5fsWs8t4oXjhOVWsPWtPR3+iI23NTIepSNHzh4PVaW Cc1Q== X-Gm-Message-State: AOAM530P2VrALRECSfakaIJHza53Es9NoqbT6h94wTNFljIaGRNwynSX /B9KcKpHnpotvVYnxw9O3oCOVw== X-Received: by 2002:a17:906:a1c8:: with SMTP id bx8mr15394351ejb.381.1615672067094; Sat, 13 Mar 2021 13:47:47 -0800 (PST) Received: from apalos.home ([2a02:587:4647:e6c6:2e56:dcff:fe9a:8f06]) by smtp.gmail.com with ESMTPSA id a9sm1571144eds.33.2021.03.13.13.47.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 13 Mar 2021 13:47:46 -0800 (PST) From: Ilias Apalodimas To: xypron.glpk@gmx.de Cc: takahiro.akashi@linaro.org, Ilias Apalodimas , Alexander Graf , Sughosh Ganu , u-boot@lists.denx.de Subject: [PATCH 2/6] efi_loader: Add device path related functions for initrd via Boot#### Date: Sat, 13 Mar 2021 23:47:33 +0200 Message-Id: <20210313214738.3257922-3-ilias.apalodimas@linaro.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210313214738.3257922-1-ilias.apalodimas@linaro.org> References: <20210313214738.3257922-1-ilias.apalodimas@linaro.org> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 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.4 at phobos.denx.de X-Virus-Status: Clean On the following patches we allow for an initrd path to be stored in Boot#### variables. Specifically we encode in the FIlePathList[] of the EFI_LOAD_OPTIONS for each Boot#### variable. The FilePathList[] array looks like this: kernel - 0xff - VenMedia(initrd GUID) - initrd1 - 0x01 initrd2 - 0xff So let's add the relevant functions to concatenate and retrieve a device path based on a Vendor GUID. Signed-off-by: Ilias Apalodimas --- include/efi_loader.h | 4 ++ lib/efi_loader/efi_device_path.c | 99 ++++++++++++++++++++++++++++++-- 2 files changed, 98 insertions(+), 5 deletions(-) -- 2.30.1 diff --git a/include/efi_loader.h b/include/efi_loader.h index f470bbd636f4..eb11a8c7d4b1 100644 --- a/include/efi_loader.h +++ b/include/efi_loader.h @@ -738,6 +738,10 @@ struct efi_load_option { const u8 *optional_data; }; +struct efi_device_path *efi_dp_from_lo(struct efi_load_option *lo, + efi_uintn_t *size, efi_guid_t guid); +struct efi_device_path *efi_dp_concat(const struct efi_device_path *dp1, + const struct efi_device_path *dp2); efi_status_t efi_deserialize_load_option(struct efi_load_option *lo, u8 *data, efi_uintn_t *size); unsigned long efi_serialize_load_option(struct efi_load_option *lo, u8 **data); diff --git a/lib/efi_loader/efi_device_path.c b/lib/efi_loader/efi_device_path.c index c9315dd45857..1f55c772dc83 100644 --- a/lib/efi_loader/efi_device_path.c +++ b/lib/efi_loader/efi_device_path.c @@ -282,11 +282,25 @@ struct efi_device_path *efi_dp_dup(const struct efi_device_path *dp) return ndp; } -struct efi_device_path *efi_dp_append(const struct efi_device_path *dp1, - const struct efi_device_path *dp2) +/** _efi_dp_append() - Append or concatenate two device paths. + * Concatenated device path will be separated by a 0xff end + * node. + * + * @dp1: First device path + * @dp2: Second device path + * + * Return: concatenated device path or NULL. Caller must free the returned + * value + */ +static struct efi_device_path *_efi_dp_append(const struct efi_device_path *dp1, + const struct efi_device_path *dp2, + bool concat) { struct efi_device_path *ret; + size_t end_size = sizeof(END); + if (concat) + end_size = 2 * sizeof(END); if (!dp1 && !dp2) { /* return an end node */ ret = efi_dp_dup(&END); @@ -298,18 +312,56 @@ struct efi_device_path *efi_dp_append(const struct efi_device_path *dp1, /* both dp1 and dp2 are non-null */ unsigned sz1 = efi_dp_size(dp1); unsigned sz2 = efi_dp_size(dp2); - void *p = dp_alloc(sz1 + sz2 + sizeof(END)); + void *p = dp_alloc(sz1 + sz2 + end_size); if (!p) return NULL; + ret = p; memcpy(p, dp1, sz1); + p += sz1; + + if (concat) { + memcpy(p, &END, sizeof(END)); + p += sizeof(END); + } + /* the end node of the second device path has to be retained */ - memcpy(p + sz1, dp2, sz2 + sizeof(END)); - ret = p; + memcpy(p, dp2, sz2); + p += sz2; + memcpy(p, &END, sizeof(END)); } return ret; } +/** efi_dp_append() - Append a device to an existing device path. + * + * @dp1: First device path + * @dp2: Second device path + * + * Return: concatenated device path or NULL. Caller must free the returned + * value + */ +struct efi_device_path *efi_dp_append(const struct efi_device_path *dp1, + const struct efi_device_path *dp2) +{ + return _efi_dp_append(dp1, dp2, false); +} + +/** efi_dp_concat() - Concatenate 2 device paths. The final device path will + * contain two device paths separated by and end node (0xff). + * + * @dp1: First device path + * @dp2: Second device path + * + * Return: concatenated device path or NULL. Caller must free the returned + * value + */ +struct efi_device_path *efi_dp_concat(const struct efi_device_path *dp1, + const struct efi_device_path *dp2) +{ + return _efi_dp_append(dp1, dp2, true); +} + struct efi_device_path *efi_dp_append_node(const struct efi_device_path *dp, const struct efi_device_path *node) { @@ -1160,3 +1212,40 @@ ssize_t efi_dp_check_length(const struct efi_device_path *dp, dp = (const struct efi_device_path *)((const u8 *)dp + len); } } + +/** + * efi_dp_from_lo() - Get the instance of a VenMedia node in a + * multi-instance device path that matches + * a specific GUID. This kind of device paths + * is found in Boot#### options describing an + * initrd location + * + * @load_option: EFI_LOAD_OPTION containing a valid device path + * @size: size of the discovered device path + * @guid: guid to search for + * + * Return: device path including the VenMedia node or NULL. + * Caller must free the returned value + */ +struct +efi_device_path *efi_dp_from_lo(struct efi_load_option *lo, + efi_uintn_t *size, efi_guid_t guid) +{ + struct efi_device_path *fp = lo->file_path; + struct efi_device_path_vendor *vendor; + int lo_len = lo->file_path_length; + + for (; lo_len >= sizeof(struct efi_device_path); + lo_len -= fp->length, fp = (void *)fp + fp->length) { + if (fp->type != DEVICE_PATH_TYPE_MEDIA_DEVICE || + fp->sub_type != DEVICE_PATH_SUB_TYPE_VENDOR_PATH) + continue; + + vendor = (struct efi_device_path_vendor *)fp; + if (!guidcmp(&vendor->guid, &guid)) + return efi_dp_dup(fp); + } + log_debug("VenMedia(%pUl) not found in %ls\n", &guid, lo->label); + + return NULL; +} From patchwork Sat Mar 13 21:47:34 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilias Apalodimas X-Patchwork-Id: 399600 Delivered-To: patch@linaro.org Received: by 2002:a02:8562:0:0:0:0:0 with SMTP id g89csp2272505jai; Sat, 13 Mar 2021 13:48:29 -0800 (PST) X-Google-Smtp-Source: ABdhPJxWnsdGWde4JKxZLPvLPWgT0l7BTWcy0x9qF2sCncS/IdymofMDG02jcrit8QrSNxExkBTm X-Received: by 2002:a17:906:4f10:: with SMTP id t16mr15821567eju.531.1615672108855; Sat, 13 Mar 2021 13:48:28 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1615672108; cv=none; d=google.com; s=arc-20160816; b=tQIOSYriYt0kFJi/Ut9QGN75kITSUm8BTzz+g9jgwodMFFSTWvM4LPSTp7hvtOvGM6 SLMlWTLPzVEF/oOkmOh8XJL3jCfiVg8DvUafL7uBl6hBDP1mJIeB9ZvYYeTFNKcCStCq Tr2jQFPd7vQEQzYQRCJci6NybDhuT3zfWHT24c5K8J61TXO5UvtmQCpooTy0ZTrGTglF S0b+P+6H9aQX0uzfFeMHB5GShbC+WdeUGxWBmkUZawMtgWFS/7odgw6CWD22+GIGWFGo JyNsSFBui0f3aacmmlfRvnR3Si1cUKhHRMrPXuvalC2fJWCwWQSINk0zWcnPq7CYr5Ip 7l2A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=ZnqTmLPK2tec982rpzAZD1Q5kUsUf1yvvxEDvurPSUs=; b=eWezrC/KjdRlLEFlrV2PjpyDG/nEU25+h3APu8IPp4CW11KGVsBNqUOGvNjHpHIedR GjKIMaWYEKRebG94wsjSBurb5I6u+aRe7+Y2dqLD+WFwMnrg5AB0FhZeHY/XGWFtNaeZ DBDoB7EAxbZCFX0gkLuWTJC5omZs4sLBS01/R7XAlISVPJfg3FzvA4al8xMlSzanXfeY A4Di+i4FryXYs6arxNm4aHNnMS5nk59bTpcZb/zZm05bh5iumLYPDSPWvT1UCVeQigyT HgFp7scg+olXZH1gb7boIxGigtuxU0TxvYBQKecNkidZni8PgIs2n9sF7GRhWRBalh9U YqeA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=ilhYmPnq; spf=pass (google.com: domain of u-boot-bounces@lists.denx.de designates 2a01:238:438b:c500:173d:9f52:ddab:ee01 as permitted sender) smtp.mailfrom=u-boot-bounces@lists.denx.de; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from phobos.denx.de (phobos.denx.de. [2a01:238:438b:c500:173d:9f52:ddab:ee01]) by mx.google.com with ESMTPS id h15si7567969edv.182.2021.03.13.13.48.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 13 Mar 2021 13:48:28 -0800 (PST) Received-SPF: pass (google.com: domain of u-boot-bounces@lists.denx.de designates 2a01:238:438b:c500:173d:9f52:ddab:ee01 as permitted sender) client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=ilhYmPnq; spf=pass (google.com: domain of u-boot-bounces@lists.denx.de designates 2a01:238:438b:c500:173d:9f52:ddab:ee01 as permitted sender) smtp.mailfrom=u-boot-bounces@lists.denx.de; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 42E908284D; Sat, 13 Mar 2021 22:47:57 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="ilhYmPnq"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 665EE82858; Sat, 13 Mar 2021 22:47:53 +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=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-ed1-x52b.google.com (mail-ed1-x52b.google.com [IPv6:2a00:1450:4864:20::52b]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id BFB4782806 for ; Sat, 13 Mar 2021 22:47:49 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=ilias.apalodimas@linaro.org Received: by mail-ed1-x52b.google.com with SMTP id j3so12936184edp.11 for ; Sat, 13 Mar 2021 13:47:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=ZnqTmLPK2tec982rpzAZD1Q5kUsUf1yvvxEDvurPSUs=; b=ilhYmPnqC0QirMIjbcz+ploMkFbv2F0lgTrCojI7P5xQ3NzzK/2Nh/+L0Ukyi6OJ3l Eg/loIMejYW6g1daDp+56Ye0kosgde9UmJYHaFObIjHYnOI4uL8ANcFAIwKv+4tIElWc zGoeD54bP4JVxcDRJ1a+LfhYn7tuoYTJRiqfRpECot7bxY6Tq7LAQJlucxlTSaTZF5zH 0ocNv7bvsGJf/cjR7H4w0NpDF5R2/fWWY2oCQxjpSNSE8jUdQKjJt9MvL5tr6cDfbTRv cWGMLdZ2BhndYDVO14eoPF+Y/T1jutocuTQP4DVfItkcK+sTkhkEzeUry3dk/H8cF7Sf SoAw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=ZnqTmLPK2tec982rpzAZD1Q5kUsUf1yvvxEDvurPSUs=; b=AcQUtKrnJH5rmVz+TNIVNnlWohZST+kkqmrvzLcpHdnI+hlaky2pt/yo7KxC3Fl2H4 Is1zFylKkC7BIz6V7n+5kZPOIuFVUnymPt7QySZLpTxjar6CHY33bWtqwSNwK8aJLdQM JntkuyK6UzM2WfVYUsk4yYXEJn0DmPrF9E2AIskLHcmv15Z1Jp1XMZfSEZYceAB0Cmko 9DpKSNWLxPt3PXuvfdDrUEcat3WeC3aCZ5YI+ebFey8WKWtyeG3/NhGj5J8zEp9r8BXe nu6DnVmNodUq4jQNPu6BAV8RItUHD1rDu2Oz2R4WuPrOLZYW3yDRO2VOKg2yWSikVIIC m/Og== X-Gm-Message-State: AOAM532bOz/4yRgp0F7kc8VxAvhSwdfTmR5g+ATWDAUz0hDp2ZFBWJEz K0omkMcBmvj16bt//AUbfnNRDg== X-Received: by 2002:a05:6402:1853:: with SMTP id v19mr21726712edy.179.1615672069422; Sat, 13 Mar 2021 13:47:49 -0800 (PST) Received: from apalos.home ([2a02:587:4647:e6c6:2e56:dcff:fe9a:8f06]) by smtp.gmail.com with ESMTPSA id a9sm1571144eds.33.2021.03.13.13.47.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 13 Mar 2021 13:47:49 -0800 (PST) From: Ilias Apalodimas To: xypron.glpk@gmx.de Cc: takahiro.akashi@linaro.org, Ilias Apalodimas , Alexander Graf , Sughosh Ganu , u-boot@lists.denx.de Subject: [PATCH 3/6 v2] efi_loader: Introduce helper functions for EFI Date: Sat, 13 Mar 2021 23:47:34 +0200 Message-Id: <20210313214738.3257922-4-ilias.apalodimas@linaro.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210313214738.3257922-1-ilias.apalodimas@linaro.org> References: <20210313214738.3257922-1-ilias.apalodimas@linaro.org> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 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.4 at phobos.denx.de X-Virus-Status: Clean A following patch introduces a different logic for loading initrd's based on the EFI_LOAD_FILE2_PROTOCOL. Since similar logic can be applied in the future for other system files (i.e DTBs), let's add some helper functions which will retrieve and parse file paths stored in EFI variables. Signed-off-by: Ilias Apalodimas --- include/efi_helper.h | 15 ++++ include/efi_loader.h | 2 + lib/efi_loader/Makefile | 1 + lib/efi_loader/efi_helper.c | 133 ++++++++++++++++++++++++++++++++ lib/efi_loader/efi_var_common.c | 33 ++++++++ 5 files changed, 184 insertions(+) create mode 100644 include/efi_helper.h create mode 100644 lib/efi_loader/efi_helper.c -- 2.30.1 diff --git a/include/efi_helper.h b/include/efi_helper.h new file mode 100644 index 000000000000..97492c65b6d2 --- /dev/null +++ b/include/efi_helper.h @@ -0,0 +1,15 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * Copyright (c) 2020, Linaro Limited + */ + +#if !defined _EFI_HELPER_H_ +#define _EFI_HELPER_H + +#include +#include + +efi_status_t efi_get_file_size(struct efi_file_handle *fh, efi_uintn_t *size); +struct efi_device_path *efi_get_dp_from_boot(const efi_guid_t guid); + +#endif diff --git a/include/efi_loader.h b/include/efi_loader.h index eb11a8c7d4b1..aa812a9a3052 100644 --- a/include/efi_loader.h +++ b/include/efi_loader.h @@ -717,6 +717,8 @@ efi_status_t EFIAPI efi_query_variable_info( u64 *remaining_variable_storage_size, u64 *maximum_variable_size); +void *efi_get_var(u16 *name, const efi_guid_t *vendor, efi_uintn_t *size); + /* * See section 3.1.3 in the v2.7 UEFI spec for more details on * the layout of EFI_LOAD_OPTION. In short it is: diff --git a/lib/efi_loader/Makefile b/lib/efi_loader/Makefile index 10b42e8847bf..da2741adecfa 100644 --- a/lib/efi_loader/Makefile +++ b/lib/efi_loader/Makefile @@ -23,6 +23,7 @@ endif obj-$(CONFIG_CMD_BOOTEFI_HELLO) += helloworld_efi.o obj-$(CONFIG_CMD_BOOTEFI_BOOTMGR) += efi_bootmgr.o obj-y += efi_boottime.o +obj-y += efi_helper.o obj-$(CONFIG_EFI_HAVE_CAPSULE_SUPPORT) += efi_capsule.o obj-$(CONFIG_EFI_CAPSULE_FIRMWARE) += efi_firmware.o obj-y += efi_console.o diff --git a/lib/efi_loader/efi_helper.c b/lib/efi_loader/efi_helper.c new file mode 100644 index 000000000000..df5bdc506dbe --- /dev/null +++ b/lib/efi_loader/efi_helper.c @@ -0,0 +1,133 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (c) 2020, Linaro Limited + */ + +#define LOG_CATEGORY LOGC_EFI +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/** + * efi_create_current_boot_var() - Return Boot#### name were #### is replaced by + * the value of BootCurrent + * + * @var_name: variable name + * @var_name_size: size of var_name + * + * Return: Status code + */ +static efi_status_t efi_create_current_boot_var(u16 var_name[], + size_t var_name_size) +{ + efi_uintn_t boot_current_size; + efi_status_t ret; + u16 boot_current; + u16 *pos; + + boot_current_size = sizeof(boot_current); + ret = efi_get_variable_int(L"BootCurrent", + &efi_global_variable_guid, NULL, + &boot_current_size, &boot_current, NULL); + if (ret != EFI_SUCCESS) + goto out; + + pos = efi_create_indexed_name(var_name, var_name_size, "Boot", + boot_current); + if (!pos) { + ret = EFI_OUT_OF_RESOURCES; + goto out; + } + +out: + return ret; +} + +/** + * efi_get_dp_from_boot() - Retrieve and return a device path from an EFI + * Boot### variable + * + * @guid: Vendor guid of the VenMedia DP + * + * Return: device path or NULL. Caller must free the returned value + */ +struct efi_device_path *efi_get_dp_from_boot(const efi_guid_t guid) +{ + struct efi_device_path *file_path = NULL; + struct efi_device_path *tmp; + struct efi_load_option lo; + void *var_value = NULL; + efi_uintn_t size; + efi_status_t ret; + u16 var_name[16]; + + ret = efi_create_current_boot_var(var_name, sizeof(var_name)); + if (ret != EFI_SUCCESS) + return NULL; + + var_value = efi_get_var(var_name, &efi_global_variable_guid, &size); + if (!var_value) + return NULL; + + ret = efi_deserialize_load_option(&lo, var_value, &size); + if (ret != EFI_SUCCESS) + goto out; + + tmp = efi_dp_from_lo(&lo, &size, guid); + if (!tmp) + goto out; + + /* efi_dp_dup will just return NULL if efi_dp_next is NULL */ + file_path = efi_dp_dup(efi_dp_next(tmp)); + +out: + efi_free_pool(tmp); + free(var_value); + + return file_path; +} + +/** + * efi_get_file_size() - Get the size of a file using an EFI file handle + * + * @handle: EFI file handle + * @size: buffer to fill in the discovered size + * + * Return: device path or NULL. Caller must free the returned value + */ +efi_status_t efi_get_file_size(struct efi_file_handle *fh, efi_uintn_t *size) +{ + struct efi_file_info *info = NULL; + efi_uintn_t bs = 0; + efi_status_t ret; + + *size = 0; + ret = EFI_CALL(fh->getinfo(fh, (efi_guid_t *)&efi_file_info_guid, &bs, + info)); + if (ret != EFI_BUFFER_TOO_SMALL) { + ret = EFI_DEVICE_ERROR; + goto out; + } + + info = malloc(bs); + if (!info) { + ret = EFI_OUT_OF_RESOURCES; + goto out; + } + ret = EFI_CALL(fh->getinfo(fh, (efi_guid_t *)&efi_file_info_guid, &bs, + info)); + if (ret != EFI_SUCCESS) + goto out; + + *size = info->file_size; + +out: + free(info); + return ret; +} diff --git a/lib/efi_loader/efi_var_common.c b/lib/efi_loader/efi_var_common.c index 1c7459266a38..b11ed91a74a4 100644 --- a/lib/efi_loader/efi_var_common.c +++ b/lib/efi_loader/efi_var_common.c @@ -9,6 +9,7 @@ #include #include #include +#include enum efi_secure_mode { EFI_MODE_SETUP, @@ -343,3 +344,35 @@ enum efi_auth_var_type efi_auth_var_get_type(u16 *name, const efi_guid_t *guid) } return EFI_AUTH_VAR_NONE; } + +/** + * efi_get_var() - read value of an EFI variable + * + * @name: variable name + * @start: vendor GUID + * @size: size of allocated buffer + * + * Return: buffer with variable data or NULL + */ +void *efi_get_var(u16 *name, const efi_guid_t *vendor, efi_uintn_t *size) +{ + efi_status_t ret; + void *buf = NULL; + + *size = 0; + ret = efi_get_variable_int(name, vendor, NULL, size, buf, NULL); + if (ret == EFI_BUFFER_TOO_SMALL) { + buf = malloc(*size); + if (!buf) + return NULL; + ret = efi_get_variable_int(name, vendor, NULL, size, buf, NULL); + } + + if (ret != EFI_SUCCESS) { + free(buf); + *size = 0; + return NULL; + } + + return buf; +} From patchwork Sat Mar 13 21:47:35 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilias Apalodimas X-Patchwork-Id: 399601 Delivered-To: patch@linaro.org Received: by 2002:a02:8562:0:0:0:0:0 with SMTP id g89csp2272558jai; Sat, 13 Mar 2021 13:48:42 -0800 (PST) X-Google-Smtp-Source: ABdhPJz0GO5a4lOIuoZaUePngH5T9IrQd6fsQpJd7z8qS6l3tb9PLVkL4yn26ccPumWuQjc67pXE X-Received: by 2002:a05:6402:440d:: with SMTP id y13mr3791176eda.316.1615672122177; Sat, 13 Mar 2021 13:48:42 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1615672122; cv=none; d=google.com; s=arc-20160816; b=Y1hEBiHTWGjTMLuqQ5mC1NoHuRTDDvKiMrryAZb+muvrZr/dFreUJrbUYhTKQgLaqO x7gd43ar5kyODyQKlmss0bNobWyZSxH2UClXVjmzk8Eq3rArZdHGPSVqYU31nBtEQL19 wtiD0vCy8N+p6sEQurmRrbu9cxULGYfIdIL47WHvuXhUIASTqSCc5KOXGwnq1KcNhYpU lVWVYq5dPdvw5stesjjCZr5MEE+pKyMGLCDxYfZB6T/RuLlh5DsfJisGvBMlodEMOi8I x80gr5eCuBY82b2U7n3krCrVsY/bqkiY9ULG6xabzHDrrQzwwLSJnnDVgM3Z3PBb8grl HXew== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=BdB98x9LWAQGjEPlumKFFYYFzSl6GlLeDyLN1MudDC8=; b=DFeHFN1H47ZWi3kmJT6bEoJNWtS2dFrJ4dLpeE3McZCqMtiQO8TNPIM0RrgF0ugszW 74vJnf7EoZAt6kznIRbFdXX+enhChHFVWXKGdlOJR/JXRIaeN2JMwCaDufixW6qr9RlL OmW35waaGs7PP9WEJ/W2qopYbjQgvvonlhMxA/t2Fa54GLKLyhyk42JuTndIRBe5DNBv uy3v/Cc9qPFMKpez2yNSF20+72ho4X98gICV7fCf2uy31he476Ag7jJ2xBDNXQJWmNMy 1aprSg+b5+DZP0I0jFwZ6QJG/EwztgbPy3ZnJqED6Nn5Ff+cI5v5kZgQkfRdq3xZIjzx 1IOg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=Qktxh2XJ; spf=pass (google.com: domain of u-boot-bounces@lists.denx.de designates 85.214.62.61 as permitted sender) smtp.mailfrom=u-boot-bounces@lists.denx.de; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from phobos.denx.de (phobos.denx.de. [85.214.62.61]) by mx.google.com with ESMTPS id z21si7791231edx.208.2021.03.13.13.48.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 13 Mar 2021 13:48:42 -0800 (PST) Received-SPF: pass (google.com: domain of u-boot-bounces@lists.denx.de designates 85.214.62.61 as permitted sender) client-ip=85.214.62.61; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=Qktxh2XJ; spf=pass (google.com: domain of u-boot-bounces@lists.denx.de designates 85.214.62.61 as permitted sender) smtp.mailfrom=u-boot-bounces@lists.denx.de; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id AD9FD82858; Sat, 13 Mar 2021 22:48:01 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="Qktxh2XJ"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 6551B8285E; Sat, 13 Mar 2021 22:47: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=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-ej1-x62c.google.com (mail-ej1-x62c.google.com [IPv6:2a00:1450:4864:20::62c]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 340CF8283C for ; Sat, 13 Mar 2021 22:47:52 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=ilias.apalodimas@linaro.org Received: by mail-ej1-x62c.google.com with SMTP id mm21so59994009ejb.12 for ; Sat, 13 Mar 2021 13:47:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=BdB98x9LWAQGjEPlumKFFYYFzSl6GlLeDyLN1MudDC8=; b=Qktxh2XJtx3pw6PRcWpXY5g0E5KIGMz8LhHigGb0L3sKcw+HLjvCLG/AnQyGL2H8WM o96jqlvZ37T9NWbK8a8XCjSp86UWY+NCS3Ere3gV5Sgo9FshjNWRWyK6MBwbBr7QX9Vg ZQnwWLoMrmL923bI8bYQtb0CGI8YU7HNuLuDD1ZFzDNfzIPMZOOTFGdS5AOLJ29Pn/DZ a2dRSuo6JfbB2j9yeQWPQPIATa+NWwpH+syfu2VweyowrkfRPv3X8rMByJJipJCfPSO3 e+ujRefwvVIwul/EvhAXoOhYZLWunij4XSbFdJj6CzTDN5pwtFoZJ3cwwjK49gkJU908 ZW/g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=BdB98x9LWAQGjEPlumKFFYYFzSl6GlLeDyLN1MudDC8=; b=a7tKoAUG3WCRnHZ1dQRZ2tWIe5OHdWmco73hAo7YDNzMIJ79iaAGtII/TGxhsZnIXe knz1dqESQA+qUm7B5mebe6bVRoJjLtYO+r5/UuDDRAglsf40HToXG5U8aHFiGdyiYtN2 PzPRa3bqWiEZ/ckpHK7r0HvawflJG0/WHuv/DdTcyUIVyXYinknxBIu1TcMMfHus3Zd7 eLNqXkv7GxnfDStGFGFhFM+KXoBBPMLKarxhzYtLhoysgt8d40ji5sOAYRB5Veu4fThA evnLvR2Pooea4kJOkZaQHOZYYcwT5JwyBJCLjkZHS21Oe4cHgjkecJKMFLdbwQOuLbKQ Fteg== X-Gm-Message-State: AOAM5309hGIwmjaTfMS//m5EPXjJX61Hly4JSXklFcL9s6ZULLtkGnZw U8eYoerNRGEidTgHSVbomtNbnw== X-Received: by 2002:a17:906:3750:: with SMTP id e16mr15661118ejc.75.1615672071797; Sat, 13 Mar 2021 13:47:51 -0800 (PST) Received: from apalos.home ([2a02:587:4647:e6c6:2e56:dcff:fe9a:8f06]) by smtp.gmail.com with ESMTPSA id a9sm1571144eds.33.2021.03.13.13.47.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 13 Mar 2021 13:47:51 -0800 (PST) From: Ilias Apalodimas To: xypron.glpk@gmx.de Cc: takahiro.akashi@linaro.org, Ilias Apalodimas , Alexander Graf , Sughosh Ganu , u-boot@lists.denx.de Subject: [PATCH 4/6 v2] efi_loader: Replace config option for initrd loading Date: Sat, 13 Mar 2021 23:47:35 +0200 Message-Id: <20210313214738.3257922-5-ilias.apalodimas@linaro.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210313214738.3257922-1-ilias.apalodimas@linaro.org> References: <20210313214738.3257922-1-ilias.apalodimas@linaro.org> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 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.4 at phobos.denx.de X-Virus-Status: Clean Up to now we install EFI_LOAD_FILE2_PROTOCOL to load an initrd unconditionally. Although we correctly return various EFI exit codes depending on the file status (i.e EFI_NO_MEDIA, EFI_NOT_FOUND etc), the kernel loader, only falls back to the cmdline interpreted initrd if the protocol is not installed. This creates a problem for EFI installers, since they won't be able to load their own initrd and continue the installation. It also makes the feature hard to use, since we can either have a single initrd or we have to recompile u-boot if the filename changes. So let's introduce a different logic that will decouple the initrd path from the config option we currently have. When defining a UEFI BootXXXX we can use the filepathlist and store a file path pointing to our initrd. Specifically the EFI spec describes: "The first element of the array is a device path that describes the device and location of the Image for this load option. Other device paths may optionally exist in the FilePathList, but their usage is OSV specific". That means we can install a device path to our initrd(s) after the loaded image looking like this: VenMedia - initrd1 - end node (0x01) initrd2 - end node (0xff) When the EFI application is launched through the bootmgr, we'll try to interpret the extra device path. If that points to a file that exists on our disk, we'll now install the load_file2 and the efi-stub will be able to use it. This opens up another path using U-Boot and defines a new boot flow. A user will be able to control the kernel/initrd pairs without explicit cmdline args or GRUB. Signed-off-by: Ilias Apalodimas --- cmd/bootefi.c | 3 + include/efi_loader.h | 1 + lib/efi_loader/Kconfig | 15 +-- lib/efi_loader/efi_bootmgr.c | 19 +++- lib/efi_loader/efi_load_initrd.c | 189 ++++++++++++++++++------------- 5 files changed, 136 insertions(+), 91 deletions(-) -- 2.30.1 Reviewed-by: Heinrich Schuchardt diff --git a/cmd/bootefi.c b/cmd/bootefi.c index 271b385edea6..cba81ffe75e4 100644 --- a/cmd/bootefi.c +++ b/cmd/bootefi.c @@ -358,6 +358,9 @@ static efi_status_t do_bootefi_exec(efi_handle_t handle, void *load_options) free(load_options); + if (IS_ENABLED(CONFIG_EFI_LOAD_FILE2_INITRD)) + efi_initrd_deregister(); + return ret; } diff --git a/include/efi_loader.h b/include/efi_loader.h index aa812a9a3052..9e57eb37ff28 100644 --- a/include/efi_loader.h +++ b/include/efi_loader.h @@ -431,6 +431,7 @@ efi_status_t efi_net_register(void); /* Called by bootefi to make the watchdog available */ efi_status_t efi_watchdog_register(void); efi_status_t efi_initrd_register(void); +void efi_initrd_deregister(void); /* Called by bootefi to make SMBIOS tables available */ /** * efi_acpi_register() - write out ACPI tables diff --git a/lib/efi_loader/Kconfig b/lib/efi_loader/Kconfig index e729f727df11..029f0e515f57 100644 --- a/lib/efi_loader/Kconfig +++ b/lib/efi_loader/Kconfig @@ -317,16 +317,11 @@ config EFI_LOAD_FILE2_INITRD bool "EFI_FILE_LOAD2_PROTOCOL for Linux initial ramdisk" default n help - Expose a EFI_FILE_LOAD2_PROTOCOL that the Linux UEFI stub can - use to load the initial ramdisk. Once this is enabled using - initrd= will stop working. - -config EFI_INITRD_FILESPEC - string "initramfs path" - default "host 0:1 initrd" - depends on EFI_LOAD_FILE2_INITRD - help - Full path of the initramfs file, e.g. mmc 0:2 initramfs.cpio.gz. + Linux v5.7 and later can make use of this option. If the boot option + selected by the UEFI boot manager specifies an existing file to be used + as initial RAM disk, a Linux specific Load File2 protocol will be + installed and Linux 5.7+ will ignore any initrd= command line + argument. config EFI_SECURE_BOOT bool "Enable EFI secure boot support" diff --git a/lib/efi_loader/efi_bootmgr.c b/lib/efi_loader/efi_bootmgr.c index 25f5cebfdb67..46c8011344b9 100644 --- a/lib/efi_loader/efi_bootmgr.c +++ b/lib/efi_loader/efi_bootmgr.c @@ -118,11 +118,13 @@ static efi_status_t try_load_entry(u16 n, efi_handle_t *handle, ret = efi_set_variable_int(L"BootCurrent", &efi_global_variable_guid, attributes, sizeof(n), &n, false); - if (ret != EFI_SUCCESS) { - if (EFI_CALL(efi_unload_image(*handle)) - != EFI_SUCCESS) - log_err("Unloading image failed\n"); - goto error; + if (ret != EFI_SUCCESS) + goto unload; + /* try to register load file2 for initrd's */ + if (IS_ENABLED(CONFIG_EFI_LOAD_FILE2_INITRD)) { + ret = efi_initrd_register(); + if (ret != EFI_SUCCESS) + goto unload; } log_info("Booting: %ls\n", lo.label); @@ -146,6 +148,13 @@ static efi_status_t try_load_entry(u16 n, efi_handle_t *handle, error: free(load_option); + return ret; + +unload: + if (EFI_CALL(efi_unload_image(*handle)) != EFI_SUCCESS) + log_err("Unloading image failed\n"); + free(load_option); + return ret; } diff --git a/lib/efi_loader/efi_load_initrd.c b/lib/efi_loader/efi_load_initrd.c index b9ee8839054f..e76de30808e3 100644 --- a/lib/efi_loader/efi_load_initrd.c +++ b/lib/efi_loader/efi_load_initrd.c @@ -5,7 +5,9 @@ #include #include +#include #include +#include #include #include #include @@ -39,41 +41,40 @@ static const struct efi_initrd_dp dp = { } }; +static efi_handle_t efi_initrd_handle; + /** - * get_file_size() - retrieve the size of initramfs, set efi status on error + * get_initrd_fp() - Get initrd device path from a FilePathList device path * - * @dev: device to read from, e.g. "mmc" - * @part: device partition, e.g. "0:1" - * @file: name of file - * @status: EFI exit code in case of failure + * @initrd_fp: the final initrd filepath * - * Return: size of file + * Return: status code. Caller must free initrd_fp */ -static loff_t get_file_size(const char *dev, const char *part, const char *file, - efi_status_t *status) +static efi_status_t get_initrd_fp(struct efi_device_path **initrd_fp) { - loff_t sz = 0; - int ret; - - ret = fs_set_blk_dev(dev, part, FS_TYPE_ANY); - if (ret) { - *status = EFI_NO_MEDIA; - goto out; - } + const efi_guid_t lf2_initrd_guid = EFI_INITRD_MEDIA_GUID; + struct efi_device_path *dp = NULL; - ret = fs_size(file, &sz); - if (ret) { - sz = 0; - *status = EFI_NOT_FOUND; - goto out; - } + /* + * if bootmgr is setup with and initrd, the device path will be + * in the FilePathList[] of our load options in Boot####. + * The first device path of the multi instance device path will + * start with a VenMedia and the initrds will follow. + * + * If the device path is not found return EFI_INVALID_PARAMETER. + * We can then use this specific return value and not install the + * protocol, while allowing the boot to continue + */ + dp = efi_get_dp_from_boot(lf2_initrd_guid); + if (!dp) + return EFI_INVALID_PARAMETER; -out: - return sz; + *initrd_fp = dp; + return EFI_SUCCESS; } /** - * efi_load_file2initrd() - load initial RAM disk + * efi_load_file2_initrd() - load initial RAM disk * * This function implements the LoadFile service of the EFI_LOAD_FILE2_PROTOCOL * in order to load an initial RAM disk requested by the Linux kernel stub. @@ -93,98 +94,120 @@ efi_load_file2_initrd(struct efi_load_file_protocol *this, struct efi_device_path *file_path, bool boot_policy, efi_uintn_t *buffer_size, void *buffer) { - char *filespec; - efi_status_t status = EFI_NOT_FOUND; - loff_t file_sz = 0, read_sz = 0; - char *dev, *part, *file; - char *pos; - int ret; + struct efi_device_path *initrd_fp = NULL; + efi_status_t ret = EFI_NOT_FOUND; + struct efi_file_handle *f; + efi_uintn_t bs; EFI_ENTRY("%p, %p, %d, %p, %p", this, file_path, boot_policy, buffer_size, buffer); - filespec = strdup(CONFIG_EFI_INITRD_FILESPEC); - if (!filespec) - goto out; - pos = filespec; - if (!this || this != &efi_lf2_protocol || !buffer_size) { - status = EFI_INVALID_PARAMETER; + ret = EFI_INVALID_PARAMETER; goto out; } if (file_path->type != dp.end.type || file_path->sub_type != dp.end.sub_type) { - status = EFI_INVALID_PARAMETER; + ret = EFI_INVALID_PARAMETER; goto out; } if (boot_policy) { - status = EFI_UNSUPPORTED; + ret = EFI_UNSUPPORTED; goto out; } - /* - * expect a string with three space separated parts: - * - * * a block device type, e.g. "mmc" - * * a device and partition identifier, e.g. "0:1" - * * a file path on the block device, e.g. "/boot/initrd.cpio.gz" - */ - dev = strsep(&pos, " "); - if (!dev) + ret = get_initrd_fp(&initrd_fp); + if (ret != EFI_SUCCESS) goto out; - part = strsep(&pos, " "); - if (!part) - goto out; - file = strsep(&pos, " "); - if (!file) + + /* Open file */ + f = efi_file_from_path(initrd_fp); + if (!f) { + EFI_PRINT("Can't find initrd specified in Boot####\n"); + ret = EFI_NOT_FOUND; goto out; + } - file_sz = get_file_size(dev, part, file, &status); - if (!file_sz) + /* Get file size */ + ret = efi_get_file_size(f, &bs); + if (ret != EFI_SUCCESS) goto out; - if (!buffer || *buffer_size < file_sz) { - status = EFI_BUFFER_TOO_SMALL; - *buffer_size = file_sz; + if (!buffer || *buffer_size < bs) { + ret = EFI_BUFFER_TOO_SMALL; + *buffer_size = bs; } else { - ret = fs_set_blk_dev(dev, part, FS_TYPE_ANY); - if (ret) { - status = EFI_NO_MEDIA; - goto out; - } - - ret = fs_read(file, map_to_sysmem(buffer), 0, *buffer_size, - &read_sz); - if (ret || read_sz != file_sz) - goto out; - *buffer_size = read_sz; - - status = EFI_SUCCESS; + ret = EFI_CALL(f->read(f, &bs, (void *)(uintptr_t)buffer)); + *buffer_size = bs; + } + +out: + efi_free_pool(initrd_fp); + EFI_CALL(f->close(f)); + return EFI_EXIT(ret); +} + +/** + * check_initrd() - Determine if the file defined as an initrd in Boot#### + * load_options device path is present + * + * Return: status code + */ +static efi_status_t check_initrd(void) +{ + struct efi_device_path *initrd_fp = NULL; + struct efi_file_handle *f; + efi_status_t ret; + + ret = get_initrd_fp(&initrd_fp); + if (ret != EFI_SUCCESS) + goto out; + + /* + * If the file is not found, but the file path is set, return an error + * and trigger the bootmgr fallback + */ + f = efi_file_from_path(initrd_fp); + if (!f) { + EFI_PRINT("Can't find initrd specified in Boot####\n"); + ret = EFI_NOT_FOUND; + goto out; } + EFI_CALL(f->close(f)); + out: - free(filespec); - return EFI_EXIT(status); + efi_free_pool(initrd_fp); + return ret; } /** * efi_initrd_register() - create handle for loading initial RAM disk * * This function creates a new handle and installs a Linux specific vendor - * device path and an EFI_LOAD_FILE_2_PROTOCOL. Linux uses the device path + * device path and an EFI_LOAD_FILE2_PROTOCOL. Linux uses the device path * to identify the handle and then calls the LoadFile service of the - * EFI_LOAD_FILE_2_PROTOCOL to read the initial RAM disk. + * EFI_LOAD_FILE2_PROTOCOL to read the initial RAM disk. * * Return: status code */ efi_status_t efi_initrd_register(void) { - efi_handle_t efi_initrd_handle = NULL; efi_status_t ret; + /* + * Allow the user to continue if Boot#### file path is not set for + * an initrd + */ + ret = check_initrd(); + if (ret == EFI_INVALID_PARAMETER) + return EFI_SUCCESS; + if (ret != EFI_SUCCESS) + return ret; + ret = EFI_CALL(efi_install_multiple_protocol_interfaces (&efi_initrd_handle, /* initramfs */ @@ -196,3 +219,17 @@ efi_status_t efi_initrd_register(void) return ret; } + +/** + * efi_initrd_register() - delete the handle for loading initial RAM disk + * + * This will delete the handle containing the Linux specific vendor device + * path and EFI_LOAD_FILE2_PROTOCOL for loading an initrd + * + * Return: status code + */ +void efi_initrd_deregister(void) +{ + efi_delete_handle(efi_initrd_handle); + efi_initrd_handle = NULL; +} From patchwork Sat Mar 13 21:47:36 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilias Apalodimas X-Patchwork-Id: 399603 Delivered-To: patch@linaro.org Received: by 2002:a02:8562:0:0:0:0:0 with SMTP id g89csp2272696jai; Sat, 13 Mar 2021 13:49:05 -0800 (PST) X-Google-Smtp-Source: ABdhPJx4vYH286EupOSWVcBi2TWcUffBxUepuUoY4/Yddr+/UKBL7+w92G/MSPo60xygOb3dL6I6 X-Received: by 2002:aa7:c7c3:: with SMTP id o3mr22197666eds.8.1615672145681; Sat, 13 Mar 2021 13:49:05 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1615672145; cv=none; d=google.com; s=arc-20160816; b=O66SNLNhzvUiEbWPxRI4n/81z5PlCUbCsmOkRhsmVs1FWKIHkI+58mt2QLudj7BATj XokOFu8xQqDAfj0hidNZnaFSWcyx1jK4bI/i8+xxLVuC0eV8F2S1WWBguc9UzwQRIEk+ C0U8aXkLFQ4V9SCJDvHJQsMskSClrtKqL/gegz60g/hmu9HCBBR8eixB/4kqiY8u9Y7Q w+8OkU8TXZ9hkuuBYDUud/X6knyegfh7Lo0iLrwB67E6ypHz7BDeOWtEdNkwc2Cv/5/S QNJWzqaIegOLZEjVWO4AfuNIfcmyR9q5lxh/y8Vp4M0M5ATkSVjXvCYiDCJcklDe41Te 4IDQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=wPYln86tgcXy3izEtVO0osSR27ceaNRV4De9E3sFEUE=; b=pvBn8w9OOpjNJXHGcmkA4EeRhoMbAIttYIj+jq641ikq1eVx4OtsSUxHPKmv0Z4mby goYebxCKNWOXKd1CamBpfTKWKnlo8qzqIHruWJdww2Ezw2WSUlKnbLM3W8xGAApa/nWR ymxClHXp8d7Cb1QbIOXZb3acOuhC33RGn1W9l+Hr9RoGc17iX+zb19dMfrIw+z82f/KQ YS8sgpHMJ5auzdJUXrgz+jjDr4wA1jNmw9spQVj7rzpIXrK4x+IVvGI9tvMApVa4/8Gr lxqgz4SOF9Vy+h4EOWnDEhMMSqti07icWRuWg8knIRDiMaDADj0SEDQJseOfgg1aY4Z3 qPzA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=wKM826dI; spf=pass (google.com: domain of u-boot-bounces@lists.denx.de designates 85.214.62.61 as permitted sender) smtp.mailfrom=u-boot-bounces@lists.denx.de; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from phobos.denx.de (phobos.denx.de. [85.214.62.61]) by mx.google.com with ESMTPS id 5si7860882ejn.116.2021.03.13.13.49.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 13 Mar 2021 13:49:05 -0800 (PST) Received-SPF: pass (google.com: domain of u-boot-bounces@lists.denx.de designates 85.214.62.61 as permitted sender) client-ip=85.214.62.61; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=wKM826dI; spf=pass (google.com: domain of u-boot-bounces@lists.denx.de designates 85.214.62.61 as permitted sender) smtp.mailfrom=u-boot-bounces@lists.denx.de; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id CAC4582897; Sat, 13 Mar 2021 22:48:08 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="wKM826dI"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id D84408285E; Sat, 13 Mar 2021 22:48:00 +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=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,SPF_HELO_NONE autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-ej1-x634.google.com (mail-ej1-x634.google.com [IPv6:2a00:1450:4864:20::634]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 8C4B282858 for ; Sat, 13 Mar 2021 22:47:54 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=ilias.apalodimas@linaro.org Received: by mail-ej1-x634.google.com with SMTP id r17so60032488ejy.13 for ; Sat, 13 Mar 2021 13:47:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=wPYln86tgcXy3izEtVO0osSR27ceaNRV4De9E3sFEUE=; b=wKM826dIXzQ4d52NxU8+IXTmxUexPHueqF92x3azEGWQ5XMYK2PUN62D1I9xiqqTpz nQds5o+016XUG7VJLjKFtGjBd6Rc9py/dzQiPdRxU4HiLbzCaHbVY4uJ1+Wy4rkunpuh a64YR90PJYwAaIKcdCx73yptDmNvzpZMGCdqi7alDqB9an2HlCY0ImT3IdUFdDU7+TjH jaBMbjAN3dvSchZ1SwV2mv5UyhWR7HEXlsWVizXcZPjLtLOCdDYmU0+0q3JKan7j73Y3 pvEXxtR+cT0/LzIDCDH/Gkli33nnuYKEQhCbtbQZeaorEEWZlCGd3es9yk53g+BhjrGr G+lw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=wPYln86tgcXy3izEtVO0osSR27ceaNRV4De9E3sFEUE=; b=pW9mu7rUgLxg2rvioNmJ9sdQL9ZOofK4YrcUB+AHS59D91bVYrD6fWIK/iSTbo/bm6 NDJ9cfr54XgPOPCy3hTd14Me1sBt5uSHKBmrPePf192I3Xqi555P2+SfwVp8fmd3TgFI LT6XMbQwS/n69K2D9ArhSmhVCGcEk9BTF74t3S0KMPSafaGG8tBkaxD3PFkbSw/vU2Ie KoY5U8MzT+TZvzYs/o/A369UGigQHBdPXcREfsgARcqfUkPo5+PFN1U5goTgfnrwN74e C1leq4hDs4587Iw97+saXCEv7Nj7LIu2mABHSDGunb8dbWK+fYIQM/kpnmvwr7oyj2/Q NV5g== X-Gm-Message-State: AOAM531Lj+7ozCbn7owi0PSkIpF0PaAuPAmvMOLFE6Q3QOL1HLsmOEsf Pgf+Td/EsfA2wtsuJB+Va5CqtA== X-Received: by 2002:a17:906:f12:: with SMTP id z18mr15851976eji.132.1615672074134; Sat, 13 Mar 2021 13:47:54 -0800 (PST) Received: from apalos.home ([2a02:587:4647:e6c6:2e56:dcff:fe9a:8f06]) by smtp.gmail.com with ESMTPSA id a9sm1571144eds.33.2021.03.13.13.47.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 13 Mar 2021 13:47:53 -0800 (PST) From: Ilias Apalodimas To: xypron.glpk@gmx.de Cc: takahiro.akashi@linaro.org, Ilias Apalodimas , Alexander Graf , Sughosh Ganu , u-boot@lists.denx.de Subject: [PATCH 5/6 v2] efidebug: add multiple device path instances on Boot#### Date: Sat, 13 Mar 2021 23:47:36 +0200 Message-Id: <20210313214738.3257922-6-ilias.apalodimas@linaro.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210313214738.3257922-1-ilias.apalodimas@linaro.org> References: <20210313214738.3257922-1-ilias.apalodimas@linaro.org> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 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.4 at phobos.denx.de X-Virus-Status: Clean The UEFI spec allow a packed array of UEFI device paths in the FilePathList[] of an EFI_LOAD_OPTION. The first file path must describe the loaded image but the rest are OS specific. Previous patches parse the device path and try to use the second member of the array as an initrd. So let's modify efidebug slightly and install the second file described in the command line as the initrd device path. Signed-off-by: Ilias Apalodimas --- cmd/efidebug.c | 194 ++++++++++++++---- doc/board/emulation/qemu_capsule_update.rst | 4 +- doc/uefi/uefi.rst | 2 +- .../test_efi_capsule/test_capsule_firmware.py | 6 +- test/py/tests/test_efi_secboot/test_signed.py | 16 +- .../test_efi_secboot/test_signed_intca.py | 8 +- .../tests/test_efi_secboot/test_unsigned.py | 8 +- 7 files changed, 180 insertions(+), 58 deletions(-) -- 2.30.1 diff --git a/cmd/efidebug.c b/cmd/efidebug.c index bbbcb0a54643..223cffa389fb 100644 --- a/cmd/efidebug.c +++ b/cmd/efidebug.c @@ -9,6 +9,8 @@ #include #include #include +#include +#include #include #include #include @@ -19,6 +21,7 @@ #include #include #include +#include #define BS systab.boottime #define RT systab.runtime @@ -794,6 +797,66 @@ static int do_efi_show_tables(struct cmd_tbl *cmdtp, int flag, return CMD_RET_SUCCESS; } +/** + * add_initrd_instance() - Append a device path to load_options pointing to an + * inirtd + * + * @dev: Device + * @part: Partition of thge disk + * @file: Filename + * @fp: Device Path containing the existing load_options + * @fp_size: New size of the device path after the addition + * Return: Pointer to the device path or ERR_PTR + * + */ +static +struct efi_device_path *add_initrd_instance(const char *dev, const char *part, + const char *file, + const struct efi_device_path *fp, + efi_uintn_t *fp_size) +{ + struct efi_device_path *tmp_dp = NULL, *tmp_fp = NULL; + struct efi_device_path *final_fp = NULL, *initrd_dp = NULL; + efi_status_t ret; + const struct efi_initrd_dp id_dp = { + .vendor = { + { + DEVICE_PATH_TYPE_MEDIA_DEVICE, + DEVICE_PATH_SUB_TYPE_VENDOR_PATH, + sizeof(id_dp.vendor), + }, + EFI_INITRD_MEDIA_GUID, + }, + .end = { + DEVICE_PATH_TYPE_END, + DEVICE_PATH_SUB_TYPE_END, + sizeof(id_dp.end), + } + }; + + ret = efi_dp_from_name(dev, part, file, &tmp_dp, &tmp_fp); + if (ret != EFI_SUCCESS) { + printf("Cannot create device path for \"%s %s\"\n", part, file); + goto out; + } + + initrd_dp = efi_dp_append((const struct efi_device_path *)&id_dp, + tmp_fp); + if (!initrd_dp) { + printf("Cannot append media vendor device path path\n"); + goto out; + } + final_fp = efi_dp_concat(fp, initrd_dp); + *fp_size = efi_dp_size(fp) + efi_dp_size(initrd_dp) + + (2 * sizeof(struct efi_device_path)); + +out: + efi_free_pool(initrd_dp); + efi_free_pool(tmp_dp); + efi_free_pool(tmp_fp); + return final_fp ? final_fp : ERR_PTR(-EINVAL); +} + /** * do_efi_boot_add() - set UEFI load option * @@ -806,7 +869,9 @@ static int do_efi_show_tables(struct cmd_tbl *cmdtp, int flag, * * Implement efidebug "boot add" sub-command. Create or change UEFI load option. * - * efidebug boot add