From patchwork Sat Jul 11 22:05:28 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 1327423 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=Xgi68ud2; 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 4B43tV4tXRz9sRK for ; Sun, 12 Jul 2020 08:07:30 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 8DEE5821CB; Sun, 12 Jul 2020 00:06:55 +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="Xgi68ud2"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 9B83181F11; Sun, 12 Jul 2020 00:06:21 +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, T_FILL_THIS_FORM_SHORT,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mout.gmx.net (mout.gmx.net [212.227.15.15]) (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 4A05C81F3E for ; Sun, 12 Jul 2020 00:06:06 +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=1594505163; bh=iyVpEJ01HSOFf/PbyQUS+9Gbd5iyckVZV/Dk5yIKP4M=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=Xgi68ud2BqCFIy0GHp2GNFpAnRTlFzzPl6sSYEztP7DYpIJePuylsTp7Eh45uy6Ku cPgvGQANT8troW+oZEy5lcFow5xyj0tjPbIanj1DwttL7GyF4YfiUXlp7VHs29ahAJ yW5nGISmRYao1tQnBSrXY/2Se2CRXlDdxih+CYq8= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from LT02.fritz.box ([88.152.145.75]) by mail.gmx.com (mrgmx005 [212.227.17.184]) with ESMTPSA (Nemesis) id 1MFKGZ-1k5bus2jRB-00Fjey; Sun, 12 Jul 2020 00:06:03 +0200 From: Heinrich Schuchardt To: Alexander Graf Cc: Ilias Apalodimas , u-boot@lists.denx.de, AKASHI Takahiro , Heinrich Schuchardt Subject: [PATCH v4 01/17] efi_loader: prepare for read only OP-TEE variables Date: Sun, 12 Jul 2020 00:05:28 +0200 Message-Id: <20200711220544.120976-2-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200711220544.120976-1-xypron.glpk@gmx.de> References: <20200711220544.120976-1-xypron.glpk@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:cHBFQckKX2fHBbFdEK9UGRVR6EhuAd5d6bSvz9lFDxAGIb9XHN2 ZDvV/XEc5sqk9iafD6KLU07SxrEkAScF0bUgQbJqlzm/Na/TfWZx1ktnwWvK4BxP82YXp+v wFkxqEl6S4gREE/0fSfVfdOiwRZhK6faU37v8XtOG/cPHBz9rmfh4mKBK5oDWaPT836huKu g7Br3bqY2x0VJzc97EtKg== X-UI-Out-Filterresults: notjunk:1;V03:K0:AFxH4dYFWSE=:oP6PJYf4rYAzEZpcLEs6rH qprUrgZFOvUhp5mk8HNBPqIfZp8P7ZSD7xUX2f8s4AkulFO0AGYxiD/pHoXVgnsI48MzczFOR pSI7C1YDVbb23unrBD17OWqAkCSDBF3HJR3hZ1uMK7s2bzmf67Eoz9Hit0HKSLgLbJZuMUBMD 7XsTYGaTItH7B4zm+bjLBJvD8c5m+S2old7DZlocNecVGXaUXv+5Yro6NeQqo6QkRjpqHFg2a lQNuFo3grfJlJWsIR8xCUkUQsk9bt4O6Pw+T1hvN71jhIQjUgzgWW7UcOOLH6sdy8/FJFQ20d 2mZ/XbPvDmCzy3YIf3/uhWxslMnHN5T0j4rgyRMtZmduDDVa0c756f66aVwXKHxDefk3+/Xry KB+oBOkmyXdCCgQ21KTNIhKS+Ve9TtQK6Kj3aTty3qn0wtIhTVfWec0svP7AEeB4jeO8+HSRK fx0Zhyptf3llPC/PI0f9iqYOiz7W2ZQSOnhjeQNIe3WDakPwn/Lh262ZTAUjm1GGZJ8jZND/x mxaBv7YgvrVMklT9FUnotH3kvX30GPb37CBIpLUfBXrl8SDVeZO+ZvqBFMijj2QKToQtrTHT9 jzSXyfs5vpIizCEUnCSvx6vJTdzL1D0cpPytvwd0Q2yUx3+1e7c6JnZPWpyIw+szjLEvwNDG0 FmSBy7NzyEfVge1Yj+/bIg1hNP78gEzzbDP5BoFCGYcR7gOucL4ItM6OHsihS7sWQq4P0Qunq mCqKGGdb0XWLKf0u/bjfVPw/77POE0fY6CkNadP0UdHQ/Xg13GTrAQF6whI0s36eqaOu3GKik 0h1WVPkjuhrgP0jYM2yJdnnzJfNiDfWPKvEo7yqYsFh1GA5TAxzULu3VWZXubB9bFk5R0g/Ce /mKZJ0L8T9FekL79GRZ36eJ7zBjLRSwUT0VTMCOkW/cu3HyXw0Ct8FUJg8ONHNh0XXOEFNi4V 1x/gIwBG4TyNiU/1PNLJs47lfNh8Ezzr5+0oGoIUnRGqNEjOGrP3WLtwfEuGfgzJeO4KL5IPW jmOi9PVl2LDdBKKxCBsvVHIqN+FZfOn17LG5SbUr50Ho/1n9PhzX/uDsq09Ce9qdOcetTkh/A DWuFjdE7OKZ1oZQmydsy7R6J2Pr3PdoCTyN5qWsiYw643xo4ukYodJ0UoGnyWoPcQfaMcAiHy j29TxonDaR955eVp/gvdCGfyYFPTf7eaRvKCRq12wWOjv74FR6T3wHeBD2tEtV0FhYvFOx55b Vaj4cKnMqDIXX8puuPDk+HR+/L8WdDCYfsn407Q== 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.3 at phobos.denx.de X-Virus-Status: Clean We currently have two implementations of UEFI variables: * variables provided via an OP-TEE module * variables stored in the U-Boot environment Read only variables are up to now only implemented in the U-Boot environment implementation. Provide a common interface for both implementations that allows handling read-only variables. As variable access is limited to very few source files put variable related definitions into new include efi_variable.h instead of efi_loader. Signed-off-by: Heinrich Schuchardt --- doc/api/efi.rst | 2 + include/efi_variable.h | 43 ++++++++ lib/efi_loader/Makefile | 1 + lib/efi_loader/efi_var_common.c | 78 +++++++++++++ lib/efi_loader/efi_variable.c | 175 ++++++++---------------------- lib/efi_loader/efi_variable_tee.c | 75 ++++--------- 6 files changed, 193 insertions(+), 181 deletions(-) create mode 100644 include/efi_variable.h create mode 100644 lib/efi_loader/efi_var_common.c -- 2.27.0 diff --git a/doc/api/efi.rst b/doc/api/efi.rst index d5114f05b3..cb2a1c897e 100644 --- a/doc/api/efi.rst +++ b/doc/api/efi.rst @@ -93,6 +93,8 @@ Runtime services Variable services ~~~~~~~~~~~~~~~~~ +.. kernel-doc:: include/efi_variable.h + :internal: .. kernel-doc:: lib/efi_loader/efi_variable.c :internal: diff --git a/include/efi_variable.h b/include/efi_variable.h new file mode 100644 index 0000000000..6789118eba --- /dev/null +++ b/include/efi_variable.h @@ -0,0 +1,43 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * Copyright (c) 2020, Heinrich Schuchardt + */ + +#ifndef _EFI_VARIABLE_H +#define _EFI_VARIABLE_H + +#include + +#define EFI_VARIABLE_READ_ONLY BIT(31) + +/** + * efi_get_variable() - retrieve value of a UEFI variable + * + * @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 + * @timep: authentication time (seconds since start of epoch) + * 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, u64 *timep); + +/** + * efi_set_variable() - set value of a UEFI variable + * + * @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 + * @ro_check: check the read only read only bit in attributes + * 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, bool ro_check); + +#endif diff --git a/lib/efi_loader/Makefile b/lib/efi_loader/Makefile index 57c7e66ea0..7eddd7ef37 100644 --- a/lib/efi_loader/Makefile +++ b/lib/efi_loader/Makefile @@ -35,6 +35,7 @@ obj-y += efi_root_node.o obj-y += efi_runtime.o obj-y += efi_setup.o obj-$(CONFIG_EFI_UNICODE_COLLATION_PROTOCOL2) += efi_unicode_collation.o +obj-y += efi_var_common.o ifeq ($(CONFIG_EFI_MM_COMM_TEE),y) obj-y += efi_variable_tee.o else diff --git a/lib/efi_loader/efi_var_common.c b/lib/efi_loader/efi_var_common.c new file mode 100644 index 0000000000..6a4efa3f27 --- /dev/null +++ b/lib/efi_loader/efi_var_common.c @@ -0,0 +1,78 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * UEFI runtime variable services + * + * Copyright (c) 2020, Heinrich Schuchardt + */ + +#include +#include +#include + +/** + * efi_efi_get_variable() - retrieve value of a UEFI variable + * + * This function implements the GetVariable runtime service. + * + * See the Unified Extensible Firmware Interface (UEFI) specification for + * details. + * + * @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 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); + + ret = efi_get_variable_int(variable_name, vendor, attributes, + data_size, data, NULL); + + /* Remove EFI_VARIABLE_READ_ONLY flag */ + if (attributes) + *attributes &= EFI_VARIABLE_MASK; + + return EFI_EXIT(ret); +} + +/** + * efi_set_variable() - set value of a UEFI variable + * + * This function implements the SetVariable runtime service. + * + * See the Unified Extensible Firmware Interface (UEFI) specification for + * details. + * + * @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 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); + + /* Make sure that the EFI_VARIABLE_READ_ONLY flag is not set */ + if (attributes & ~(u32)EFI_VARIABLE_MASK) + ret = EFI_INVALID_PARAMETER; + else + ret = efi_set_variable_int(variable_name, vendor, attributes, + data_size, data, true); + + return EFI_EXIT(ret); +} diff --git a/lib/efi_loader/efi_variable.c b/lib/efi_loader/efi_variable.c index efaba869ef..6ec1f97326 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 @@ -15,7 +16,6 @@ #include #include #include -#include #include #include @@ -30,21 +30,6 @@ static bool efi_secure_boot; static enum efi_secure_mode efi_secure_mode; static u8 efi_vendor_keys; -#define READ_ONLY BIT(31) - -static efi_status_t efi_get_variable_common(u16 *variable_name, - const efi_guid_t *vendor, - u32 *attributes, - efi_uintn_t *data_size, void *data, - u64 *timep); - -static efi_status_t efi_set_variable_common(u16 *variable_name, - const efi_guid_t *vendor, - u32 attributes, - efi_uintn_t data_size, - const void *data, - bool ro_check); - /* * Mapping between EFI variables and u-boot variables: * @@ -155,7 +140,7 @@ static const char *parse_attr(const char *str, u32 *attrp, u64 *timep) str++; if ((s = prefix(str, "ro"))) { - attr |= READ_ONLY; + attr |= EFI_VARIABLE_READ_ONLY; } else if ((s = prefix(str, "nv"))) { attr |= EFI_VARIABLE_NON_VOLATILE; } else if ((s = prefix(str, "boot"))) { @@ -203,29 +188,29 @@ static efi_status_t efi_set_secure_state(u8 secure_boot, u8 setup_mode, attributes = EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | - READ_ONLY; - ret = efi_set_variable_common(L"SecureBoot", &efi_global_variable_guid, - attributes, sizeof(secure_boot), - &secure_boot, false); + EFI_VARIABLE_READ_ONLY; + ret = efi_set_variable_int(L"SecureBoot", &efi_global_variable_guid, + attributes, sizeof(secure_boot), + &secure_boot, false); if (ret != EFI_SUCCESS) goto err; - ret = efi_set_variable_common(L"SetupMode", &efi_global_variable_guid, - attributes, sizeof(setup_mode), - &setup_mode, false); + ret = efi_set_variable_int(L"SetupMode", &efi_global_variable_guid, + attributes, sizeof(setup_mode), + &setup_mode, false); if (ret != EFI_SUCCESS) goto err; - ret = efi_set_variable_common(L"AuditMode", &efi_global_variable_guid, - attributes, sizeof(audit_mode), - &audit_mode, false); + ret = efi_set_variable_int(L"AuditMode", &efi_global_variable_guid, + attributes, sizeof(audit_mode), + &audit_mode, false); if (ret != EFI_SUCCESS) goto err; - ret = efi_set_variable_common(L"DeployedMode", - &efi_global_variable_guid, attributes, - sizeof(deployed_mode), &deployed_mode, - false); + ret = efi_set_variable_int(L"DeployedMode", + &efi_global_variable_guid, attributes, + sizeof(deployed_mode), &deployed_mode, + false); err: return ret; } @@ -235,7 +220,7 @@ err: * @mode: new state * * Depending on @mode, secure boot related variables are updated. - * Those variables are *read-only* for users, efi_set_variable_common() + * Those variables are *read-only* for users, efi_set_variable_int() * is called here. * * Return: status code @@ -254,10 +239,10 @@ static efi_status_t efi_transfer_secure_state(enum efi_secure_mode mode) efi_secure_boot = true; } else if (mode == EFI_MODE_AUDIT) { - ret = efi_set_variable_common(L"PK", &efi_global_variable_guid, - EFI_VARIABLE_BOOTSERVICE_ACCESS | - EFI_VARIABLE_RUNTIME_ACCESS, - 0, NULL, false); + ret = efi_set_variable_int(L"PK", &efi_global_variable_guid, + EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_RUNTIME_ACCESS, + 0, NULL, false); if (ret != EFI_SUCCESS) goto err; @@ -309,8 +294,8 @@ static efi_status_t efi_init_secure_state(void) */ size = 0; - ret = efi_get_variable_common(L"PK", &efi_global_variable_guid, - NULL, &size, NULL, NULL); + ret = efi_get_variable_int(L"PK", &efi_global_variable_guid, + NULL, &size, NULL, NULL); if (ret == EFI_BUFFER_TOO_SMALL) { if (IS_ENABLED(CONFIG_EFI_SECURE_BOOT)) mode = EFI_MODE_USER; @@ -327,13 +312,13 @@ static efi_status_t efi_init_secure_state(void) ret = efi_transfer_secure_state(mode); if (ret == EFI_SUCCESS) - ret = efi_set_variable_common(L"VendorKeys", - &efi_global_variable_guid, - EFI_VARIABLE_BOOTSERVICE_ACCESS | - EFI_VARIABLE_RUNTIME_ACCESS | - READ_ONLY, - sizeof(efi_vendor_keys), - &efi_vendor_keys, false); + ret = efi_set_variable_int(L"VendorKeys", + &efi_global_variable_guid, + EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_RUNTIME_ACCESS | + EFI_VARIABLE_READ_ONLY, + sizeof(efi_vendor_keys), + &efi_vendor_keys, false); err: return ret; @@ -599,11 +584,9 @@ static efi_status_t efi_variable_authenticate(u16 *variable, } #endif /* CONFIG_EFI_SECURE_BOOT */ -static efi_status_t efi_get_variable_common(u16 *variable_name, - const efi_guid_t *vendor, - u32 *attributes, - efi_uintn_t *data_size, void *data, - u64 *timep) +efi_status_t efi_get_variable_int(u16 *variable_name, const efi_guid_t *vendor, + u32 *attributes, efi_uintn_t *data_size, + void *data, u64 *timep) { char *native_name; efi_status_t ret; @@ -684,40 +667,11 @@ static efi_status_t efi_get_variable_common(u16 *variable_name, out: if (attributes) - *attributes = attr & EFI_VARIABLE_MASK; + *attributes = attr; return ret; } -/** - * efi_efi_get_variable() - retrieve value of a UEFI variable - * - * This function implements the GetVariable runtime service. - * - * See the Unified Extensible Firmware Interface (UEFI) specification for - * details. - * - * @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 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); - - ret = efi_get_variable_common(variable_name, vendor, attributes, - data_size, data, NULL); - return EFI_EXIT(ret); -} - static char *efi_variables_list; static char *efi_cur_variable; @@ -881,12 +835,9 @@ efi_status_t EFIAPI efi_get_next_variable_name(efi_uintn_t *variable_name_size, return EFI_EXIT(ret); } -static efi_status_t efi_set_variable_common(u16 *variable_name, - const efi_guid_t *vendor, - u32 attributes, - efi_uintn_t data_size, - const void *data, - bool ro_check) +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, bool ro_check) { char *native_name = NULL, *old_data = NULL, *val = NULL, *s; efi_uintn_t old_size; @@ -909,15 +860,15 @@ static efi_status_t efi_set_variable_common(u16 *variable_name, /* check if a variable exists */ old_size = 0; attr = 0; - ret = efi_get_variable_common(variable_name, vendor, &attr, - &old_size, NULL, &time); + ret = efi_get_variable_int(variable_name, vendor, &attr, + &old_size, NULL, &time); append = !!(attributes & EFI_VARIABLE_APPEND_WRITE); attributes &= ~(u32)EFI_VARIABLE_APPEND_WRITE; delete = !append && (!data_size || !attributes); /* check attributes */ if (old_size) { - if (ro_check && (attr & READ_ONLY)) { + if (ro_check && (attr & EFI_VARIABLE_READ_ONLY)) { ret = EFI_WRITE_PROTECTED; goto err; } @@ -925,8 +876,8 @@ static efi_status_t efi_set_variable_common(u16 *variable_name, /* attributes won't be changed */ if (!delete && ((ro_check && attr != attributes) || - (!ro_check && ((attr & ~(u32)READ_ONLY) - != (attributes & ~(u32)READ_ONLY))))) { + (!ro_check && ((attr & ~(u32)EFI_VARIABLE_READ_ONLY) + != (attributes & ~(u32)EFI_VARIABLE_READ_ONLY))))) { ret = EFI_INVALID_PARAMETER; goto err; } @@ -1000,8 +951,8 @@ static efi_status_t efi_set_variable_common(u16 *variable_name, ret = EFI_OUT_OF_RESOURCES; goto err; } - ret = efi_get_variable_common(variable_name, vendor, - &attr, &old_size, old_data, NULL); + ret = efi_get_variable_int(variable_name, vendor, + &attr, &old_size, old_data, NULL); if (ret != EFI_SUCCESS) goto err; } else { @@ -1021,7 +972,7 @@ static efi_status_t efi_set_variable_common(u16 *variable_name, /* * store attributes */ - attributes &= (READ_ONLY | + attributes &= (EFI_VARIABLE_READ_ONLY | EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | @@ -1030,7 +981,7 @@ static efi_status_t efi_set_variable_common(u16 *variable_name, while (attributes) { attr = 1 << (ffs(attributes) - 1); - if (attr == READ_ONLY) { + if (attr == EFI_VARIABLE_READ_ONLY) { s += sprintf(s, "ro"); } else if (attr == EFI_VARIABLE_NON_VOLATILE) { s += sprintf(s, "nv"); @@ -1084,12 +1035,12 @@ out: /* update VendorKeys */ if (vendor_keys_modified & efi_vendor_keys) { efi_vendor_keys = 0; - ret = efi_set_variable_common( + ret = efi_set_variable_int( L"VendorKeys", &efi_global_variable_guid, EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS - | READ_ONLY, + | EFI_VARIABLE_READ_ONLY, sizeof(efi_vendor_keys), &efi_vendor_keys, false); @@ -1106,36 +1057,6 @@ err: return ret; } -/** - * efi_set_variable() - set value of a UEFI variable - * - * This function implements the SetVariable runtime service. - * - * See the Unified Extensible Firmware Interface (UEFI) specification for - * details. - * - * @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 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); - - /* READ_ONLY bit is not part of API */ - attributes &= ~(u32)READ_ONLY; - - return EFI_EXIT(efi_set_variable_common(variable_name, vendor, - attributes, data_size, data, - true)); -} - /** * efi_query_variable_info() - get information about EFI variables * diff --git a/lib/efi_loader/efi_variable_tee.c b/lib/efi_loader/efi_variable_tee.c index 1d127720cd..1d6d4fe807 100644 --- a/lib/efi_loader/efi_variable_tee.c +++ b/lib/efi_loader/efi_variable_tee.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -243,24 +244,9 @@ out: return ret; } -/** - * efi_get_variable() - retrieve value of a UEFI variable - * - * This function implements the GetVariable runtime service. - * - * See the Unified Extensible Firmware Interface (UEFI) specification for - * details. - * - * @name: name of the variable - * @guid: vendor GUID - * @attr: 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 EFIAPI efi_get_variable(u16 *name, const efi_guid_t *guid, - u32 *attr, 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, u64 *timep) { struct smm_variable_access *var_acc; efi_uintn_t payload_size; @@ -269,15 +255,13 @@ efi_status_t EFIAPI efi_get_variable(u16 *name, const efi_guid_t *guid, u8 *comm_buf = NULL; efi_status_t ret; - EFI_ENTRY("\"%ls\" %pUl %p %p %p", name, guid, attr, data_size, data); - - if (!name || !guid || !data_size) { + if (!variable_name || !vendor || !data_size) { ret = EFI_INVALID_PARAMETER; goto out; } /* Check payload size */ - name_size = u16_strsize(name); + name_size = u16_strsize(variable_name); if (name_size > max_payload_size - MM_VARIABLE_ACCESS_HEADER_SIZE) { ret = EFI_INVALID_PARAMETER; goto out; @@ -300,11 +284,11 @@ efi_status_t EFIAPI efi_get_variable(u16 *name, const efi_guid_t *guid, goto out; /* Fill in contents */ - guidcpy(&var_acc->guid, guid); + guidcpy(&var_acc->guid, vendor); var_acc->data_size = tmp_dsize; var_acc->name_size = name_size; - var_acc->attr = attr ? *attr : 0; - memcpy(var_acc->name, name, name_size); + var_acc->attr = attributes ? *attributes : 0; + memcpy(var_acc->name, variable_name, name_size); /* Communicate */ ret = mm_communicate(comm_buf, payload_size); @@ -315,8 +299,8 @@ efi_status_t EFIAPI efi_get_variable(u16 *name, const efi_guid_t *guid, if (ret != EFI_SUCCESS) goto out; - if (attr) - *attr = var_acc->attr; + if (attributes) + *attributes = var_acc->attr; if (data) memcpy(data, (u8 *)var_acc->name + var_acc->name_size, var_acc->data_size); @@ -325,7 +309,7 @@ efi_status_t EFIAPI efi_get_variable(u16 *name, const efi_guid_t *guid, out: free(comm_buf); - return EFI_EXIT(ret); + return ret; } /** @@ -415,24 +399,9 @@ out: return EFI_EXIT(ret); } -/** - * efi_set_variable() - set value of a UEFI variable - * - * This function implements the SetVariable runtime service. - * - * See the Unified Extensible Firmware Interface (UEFI) specification for - * details. - * - * @name: name of the variable - * @guid: vendor GUID - * @attr: 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 EFIAPI efi_set_variable(u16 *name, const efi_guid_t *guid, - u32 attr, 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, bool ro_check) { struct smm_variable_access *var_acc; efi_uintn_t payload_size; @@ -440,9 +409,7 @@ efi_status_t EFIAPI efi_set_variable(u16 *name, const efi_guid_t *guid, u8 *comm_buf = NULL; efi_status_t ret; - EFI_ENTRY("\"%ls\" %pUl %x %zu %p", name, guid, attr, data_size, data); - - if (!name || name[0] == 0 || !guid) { + if (!variable_name || variable_name[0] == 0 || !vendor) { ret = EFI_INVALID_PARAMETER; goto out; } @@ -452,7 +419,7 @@ efi_status_t EFIAPI efi_set_variable(u16 *name, const efi_guid_t *guid, } /* Check payload size */ - name_size = u16_strsize(name); + name_size = u16_strsize(variable_name); payload_size = MM_VARIABLE_ACCESS_HEADER_SIZE + name_size + data_size; if (payload_size > max_payload_size) { ret = EFI_INVALID_PARAMETER; @@ -466,11 +433,11 @@ efi_status_t EFIAPI efi_set_variable(u16 *name, const efi_guid_t *guid, goto out; /* Fill in contents */ - guidcpy(&var_acc->guid, guid); + guidcpy(&var_acc->guid, vendor); var_acc->data_size = data_size; var_acc->name_size = name_size; - var_acc->attr = attr; - memcpy(var_acc->name, name, name_size); + var_acc->attr = attributes; + memcpy(var_acc->name, variable_name, name_size); memcpy((u8 *)var_acc->name + name_size, data, data_size); /* Communicate */ @@ -478,7 +445,7 @@ efi_status_t EFIAPI efi_set_variable(u16 *name, const efi_guid_t *guid, out: free(comm_buf); - return EFI_EXIT(ret); + return ret; } /** From patchwork Sat Jul 11 22:05:29 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 1327418 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=IBp1h+GK; 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) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4B43sN6ZP5z9sRK for ; Sun, 12 Jul 2020 08:06:32 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id BB70081F13; Sun, 12 Jul 2020 00:06:23 +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="IBp1h+GK"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 84F9F81F88; Sun, 12 Jul 2020 00:06:10 +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.15.18]) (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 2836F81EDE for ; Sun, 12 Jul 2020 00:06:05 +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=1594505164; bh=hN9GsHkwy8msPUfFL6KDCcmo8n2iQtdHLW42CA0W4wY=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=IBp1h+GKSTRU5eU5Miiwvv/PbiJqzbIshvUi3aA5jS1l6T8MRtmpV/UEjdKOYq3DX 1hejht9qRZnZ8VXcSqmlJ0KP8BmXWq1+mog3VzS5jiHtwo/h6roTZ0ov0/j82zG0pL ApGSL2U46YXc17s5rj/MV2QhPsVGyIZmnZuccoq0= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from LT02.fritz.box ([88.152.145.75]) by mail.gmx.com (mrgmx005 [212.227.17.184]) with ESMTPSA (Nemesis) id 1M9nxn-1k08GU3scX-005nUa; Sun, 12 Jul 2020 00:06:04 +0200 From: Heinrich Schuchardt To: Alexander Graf Cc: Ilias Apalodimas , u-boot@lists.denx.de, AKASHI Takahiro , Heinrich Schuchardt Subject: [PATCH v4 02/17] efi_loader: display RO attribute in printenv -e Date: Sun, 12 Jul 2020 00:05:29 +0200 Message-Id: <20200711220544.120976-3-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200711220544.120976-1-xypron.glpk@gmx.de> References: <20200711220544.120976-1-xypron.glpk@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:J7zzkn807kf4XFKvPneIYXyirIIIDUwgsqXZ86mq+dzRRENc4zz vCJ8gMytU0ppx5yeegyxYtXMkybHLslo4U7zqGbJzxUtk+HavlmmjcvcoFQnFkDzHzfpTjm GhGxj8Vs2J2uP0o5FRSRpmdkfghBsDyCnL/xuwIQ3EWmM1cLL3aXb5Ry3UsuCXAnF4SLDTh Px8r3Ehp889Wqpf8aCaEQ== X-UI-Out-Filterresults: notjunk:1;V03:K0:w0Ahec0RzAg=:Pk0mCT6vbosRsGvguyDA9q kNwvuM6RWIIPdt3xrBXp8KbJopDZScRzxklYrIuf+bsy+kYkbxgDPYUd0CcqIWqC1YXZYwKm6 6zj1P4tk/wcZf/iARMua1N7xT0Nych1sKLvg9NQfqVQsH0Bkx0w+zfK192+/3w7+RXlymQs+2 IA70UK53HiPjwam7zX45h/C/GgibV6+jBBOkCjWrG3WJtMvkX16MqZGl3WqAZqovitV1pnXdj g+NXTP9u5cMXAy1VM81Pq6JhTla1JzzoEuX3sByoYXzuEnQBYrsckIq/AE0/6GCY8E80DUnLq yO7746b7FIosuED/0k5q04P9sj6Yp40hlHxaqnMJusRm9HWOKHeH7IRWKUEJaKMX1SaaWfkIX iOC0+f26nRs1w3qvpbvWxOuTQCPimrPYO38apwsvskD2APUg0Jwdo4Rir0W2rs11UnPJs+l6t eAMMDnf1y4kbZ4uif5BphZ7i+9EDNUwUTzLPsIr0nf6z97l9RyS5XXPjqcPETnbAnPxLTbitE TtQV5hrLsAnM/gLxU2J9uUs3JskBGxRlW2gEAHFNnFdbcAdOwKW3kIqffhnZIP/vQ6Dlq6G4q LaXRpVybS05MpOjZUhoafL0oRVbzFVUIYAIh40DY6oeEIFDOmuOtmbjbTEOutsoV5LNJw/zSw Uh++XSnxWF0tGXJn1Y9kKPpJMNuFS+v2+m6l8Pw4X9mbzvJcc5rJ2b+Ng11gao7xYVDn0inyd ElFx1y1EiaIOQsLWNRjyRVJ4ITvogVQxYJuREfVZOrJ9S3syvSxNKN63Se8wbLoFQxSPtzDDm rFUalHt0OmSObR6E1yHMQQ1B4AAJRB1uHxDJ33xC4fzwQ/rOD1kY/Zw0zluWLKq54pCOxEU1H oj7Kgb04FThd2ninD9r7KCCV3UTf3UCi6+WpjcBMImQ1sFr70OPMCy3V7C8Un3OCBTElha6OO TBxAqiCDlZXsz5kVxZIG57d9wgNbbE8LsnoEMChAcVhW/kEh3ypfXpfdJ2cXqdn/VnYyuXxVV IyhvsNB06KaYuNgakJvcV3O33aK5iZl8zqiLszpP8+xieTvo5o7p1wbKEL+SBRYei/tcF6Lln gtNaNptjmJFxhJkYiI32FzOfOatwWMXSPVjyp7PQzlEcuNcCUgJziEaaYg7HSHXYxhdRjnrj1 qRRxNfcLgrcgLYzBvHrg3rK4dKqDnXppskqTQnv35MHGsRHSyuOLf8rkcQ4i9FgIKyj2FPtcW tfKEyan5kTuPStMFS5T3H5UgkrSRSA6vESlutKw== 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.3 at phobos.denx.de X-Virus-Status: Clean Let the 'printenv -e' command display the read only flag. If the variable is time authenticated write the time stamp. Avoid EFI_CALL() when calling SetVariable() and GetVariable(). Signed-off-by: Heinrich Schuchardt --- cmd/nvedit_efi.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) -- 2.27.0 diff --git a/cmd/nvedit_efi.c b/cmd/nvedit_efi.c index 29cad38e19..3f61d5d6cc 100644 --- a/cmd/nvedit_efi.c +++ b/cmd/nvedit_efi.c @@ -9,11 +9,13 @@ #include #include #include +#include #include #include #include #include #include +#include #include #include @@ -34,6 +36,7 @@ static const struct { {EFI_VARIABLE_RUNTIME_ACCESS, "RT"}, {EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS, "AW"}, {EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS, "AT"}, + {EFI_VARIABLE_READ_ONLY, "RO"}, }; static const struct { @@ -87,20 +90,22 @@ static void efi_dump_single_var(u16 *name, const efi_guid_t *guid, bool verbose) { u32 attributes; u8 *data; + u64 time; + struct rtc_time tm; efi_uintn_t size; int count, i; efi_status_t ret; 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, &time); 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, &time); } if (ret == EFI_NOT_FOUND) { printf("Error: \"%ls\" not defined\n", name); @@ -109,13 +114,16 @@ static void efi_dump_single_var(u16 *name, const efi_guid_t *guid, bool verbose) if (ret != EFI_SUCCESS) goto out; - printf("%ls:\n %s:", name, efi_guid_to_str(guid)); + rtc_to_tm(time, &tm); + printf("%ls:\n %s:\n", name, efi_guid_to_str(guid)); + if (attributes & EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) + printf(" %04d-%02d-%02d %02d:%02d:%02d\n", tm.tm_year, + tm.tm_mon, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); + printf(" "); for (count = 0, i = 0; i < ARRAY_SIZE(efi_var_attrs); i++) if (attributes & efi_var_attrs[i].mask) { if (count) putc('|'); - else - putc(' '); count++; puts(efi_var_attrs[i].text); } @@ -592,8 +600,8 @@ int do_env_set_efi(struct cmd_tbl *cmdtp, int flag, int argc, 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, + true); unmap_sysmem(value); if (ret == EFI_SUCCESS) { ret = CMD_RET_SUCCESS; From patchwork Sat Jul 11 22:05:30 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 1327422 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=kp8ceTjI; 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 4B43tF3dTDz9sRK for ; Sun, 12 Jul 2020 08:07:17 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 1C48782196; Sun, 12 Jul 2020 00:06:53 +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="kp8ceTjI"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 6CAD881EDE; Sun, 12 Jul 2020 00:06:19 +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.15.19]) (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 5EFB581F11 for ; Sun, 12 Jul 2020 00:06:05 +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=1594505164; bh=uQYxX62A/8cbuXEUlmu3/tAEzXIWHjjyPmnqCCSTDFs=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=kp8ceTjImd9hLE8KnAs/unHbf+v0XweUplBqifzIWitpLxbkS9VLC63n0vZ7QoKAm 7ToiFUYrsY1RFyBHdl3Kse4NYeQxsQmyGCiXp9SnPMxsivPVtjsCQtcHvYxyNIcszl 7sZ6CgU7l4U/BdGtVPqCUc82Oc8cxoglbLtJbeDM= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from LT02.fritz.box ([88.152.145.75]) by mail.gmx.com (mrgmx005 [212.227.17.184]) with ESMTPSA (Nemesis) id 1McH9i-1kScS00jzI-00cePV; Sun, 12 Jul 2020 00:06:04 +0200 From: Heinrich Schuchardt To: Alexander Graf Cc: Ilias Apalodimas , u-boot@lists.denx.de, AKASHI Takahiro , Heinrich Schuchardt Subject: [PATCH v4 03/17] efi_loader: separate UEFI variable API from implemementation Date: Sun, 12 Jul 2020 00:05:30 +0200 Message-Id: <20200711220544.120976-4-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200711220544.120976-1-xypron.glpk@gmx.de> References: <20200711220544.120976-1-xypron.glpk@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:Hu/lER1AgkdJZXPcrfBfH3SqxM5J5HtveCD6RAikem0WhiZsswS VDcGHy68nX5jGeD6dK4AqracdhyYKqq9bXkHaugv2EL4BNDnq+UanQix9lIqSDon5mkk3Qi GLdXXHQaH/n6YCjcb2NMWCLvB61c22BUBuUvBOd0bbw7sekJ0IIhwVKqTyLp6Pkcm6QyNEF OqsJzNyL6RZ8IpTSMxzFw== X-UI-Out-Filterresults: notjunk:1;V03:K0:LjqpHnZBCXA=:UjI64/VnnpHS2SiyH99TV8 alrekVWB98aK68iPMNKvmsCpJh70zwghdzdPdQMerma/khHyls8rNHNmtYf1feSYf8X3jNZGr F1xPMJw6T+UAgjVvod/u9ZvaKQCbTdPHfVFHoBQXlAJflbMI6E7rLa43nv8UZpm/HjUpfrLbp OnPH8cDOEXYU5ljSYZ4hT/J2NC/O4NcscSNzKYxaCDaP3XYq8QePMvBnsGZWILQMvj1ga1TCw Dd15a9WcY7rNaJVM31kaZOID/zM8HPcuSa94fVZH4gFo+m24Uoai6gzBBfWw6heIGOhz4+Hxn g7PSsCzG95wQqIcDqL+eFYlFKzTv+RQ8Thr2W+nue9rv2Gq9CVdIxtxa1BC4kvcFmZPzMvXIA qvkz1KFLKiC2UtswC+WPLa4ro+zswEmLNewWC737fVzubJW4vMZOJmJSwnhAfB+pJ2Cbfy6Bj QxZ/2IV4Rg1q0DZTJaP3hA5KVuVWt1A7VcMk2dVRka2pcoS+qhhiIP/kUaiOuKpxlFCVCTsde bVoo+CR36MxnIQNU9Cg9Z3zJ64VIK1XebxBJb+DCC2eS3+OBuk9e8zdJ/KD36EQLaSwFvTxIk OPrSorhOPD545Nwmw3t4JehED6TGG4K8PB9JADoz7wO9sYssCGwTdDDQw+Lp0csyOBqSOSyKd zLPj0WHjGCzzijx2wGrHpCSJfzgLA+lgriH6IUBd2+26wyhXvVkJKSm05c9wZ7Zf7nxOE8J8E RHhhhzdUuimfMHW1n8a+S2q7dOgGmYDvVk6yUCbh1iYwaTWCCF9+tnJD/1j8sARNfGkv2J0fk XtmZYmSPQYIs1SMZF1Xqi4sfz8od3xfpGuidjRyojDW+2erjfIyNcFzvHfhVjU1qznwLW5DNx IkLRsO7d6gGvpYu56FxXxO+GeBErLqwgmbHOpYrSo/rYU3aJoZ0MmwmpbRkr9FKcN0uG7yb4j 5fB5733KFiRt3hmk/DjQWJpWDsIf2QuDszoKnLKnIps1Zy1vFgxff9oz2MXabcvEb5k7tHa3f WP5E5pa7PX7R+Yw0/gNdDx1LYlNejL2kL+JUPS0echpzbqJR+9SyDc8fmjAGY6YhHMK8GXm5b HRZC6R5cXDcK7ThPl5wRBtRlOeRarJ+D1rvdrJdb7dKdnGePbkSlhslFke2DSanBZm1oBQJ7R zquVuKflibx/W5pFmiJjHCEDu41NqD8hQg4/AdI534GFodnkGUSgIVg/cM2bbT4KR6O6on8Uw +AUUpvE7GXZhxFRsSCBOjGXwPanPnYPPRp7Ik6w== 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.3 at phobos.denx.de X-Virus-Status: Clean Separate the remaining UEFI variable API functions GetNextVariableName and QueryVariableInfo() from internal functions implementing them. Signed-off-by: Heinrich Schuchardt --- include/efi_variable.h | 39 +++++++++++++++++++ lib/efi_loader/efi_var_common.c | 62 +++++++++++++++++++++++++++++++ lib/efi_loader/efi_variable.c | 56 ++++++++++++---------------- lib/efi_loader/efi_variable_tee.c | 55 +++++---------------------- 4 files changed, 133 insertions(+), 79 deletions(-) -- 2.27.0 diff --git a/include/efi_variable.h b/include/efi_variable.h index 6789118eba..3ba274fce1 100644 --- a/include/efi_variable.h +++ b/include/efi_variable.h @@ -40,4 +40,43 @@ 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, bool ro_check); +/** + * efi_get_next_variable_name_int() - enumerate the current variable names + * + * @variable_name_size: size of variable_name buffer in byte + * @variable_name: name of uefi variable's name in u16 + * @vendor: vendor's guid + * + * 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); + +/** + * efi_query_variable_info_int() - get information about EFI variables + * + * This function implements the QueryVariableInfo() runtime service. + * + * See the Unified Extensible Firmware Interface (UEFI) specification for + * details. + * + * @attributes: bitmask to select variables to be + * 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 + * selected variable types + * @maximum_variable_size: maximum size of a variable of the + * selected type + * Returns: status code + */ +efi_status_t efi_query_variable_info_int(u32 attributes, + u64 *maximum_variable_storage_size, + u64 *remaining_variable_storage_size, + u64 *maximum_variable_size); + #endif diff --git a/lib/efi_loader/efi_var_common.c b/lib/efi_loader/efi_var_common.c index 6a4efa3f27..1e2be1135b 100644 --- a/lib/efi_loader/efi_var_common.c +++ b/lib/efi_loader/efi_var_common.c @@ -76,3 +76,65 @@ efi_status_t EFIAPI efi_set_variable(u16 *variable_name, return EFI_EXIT(ret); } + +/** + * efi_get_next_variable_name() - enumerate the current variable names + * + * @variable_name_size: size of variable_name buffer in byte + * @variable_name: name of uefi variable's name in u16 + * @vendor: vendor's guid + * + * See the Unified Extensible Firmware Interface (UEFI) specification for + * details. + * + * Return: status code + */ +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 ret; + + EFI_ENTRY("%p \"%ls\" %pUl", variable_name_size, variable_name, vendor); + + ret = efi_get_next_variable_name_int(variable_name_size, variable_name, + vendor); + + return EFI_EXIT(ret); +} + +/** + * efi_query_variable_info() - get information about EFI variables + * + * This function implements the QueryVariableInfo() runtime service. + * + * See the Unified Extensible Firmware Interface (UEFI) specification for + * details. + * + * @attributes: bitmask to select variables to be + * 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 + * selected variable types + * @maximum_variable_size: maximum size of a variable of the + * selected type + * Returns: status code + */ +efi_status_t EFIAPI efi_query_variable_info( + u32 attributes, u64 *maximum_variable_storage_size, + u64 *remaining_variable_storage_size, + u64 *maximum_variable_size) +{ + efi_status_t ret; + + EFI_ENTRY("%x %p %p %p", attributes, maximum_variable_storage_size, + remaining_variable_storage_size, maximum_variable_size); + + ret = efi_query_variable_info_int(attributes, + maximum_variable_storage_size, + remaining_variable_storage_size, + maximum_variable_size); + + return EFI_EXIT(ret); +} diff --git a/lib/efi_loader/efi_variable.c b/lib/efi_loader/efi_variable.c index 6ec1f97326..36bac86702 100644 --- a/lib/efi_loader/efi_variable.c +++ b/lib/efi_loader/efi_variable.c @@ -745,23 +745,9 @@ static efi_status_t parse_uboot_variable(char *variable, return EFI_SUCCESS; } -/** - * efi_get_next_variable_name() - enumerate the current variable names - * - * @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 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) { char *native_name, *variable; ssize_t name_len, list_len; @@ -771,10 +757,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 */ @@ -782,12 +766,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;) { @@ -802,14 +786,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 @@ -824,7 +808,7 @@ efi_status_t EFIAPI efi_get_next_variable_name(efi_uintn_t *variable_name_size, &efi_variables_list, 0, 1, regexlist); if (list_len <= 1) - return EFI_EXIT(EFI_NOT_FOUND); + return EFI_NOT_FOUND; variable = efi_variables_list; } @@ -832,7 +816,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; } efi_status_t efi_set_variable_int(u16 *variable_name, const efi_guid_t *vendor, @@ -1057,13 +1041,17 @@ err: return ret; } +efi_status_t efi_query_variable_info_int(u32 attributes, + u64 *maximum_variable_storage_size, + u64 *remaining_variable_storage_size, + u64 *maximum_variable_size) +{ + return EFI_UNSUPPORTED; +} + /** - * efi_query_variable_info() - get information about EFI variables - * - * This function implements the QueryVariableInfo() runtime service. - * - * See the Unified Extensible Firmware Interface (UEFI) specification for - * details. + * efi_query_variable_info_runtime() - runtime implementation of + * QueryVariableInfo() * * @attributes: bitmask to select variables to be * queried @@ -1075,7 +1063,7 @@ err: * selected type * Returns: status code */ -efi_status_t __efi_runtime EFIAPI efi_query_variable_info( +efi_status_t __efi_runtime EFIAPI efi_query_variable_info_runtime( u32 attributes, u64 *maximum_variable_storage_size, u64 *remaining_variable_storage_size, @@ -1144,6 +1132,8 @@ void efi_variables_boot_exit_notify(void) efi_runtime_services.get_next_variable_name = efi_get_next_variable_name_runtime; efi_runtime_services.set_variable = efi_set_variable_runtime; + efi_runtime_services.query_variable_info = + efi_query_variable_info_runtime; efi_update_table_header_crc32(&efi_runtime_services.hdr); } diff --git a/lib/efi_loader/efi_variable_tee.c b/lib/efi_loader/efi_variable_tee.c index 1d6d4fe807..ff90aa8e81 100644 --- a/lib/efi_loader/efi_variable_tee.c +++ b/lib/efi_loader/efi_variable_tee.c @@ -312,23 +312,9 @@ out: return ret; } -/** - * efi_get_next_variable_name() - enumerate the current variable names - * - * @variable_name_size: size of variable_name buffer in bytes - * @variable_name: name of uefi variable's name in u16 - * @guid: 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 EFIAPI efi_get_next_variable_name(efi_uintn_t *variable_name_size, - u16 *variable_name, - efi_guid_t *guid) +efi_status_t efi_get_next_variable_name_int(efi_uintn_t *variable_name_size, + u16 *variable_name, + efi_guid_t *guid) { struct smm_variable_getnext *var_getnext; efi_uintn_t payload_size; @@ -338,8 +324,6 @@ efi_status_t EFIAPI efi_get_next_variable_name(efi_uintn_t *variable_name_size, u8 *comm_buf = NULL; efi_status_t ret; - EFI_ENTRY("%p \"%ls\" %pUl", variable_name_size, variable_name, guid); - if (!variable_name_size || !variable_name || !guid) { ret = EFI_INVALID_PARAMETER; goto out; @@ -396,7 +380,7 @@ efi_status_t EFIAPI efi_get_next_variable_name(efi_uintn_t *variable_name_size, out: free(comm_buf); - return EFI_EXIT(ret); + return ret; } efi_status_t efi_set_variable_int(u16 *variable_name, const efi_guid_t *vendor, @@ -448,37 +432,16 @@ out: return ret; } -/** - * efi_query_variable_info() - get information about EFI variables - * - * This function implements the QueryVariableInfo() runtime service. - * - * See the Unified Extensible Firmware Interface (UEFI) specification for - * details. - * - * @attributes: bitmask to select variables to be - * 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 - * selected variable types - * @maximum_variable_size: maximum size of a variable of the - * selected type - * Returns: status code - */ -efi_status_t EFIAPI __efi_runtime -efi_query_variable_info(u32 attributes, u64 *max_variable_storage_size, - u64 *remain_variable_storage_size, - u64 *max_variable_size) +efi_status_t efi_query_variable_info_int(u32 attributes, + u64 *max_variable_storage_size, + u64 *remain_variable_storage_size, + u64 *max_variable_size) { struct smm_variable_query_info *mm_query_info; efi_uintn_t payload_size; efi_status_t ret; u8 *comm_buf; - EFI_ENTRY("%x %p %p %p", attributes, max_variable_storage_size, - remain_variable_storage_size, max_variable_size); - payload_size = sizeof(*mm_query_info); comm_buf = setup_mm_hdr((void **)&mm_query_info, payload_size, SMM_VARIABLE_FUNCTION_QUERY_VARIABLE_INFO, @@ -497,7 +460,7 @@ efi_query_variable_info(u32 attributes, u64 *max_variable_storage_size, out: free(comm_buf); - return EFI_EXIT(ret); + return ret; } /** From patchwork Sat Jul 11 22:05:31 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 1327419 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=HchpPzOU; 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 4B43sX0v2cz9sRK for ; Sun, 12 Jul 2020 08:06:40 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 9439281F7C; Sun, 12 Jul 2020 00:06:28 +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="HchpPzOU"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 051AF81F2F; Sun, 12 Jul 2020 00:06:17 +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.15.19]) (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 9F12281F13 for ; Sun, 12 Jul 2020 00:06:05 +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=1594505164; bh=aQhmDaSVDaBjHzosx1zTNBjekYXPwEQWiK2C/ZT22to=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=HchpPzOUY4nBEoH9CI2bMaFVRK/SzqbJ/JO78j3sLG09K1emYbZxu9qEVpWpXPvBU P44xiljfAtgqlpevCWcBj+VYBAc8/ADT7GLF/bUBJMPWBGt8uSOLtUGGVr27moj/Zv g+QtyIb3vrXISlctKKEEWDirkEVzCP6q1NVhd75Q= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from LT02.fritz.box ([88.152.145.75]) by mail.gmx.com (mrgmx005 [212.227.17.184]) with ESMTPSA (Nemesis) id 1MRmjw-1kI4MI1qdm-00TGCx; Sun, 12 Jul 2020 00:06:04 +0200 From: Heinrich Schuchardt To: Alexander Graf Cc: Ilias Apalodimas , u-boot@lists.denx.de, AKASHI Takahiro , Heinrich Schuchardt Subject: [PATCH v4 04/17] efi_loader: OsIndicationsSupported, PlatformLangCodes Date: Sun, 12 Jul 2020 00:05:31 +0200 Message-Id: <20200711220544.120976-5-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200711220544.120976-1-xypron.glpk@gmx.de> References: <20200711220544.120976-1-xypron.glpk@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:YZMq3L8+l2v7whnGoH2II2l5++U4sxrYn0jyqt+XB9QuZyrKKzI gju3kI7Q+mAnx0HwKwIT1EEQOhjwSkGm2jairnuC2bOA7ANRf/b4p2IIWOREp6celIXTFDg g8hM6BTOSDwgvWXz1hCp2vDdg3ZobONMKVdziRVCUgtbwxlWGswmtxNgnfPgQsg4QpwaqD+ qAeMDCScd/NCxZ+WB6lyw== X-UI-Out-Filterresults: notjunk:1;V03:K0:qqYDAbBBjxA=:cMSYSThA3S4gKRmVqN+6Dh vDnSQK6lJq3QqYcpkrL1g+E6yrxqRL8cyLInYdP33X7B7ezZezcxTST46FLSp4XSQ7VwSiZfi jCLgwvppi4Ci0dvMophzIkr5d+o98u8+ALmF1lhY9kTTJfHVcxCs0+JRi9AxyoHxQ4sFTFdjr RA+5bXdL+abABEw2qSNZZfxW0k/xZhqk2+D/9ZwcaIVQvU9Y+GAjBiEo1wpDTJKzxz3rKFmEd ni6qStvn+v3bhZGTCpMqXpJltlCTp6YU5gCOz+G3lpaokt6iSwmLsQ5MeS4XY0ykRkqtkM7lr lwfahBhb/UVhQUnB2sDjmwQIBWmHee5615ZjSGymvC5OSp+lCleMcWxZHuyjDWSJ0dwK+X5i0 RjnlDZ9AN4GcmmU1xYZXsChmMseyOjS0yXflzYByuJRd9WKwOp0kHZ7RF8umeFPnK51mv7+om CuSVPJP/Bdi6XzYUAO7DKVQDFsO3lJjtM08/5VTamy09T5NGFZtsm5I6/fGuolvb6af0I5de3 2+QxnoXNXwGK8SUbd/HX0Gm6TOJfmeKarEOinkrLolDfh/FDKEzpqm66i1WYU09eeRC/MOXCN +3JFDKTcJH597BvYFjMrf9Zhdnltcyv5DCojy1EgGDj7gnMyK0FDKFHNDZ4EPldfgAcfQFq3G ci9si+yd+fwLDDi+O3k2G94uGAy/E4hb3yIYrXXb+aH+Tc/bf5uJVT3jONZargnobQxzChnOo WEfxQX7WgaFlMXaxIbvb2RBWKZSyIwXDSCR6Rdjoejad+hHAxuvVqEyPu+ySvhhw/9uSf/9km KJoSaRH8nIYGsj1j+K4K+qg0HLD395aCH22kVWJ5wM/lZLcKhzbNLryrdzjl1Gd24IkVk/AI+ hrMkrwTHeHZ2oSFPyjZsEA3QOCF55YbZUNe3BtNTonSpjcy4j8RD6kOwtN3DeBCmPWGPhPgsK G/MohQ4IA4dF7QcDey/tFOSwOIXbiin5+PezWYKyHZJzyU1H5aXxesc6zEJ/U6esNOqTVGjuz I7GKiqDMxlRDaV29EsLI/hhSxEyJ7lAH17wtNrSv33tYYmzNlTy4OLomcezl147XGQNv4pRMC Ghnu3xXyZKBDxNKBRXJYBIB31jGO5HCKmJo/pNR8nsaiuVNjXQ09A8f+wP7YoUihtubdbUS8G r/MYagcDEOmeQq6nturlMbv4jDSTR4WZ2HUwxmkLuPvanB/S3b04Cmiyq4Y1lGFaILERGbKd3 1heJ+whyC/lZh+/kgAIaIKPjVp1TMiDGl1AULzA== 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.3 at phobos.denx.de X-Virus-Status: Clean UEFI variables OsIndicationsSupported, PlatformLangCodes should be read only. Avoid EFI_CALL() for SetVariable(). Signed-off-by: Heinrich Schuchardt --- lib/efi_loader/efi_setup.c | 59 ++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 28 deletions(-) -- 2.27.0 diff --git a/lib/efi_loader/efi_setup.c b/lib/efi_loader/efi_setup.c index a3b05a4a9b..6196c0a06c 100644 --- a/lib/efi_loader/efi_setup.c +++ b/lib/efi_loader/efi_setup.c @@ -8,6 +8,7 @@ #include #include #include +#include #define OBJ_LIST_NOT_INITIALIZED 1 @@ -40,12 +41,13 @@ 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 | + EFI_VARIABLE_READ_ONLY, + sizeof(CONFIG_EFI_PLATFORM_LANG_CODES), + CONFIG_EFI_PLATFORM_LANG_CODES, false); if (ret != EFI_SUCCESS) goto out; @@ -53,9 +55,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, NULL); if (ret == EFI_BUFFER_TOO_SMALL) { /* The variable is already set. Do not change it. */ ret = EFI_SUCCESS; @@ -70,12 +72,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, false); out: if (ret != EFI_SUCCESS) printf("EFI: cannot initialize platform language settings\n"); @@ -96,13 +98,13 @@ static efi_status_t efi_init_secure_boot(void) }; efi_status_t ret; - /* TODO: read-only */ - ret = EFI_CALL(efi_set_variable(L"SignatureSupport", - &efi_global_variable_guid, - EFI_VARIABLE_BOOTSERVICE_ACCESS - | EFI_VARIABLE_RUNTIME_ACCESS, - sizeof(signature_types), - &signature_types)); + ret = efi_set_variable_int(L"SignatureSupport", + &efi_global_variable_guid, + EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_RUNTIME_ACCESS | + EFI_VARIABLE_READ_ONLY, + sizeof(signature_types), + &signature_types, false); if (ret != EFI_SUCCESS) printf("EFI: cannot initialize SignatureSupport variable\n"); @@ -160,12 +162,13 @@ 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 | + EFI_VARIABLE_READ_ONLY, + sizeof(os_indications_supported), + &os_indications_supported, false); if (ret != EFI_SUCCESS) goto out; From patchwork Sat Jul 11 22:05:32 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 1327420 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=lusldFIp; 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 4B43sk5jcDz9sRK for ; Sun, 12 Jul 2020 08:06:50 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id A412C81F42; Sun, 12 Jul 2020 00:06:34 +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="lusldFIp"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id D3B58821C3; Sun, 12 Jul 2020 00:06:15 +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.15.18]) (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 D4CCD81F27 for ; Sun, 12 Jul 2020 00:06:05 +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=1594505164; bh=y8rJ/xvokJV3kebGH/2O4QFRBFg3h9zRXQP6doke6pU=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=lusldFIpgwq2NbTBiHkvyHqIJ9HasAKsfhc/D4eJva9zJ0k1h5yMpvx9aj6ItKBgz UaKKpTZJm64fon/AidCG8EQDT2OcXhigdoFqK0KbNPOPqZx9rYXY46oR63IAEbJdFy MUwvy5CBDg7PqXtbalnum2eFbRx++B5trBIPqR1M= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from LT02.fritz.box ([88.152.145.75]) by mail.gmx.com (mrgmx005 [212.227.17.184]) with ESMTPSA (Nemesis) id 1M5fMe-1jw1GI2y0w-007AwF; Sun, 12 Jul 2020 00:06:04 +0200 From: Heinrich Schuchardt To: Alexander Graf Cc: Ilias Apalodimas , u-boot@lists.denx.de, AKASHI Takahiro , Heinrich Schuchardt Subject: [PATCH v4 05/17] efi_loader: simplify boot manager Date: Sun, 12 Jul 2020 00:05:32 +0200 Message-Id: <20200711220544.120976-6-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200711220544.120976-1-xypron.glpk@gmx.de> References: <20200711220544.120976-1-xypron.glpk@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:M5fX7B/owYy068zXLagFnoE6sHepoF3EN60SdHGjNfdnDUeDQZi u1G+SWGlloaP/1hhNdLXF4T4KQiFmNnTatOXZWS3nLo6R7aDzHpgW7A6NyYUVkLrlTxFt81 FPtdfkP/IY95y+vN6Xgt1QqDxdVKB4eZUsiKKuYx9z+DKw9Z0GsQHHU5b1zoDzJirVR4pvk y+BxFepnO2fZkgh0pt1cA== X-UI-Out-Filterresults: notjunk:1;V03:K0:NRsWmZspjLI=:4ZOvjYgxqe181Wo+UxpgPb Xr/riV3Q4p0VjRnEhtHWBvWGbSSWN+MW8h4sBJbeIBm73pR0xrV9HdecoQBV5McqNWdkpY3rO 8F4CnKB4Joezh75dAV8V32vAGtarEqRcklsPMjX+vWlghMqGwhu9cOQGOUQpLFcXUXsuRZ4Et RyKsOVKVHu0Ed5JfoEHDFeEL+FEQGv5Ep5vUvpncjUY9wzNdGZ6BYnAiGzVSwWuh8ncskNGca Sa/cv3keJKqto/Locneq4Fv9sufNkl3i/rY4NAguBdYXJFAApWZF7QPBeDRqq5QkRCBFjSO9+ GsSP5ThHprAfsOv+LvkSyt6GuyDMXdX3iWv1dJA2b14ZHZ2h+jL8QtYzuxq5fSNm5M6s0Zx0y gCHe1lRllF97Narw2Vgtk6lUEhlaqE+xv88P+I+ajw0gzg4EWG0lk0bLmOwWi8p9Auin84G0r 0BLlHpqyVzWuPjM93tac2sBER+q49+gTuVREibcKejemdyum9mUssszd7h4YMnKpBo2kqD51s JQ5B+2wn+ieAxzZhlLgzO10vz3QepSEDkVUfPqWS5c4qgM/EAm/WFnjnjplpDgwnA1qQQtlIx mPtChQJSqexdIf5zW5L7G1FBVLGKYYShL0GKCXxiLbrQY5mje6gCbd2Ncv4Imk5JjRnn8/tOC ieabLsA/vVEFvQgzw4USIfCUfvJ/EqUf/p4SEeZ2DQ5juXE7M+GElhHLeLoF5Djfco3mSol9B 8QRGCb4t+uRZrmCVZql7PY+YRNIgoScfPopA7Qc1FTbvn0+TwKWHZ1oMRVUR+ySK0a8XJ/ZzC 7VH0qCbiyu+JxSXwGBzrGu2JMkFsdgrQASgMDlCWf+MjT8Z5VJiXdtGy+tpjFO4vGDYkOWtx5 u2eNHzzYbpui0EgFQHxoNydbj8NoJMatR4rD3fh4ozxp13mD5GaLWZX20XY9gdZnr8aQuNDzp JldN2z4UywF0fuO5xqUy5E/ilMCB5yS0KTGiGMNVRMeNY9I+mAnVagEDxzjte+BimJ3LG2GZ8 aMQZNXLWz3Jl5NQRcLcrjZuJQwWYLI11sagrEppAPBVNlNaypToolnovkRK/jQD35z0UrTioM hkxf64NpUG0KsaqWVVWsCBhLeppz3I6jwQLAPlndwDtdqznZBB5+68/n7wYqJmpdWf93C9PGP JUScvzQUj0a+S+KmECgrKwYoHbq02aNBeXMcy0BLdDmzGLadgfXQomSyWK3CLuHuC+YyjMBTM 6ot2Eo3Mp1rRGOfszl3s0ayKYAQKsbpzEtHgxtA== 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.3 at phobos.denx.de X-Virus-Status: Clean Simplify the implementation of the UEFI boot manager: * avoid EFI_CALL for SetVariable() and GetVariable() * remove unnecessary type conversions Signed-off-by: Heinrich Schuchardt --- lib/efi_loader/efi_bootmgr.c | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) -- 2.27.0 diff --git a/lib/efi_loader/efi_bootmgr.c b/lib/efi_loader/efi_bootmgr.c index e268e9c4b8..e03198b57a 100644 --- a/lib/efi_loader/efi_bootmgr.c +++ b/lib/efi_loader/efi_bootmgr.c @@ -12,6 +12,7 @@ #include #include #include +#include #include static const struct efi_boot_services *bs; @@ -147,15 +148,14 @@ unsigned long efi_serialize_load_option(struct efi_load_option *lo, u8 **data) static void *get_var(u16 *name, const efi_guid_t *vendor, efi_uintn_t *size) { - efi_guid_t *v = (efi_guid_t *)vendor; efi_status_t ret; void *buf = NULL; *size = 0; - EFI_CALL(ret = rs->get_variable(name, v, NULL, size, buf)); + ret = efi_get_variable_int(name, vendor, NULL, size, buf, NULL); 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, vendor, NULL, size, buf, NULL); } if (ret != EFI_SUCCESS) { @@ -219,10 +219,9 @@ 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( - L"BootCurrent", - (efi_guid_t *)&efi_global_variable_guid, - attributes, size, &n)); + ret = efi_set_variable_int(L"BootCurrent", + &efi_global_variable_guid, + attributes, size, &n, false); if (ret != EFI_SUCCESS) { if (EFI_CALL(efi_unload_image(*handle)) != EFI_SUCCESS) @@ -262,22 +261,19 @@ efi_status_t efi_bootmgr_load(efi_handle_t *handle) 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_global_variable_guid, + NULL, &size, &bootnext, NULL); if (ret == EFI_SUCCESS || ret == EFI_BUFFER_TOO_SMALL) { /* BootNext does exist here */ if (ret == EFI_BUFFER_TOO_SMALL || size != sizeof(u16)) log_err("BootNext must be 16-bit integer\n"); /* delete BootNext */ - ret = EFI_CALL(efi_set_variable( - L"BootNext", - (efi_guid_t *)&efi_global_variable_guid, - EFI_VARIABLE_NON_VOLATILE, 0, - &bootnext)); + ret = efi_set_variable_int(L"BootNext", + &efi_global_variable_guid, + 0, 0, NULL, false); /* load BootNext */ if (ret == EFI_SUCCESS) { From patchwork Sat Jul 11 22:05:33 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 1327421 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=cuS4oPh5; 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 4B43sz2fFvz9sRK for ; Sun, 12 Jul 2020 08:07:03 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id E8B6A81F2F; Sun, 12 Jul 2020 00:06: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="cuS4oPh5"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 149A0821A7; Sun, 12 Jul 2020 00:06:16 +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.15.15]) (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 498BD81F2F for ; Sun, 12 Jul 2020 00:06:06 +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=1594505165; bh=SG/0+OC15HeAxwz4B7XRJocN8oY4PJIczZWzT446lto=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=cuS4oPh5kTyqW0z35yAa/7lZYNrEQ7blibMz8KSJrUnvXwkujnixzURgNeKnXU7a3 +mb+R7crRBEXKBCYcMh9nyS3UZ4B9WXuCLFFlUs/5tJppMXdE7bXkSPisuxXeDr97j RzuLs7hihcHo9tnsU1ghS0ivFY0OXcuIQkEXu+dE= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from LT02.fritz.box ([88.152.145.75]) by mail.gmx.com (mrgmx005 [212.227.17.184]) with ESMTPSA (Nemesis) id 1MmlXA-1kd1WU42qc-00jp9b; Sun, 12 Jul 2020 00:06:05 +0200 From: Heinrich Schuchardt To: Alexander Graf Cc: Ilias Apalodimas , u-boot@lists.denx.de, AKASHI Takahiro , Heinrich Schuchardt Subject: [PATCH v4 06/17] efi_loader: keep attributes in efi_set_variable_int Date: Sun, 12 Jul 2020 00:05:33 +0200 Message-Id: <20200711220544.120976-7-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200711220544.120976-1-xypron.glpk@gmx.de> References: <20200711220544.120976-1-xypron.glpk@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:iSeBahNfg40ndDiJgToW43IrbXJud9wAGX42NzRI7R3hR7VN19y 8b0OOk9cD1T7yVuXDX/4h4qLFRlubjNU+31/1expAswMA27bQYm7SmpOlD1gsXoMrckDHEu LrWehvt/BHeoj+1vm0oEMHr6yCLbwTeNxLOwQdkYmUQ0NWVY+RuAcdwyV4cz38gLSYy2TOb yeusDs1I5KlkDAvZJtOTg== X-UI-Out-Filterresults: notjunk:1;V03:K0:zIxxDmgk/Vc=:ZecB1UeTKJyRgVhfxMAeYs tfyKBvWImr7tmeOCVArembIKgrOlMVyPtf3RNI7AwgTfEfWN6hLnPWtWShXKTl8dRdPBVoSXV /LruxX7sDA4yPxuvwnN3VCgV9i1fbmfnvM6Ogc4453bir9noD5Cy0KtpsiHiobNL6E7tTNvRs Cn2oM6oQI1mt7vjK5Bd+IhGgm4Be4kb6x3AYsadE5gxxI73NBiaVWGCd7quCNEkCHnvPtddYW 4fRb/nFHCTpF0RqBDm5e335iwkwGOfvt8eWs8bl4Bx547MlaoYKPG7jB+vziFgpvbSXVLOpJ+ amqTh86jJ+CL5O3/0T0RGH1sQlfAv+OePY32F5OMTMtb1dfGEJwAfrGWyGjlKkvupcbLFbvux KxIibzvnEjtBgnkx4MUBa92n6CfmttF+oy0fNXYVzoGYjcbO+s6v0qL1yu4oPwnS1yEq7m2Gk OD0jq4lTzfHwYKtEHFfdBfVci6sS+USwS/+qL+IEGNb6Zfcn2wcP0Mtx4XlwfT3xavS3zF+ls MsKWRUNk3hr1WGIpKiKj9gTdYqtg5vTFnPS1tlXZFKQI4LM4ovBQ8SK7Kwd1z1C20dSLvPA5w rjIvlIEz4PEA9NjQB/4i//d+qHN1R84s40XpHXWaVM6TBSW7Vw1rXexW+f6RrlXIoWeV4I7Sl rmhT/VFovuua5FB+wPlQysQfv7hJGGp4HeCLlMw36u38+Wq0DqlAbQHw7Pn1ZTGOI/p1MKE1n M5H33wAK28D+CTQLk+mGeQzDfz++rwWf0h54ICA8eVFjC3MVCX3L5hwSdqCj/YLSqcFpkHrqR ObW6/tpJnOuJSAOckt2JPpq0qLGIMBHJKU8Q5y5tiRZGnvrXHjR04jG/KWdD0hFO/nKZmNnKx Pc7WvOa+ZSbjQMGbP/mmBGR9t5E8CW/oY/ZfNMZYEA5U6EHJR4TS7i/W2VixhJA2QFjsMndRr J9RO3M20eYKJxF/9nRnh9nshOLMJLZBTYMyxI5EHzTBbgqRBD3ZuQhNwfyrWxFU709Nu/fdSx P2OWEq0J3lbG6Iv3ubOxAMXlrx13wgxKm2DpU93DOT2ITvmiSLFkEdHct4N5mio/IAuH2dkAr sUYxSzPVhe2SqKuXcmIqsDObGG+qsZa9kI46HzvCp+1S5aFlQU748KWJizPIFjlm8MchWn93C cUEOrb37GL6+/jc3sBbcQyIpgI5f4QJuc9XsBU6QouFrlFDHw+TtPtLAv7rbYPs9Z3K2RaqDO B+0daMAOX7bgssI+5yN5igx3YMdYSkpm6CQ5Alw== 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.3 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. Do not use variable attr for different purposes but declare separate variables (attr and old_attr). Signed-off-by: Heinrich Schuchardt --- lib/efi_loader/efi_variable.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) -- 2.27.0 diff --git a/lib/efi_loader/efi_variable.c b/lib/efi_loader/efi_variable.c index 36bac86702..c9980ca692 100644 --- a/lib/efi_loader/efi_variable.c +++ b/lib/efi_loader/efi_variable.c @@ -827,7 +827,7 @@ efi_status_t efi_set_variable_int(u16 *variable_name, const efi_guid_t *vendor, efi_uintn_t old_size; bool append, delete; u64 time = 0; - u32 attr; + u32 old_attr; efi_status_t ret = EFI_SUCCESS; if (!variable_name || !*variable_name || !vendor || @@ -843,8 +843,8 @@ efi_status_t efi_set_variable_int(u16 *variable_name, const efi_guid_t *vendor, /* check if a variable exists */ old_size = 0; - attr = 0; - ret = efi_get_variable_int(variable_name, vendor, &attr, + old_attr = 0; + ret = efi_get_variable_int(variable_name, vendor, &old_attr, &old_size, NULL, &time); append = !!(attributes & EFI_VARIABLE_APPEND_WRITE); attributes &= ~(u32)EFI_VARIABLE_APPEND_WRITE; @@ -852,15 +852,15 @@ efi_status_t efi_set_variable_int(u16 *variable_name, const efi_guid_t *vendor, /* check attributes */ if (old_size) { - if (ro_check && (attr & EFI_VARIABLE_READ_ONLY)) { + if (ro_check && (old_attr & EFI_VARIABLE_READ_ONLY)) { ret = EFI_WRITE_PROTECTED; goto err; } /* attributes won't be changed */ if (!delete && - ((ro_check && attr != attributes) || - (!ro_check && ((attr & ~(u32)EFI_VARIABLE_READ_ONLY) + ((ro_check && old_attr != attributes) || + (!ro_check && ((old_attr & ~(u32)EFI_VARIABLE_READ_ONLY) != (attributes & ~(u32)EFI_VARIABLE_READ_ONLY))))) { ret = EFI_INVALID_PARAMETER; goto err; @@ -902,7 +902,7 @@ efi_status_t efi_set_variable_int(u16 *variable_name, const efi_guid_t *vendor, EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) { ret = efi_variable_authenticate(variable_name, vendor, &data_size, &data, - attributes, &attr, + attributes, &old_attr, &time); if (ret != EFI_SUCCESS) goto err; @@ -936,7 +936,7 @@ efi_status_t efi_set_variable_int(u16 *variable_name, const efi_guid_t *vendor, goto err; } ret = efi_get_variable_int(variable_name, vendor, - &attr, &old_size, old_data, NULL); + &old_attr, &old_size, old_data, NULL); if (ret != EFI_SUCCESS) goto err; } else { @@ -962,8 +962,8 @@ efi_status_t efi_set_variable_int(u16 *variable_name, const efi_guid_t *vendor, EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); s += sprintf(s, "{"); - while (attributes) { - attr = 1 << (ffs(attributes) - 1); + for (u32 attr_rem = attributes; attr_rem;) { + u32 attr = 1 << (ffs(attr_rem) - 1); if (attr == EFI_VARIABLE_READ_ONLY) { s += sprintf(s, "ro"); @@ -979,8 +979,8 @@ efi_status_t efi_set_variable_int(u16 *variable_name, const efi_guid_t *vendor, s = bin2hex(s, (u8 *)&time, sizeof(time)); } - attributes &= ~attr; - if (attributes) + attr_rem &= ~attr; + if (attr_rem) s += sprintf(s, ","); } s += sprintf(s, "}"); From patchwork Sat Jul 11 22:05:34 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 1327424 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=cy/L1F3Y; 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 4B43tm44lqz9s1x for ; Sun, 12 Jul 2020 08:07:44 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 7CBDD821CA; Sun, 12 Jul 2020 00:06:58 +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="cy/L1F3Y"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id D8E6F81F2F; Sun, 12 Jul 2020 00:06:22 +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.15.19]) (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 6456F81F62 for ; Sun, 12 Jul 2020 00:06:06 +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=1594505165; bh=ZEVnKpbijawBTQyAHHV/QlVfrg3DRR/KPj47otMsTUE=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=cy/L1F3YjqSRY8b1b5CkxvjsbChZIjAxbQ26+COZVSJCBq70De0WvB2GaClr+XXtJ fF5S9okab17S+R4PQCh7GoLPxtP3dL5Z+JiEKpuu9A0N06SISZM313xT1/8ym4+TuS 6NU2qwzXDZjWYWfbbKmdJGgrBpL6Etrujyf2SagI= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from LT02.fritz.box ([88.152.145.75]) by mail.gmx.com (mrgmx005 [212.227.17.184]) with ESMTPSA (Nemesis) id 1MStCe-1kJAHr0wZC-00UMff; Sun, 12 Jul 2020 00:06:05 +0200 From: Heinrich Schuchardt To: Alexander Graf Cc: Ilias Apalodimas , u-boot@lists.denx.de, AKASHI Takahiro , Heinrich Schuchardt Subject: [PATCH v4 07/17] efi_loader: value of VendorKeys Date: Sun, 12 Jul 2020 00:05:34 +0200 Message-Id: <20200711220544.120976-8-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200711220544.120976-1-xypron.glpk@gmx.de> References: <20200711220544.120976-1-xypron.glpk@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:Cl1Fjeeya5Ws+nA+R3TaNKtQ8zNi1KYV4sgLDyKiZKHTW0abZeJ NjbFnkIrapVHHH4VpX/09DKoCPPCfeNRi5mtKPhSn+Spge0Yl6FCU371LBj2S1qNMOvkmNG IJrAAtMbK8MClmXVRQOdLAC7K89G8t3SxJV29GEr2PhGZEj9bnu/DEWAsZT2yaYqzNxqmNj kk6FpVYBR5ZSTbbDQDVFg== X-UI-Out-Filterresults: notjunk:1;V03:K0:T29DUK3u6zE=:3HX+4tavSP1OSvwuhenABh v9pOLf0RnNtmm2fSGsXH0U0B8QqiYuw0kbznfsFB9j/5Zva+Yx5rgKp9GYEHr2bB8nMRk1PtH n3KR28oywDrKRZ7FdBj6iW6HpiCZhJw5balvFhkMDhyBlZpy/9YvachmySbX+uXvodfZy9Yzr i2R2CrZbP5SmVlu4Q2kIkdTKpiOsWvSudwc6r4YD6A1/1UfI7/D13UqghRjUjNKwx+YK1gWdM mqWrM/QzH9VkWE6aGkRxfqwqk1pTVG3ETUyHsbYbpcRf3I1knwndItiOR90nn60I8U/ZO3mpK FZh0ahOIMHWCle6UMZtOJV4wHufOlYW1spF7MhH45H18ZG6hzeFLgeADBvCO4xFbVdILmf7NW nrEDzMQzVwDgW2JVVNsfyU93frH6lsCjj7RMQfPXFGjXFPvhdXeH44+sLz6QWBFzhncV/U3Po NMG6za75yjx4sk7VtK0Noh+VME8mFYW9J4BeJni+AX/zcsJi9V3HTGvon2eqEKvfpXM7Dj8Jg O/RZO1dQzbs5UxBcJSzxlnLHRYwhxpJEURIj0yrhbxYlvLmHQLsRq+psy9ZdY2AhnVFDutKYK Erih1JPxrAwvKcP8eEKKrcecx2ym8m6fzqTykZzA8wD5ySO1EPJglCj8IjM/3LL3ZtDvDtpHq mSFdJgb4h2MBvV1nvJWDb1ZTtXek4voiCXe1xB2pcxN642ACtx56eHulFLomQ1Me49DKavoEL vmS4udH//J/yRHXeDDPhFxyCzz9kopj2GaJa7Wf6WFckaLx60INIe9lQS1AO+kMBNIMAIrDhy YT1IpdlGK9FmNZ08sQQojx5u9Ys3UXTHVHH/UES2TysK18katIUQ6anzVDtBqRrkowJDBE5Kr dUvdMEEhwkwDj/FQ9FCD5vyVI8moJC/au94rDjoi60/cZ1aIX6y0Kw372DjzLLmCVDHfJ0WgB 9bHMVpTe8ZBUI6ZFWHqYZrOO+AWTDFU0/SddRr1ms05SZgpw8DT3PNe/IAI1swVBMwvkIcRLf dD50BUFPWcbghcvLsNvwFIjRgiMjmApvngVpEXxePuxxJ/cuHOE9RDqDlJyTRKeDcg0Uv35fl HpissCTuyesWc8hcDNRDEaRoFLCIo+vAsQ8IJsSTiJpNKE9GHN56zyXewrs25v6Mp2PLLhaw5 eHxpZ/x9OHfudmQCstwDnAcFphMXYl1ZMP1hPNqUoXXVb3C8qheS6qXOtAxNidLzkmr1CfzCJ eX49HD40jpacvZp1ZaDpQaC8gaUK7jF+gQS7QZw== 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.3 at phobos.denx.de X-Virus-Status: Clean According to the UEFI specification the variable VendorKeys is 1 if the "system is configured to use only vendor-provided keys". As we do not supply any vendor keys yet the variable VendorKeys must be zero. Signed-off-by: Heinrich Schuchardt --- lib/efi_loader/efi_variable.c | 75 +++++++---------------------------- 1 file changed, 15 insertions(+), 60 deletions(-) -- 2.27.0 diff --git a/lib/efi_loader/efi_variable.c b/lib/efi_loader/efi_variable.c index c9980ca692..2f8005bd95 100644 --- a/lib/efi_loader/efi_variable.c +++ b/lib/efi_loader/efi_variable.c @@ -282,45 +282,29 @@ err: */ static efi_status_t efi_init_secure_state(void) { - enum efi_secure_mode mode; - efi_uintn_t size; + enum efi_secure_mode mode = EFI_MODE_SETUP; + efi_uintn_t size = 0; efi_status_t ret; - /* - * TODO: - * Since there is currently no "platform-specific" installation - * method of Platform Key, we can't say if VendorKeys is 0 or 1 - * precisely. - */ - - size = 0; ret = efi_get_variable_int(L"PK", &efi_global_variable_guid, NULL, &size, NULL, NULL); if (ret == EFI_BUFFER_TOO_SMALL) { if (IS_ENABLED(CONFIG_EFI_SECURE_BOOT)) mode = EFI_MODE_USER; - else - mode = EFI_MODE_SETUP; - - efi_vendor_keys = 0; - } else if (ret == EFI_NOT_FOUND) { - mode = EFI_MODE_SETUP; - efi_vendor_keys = 1; - } else { - goto err; } ret = efi_transfer_secure_state(mode); - if (ret == EFI_SUCCESS) - ret = efi_set_variable_int(L"VendorKeys", - &efi_global_variable_guid, - EFI_VARIABLE_BOOTSERVICE_ACCESS | - EFI_VARIABLE_RUNTIME_ACCESS | - EFI_VARIABLE_READ_ONLY, - sizeof(efi_vendor_keys), - &efi_vendor_keys, false); + if (ret != EFI_SUCCESS) + return ret; -err: + /* As we do not provide vendor keys this variable is always 0. */ + ret = efi_set_variable_int(L"VendorKeys", + &efi_global_variable_guid, + EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_RUNTIME_ACCESS | + EFI_VARIABLE_READ_ONLY, + sizeof(efi_vendor_keys), + &efi_vendor_keys, false); return ret; } @@ -998,39 +982,10 @@ out: if (env_set(native_name, val)) { ret = EFI_DEVICE_ERROR; } else { - bool vendor_keys_modified = false; - - if ((u16_strcmp(variable_name, L"PK") == 0 && - guidcmp(vendor, &efi_global_variable_guid) == 0)) { - ret = efi_transfer_secure_state( - (delete ? EFI_MODE_SETUP : - EFI_MODE_USER)); - if (ret != EFI_SUCCESS) - goto err; - - if (efi_secure_mode != EFI_MODE_SETUP) - vendor_keys_modified = true; - } else if ((u16_strcmp(variable_name, L"KEK") == 0 && - guidcmp(vendor, &efi_global_variable_guid) == 0)) { - if (efi_secure_mode != EFI_MODE_SETUP) - vendor_keys_modified = true; - } - - /* update VendorKeys */ - if (vendor_keys_modified & efi_vendor_keys) { - efi_vendor_keys = 0; - ret = efi_set_variable_int( - L"VendorKeys", - &efi_global_variable_guid, - EFI_VARIABLE_BOOTSERVICE_ACCESS - | EFI_VARIABLE_RUNTIME_ACCESS - | EFI_VARIABLE_READ_ONLY, - sizeof(efi_vendor_keys), - &efi_vendor_keys, - false); - } else { + if (!u16_strcmp(variable_name, L"PK")) + ret = efi_init_secure_state(); + else ret = EFI_SUCCESS; - } } err: From patchwork Sat Jul 11 22:05:35 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 1327425 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=HUBoqQAk; 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 4B43tz5LxNz9s1x for ; Sun, 12 Jul 2020 08:07:55 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 61AFC821DE; Sun, 12 Jul 2020 00:07:01 +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="HUBoqQAk"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 0554981EDE; Sun, 12 Jul 2020 00:06:22 +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.15.19]) (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 DE62C81F42 for ; Sun, 12 Jul 2020 00:06:06 +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=1594505165; bh=3/XInxWYZmFBMz4xCae/1sSVC2jUtljHOfqG+nS+B/s=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=HUBoqQAkzqi3hyiBfwtxBUQgApfqI2hAEgXgeIdQ92IUhHGUNtAYAn/cytYFuyWI/ S2UZt7ogHA83N+sh556Ov+Ps7qhZ1uOwLP7FPnvuDfxYbYXrULWgaYBq9H4HOIhT3r YaGHdgb1NhUjNVypigHFgUyDOH6BCLuXfaibZzN8= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from LT02.fritz.box ([88.152.145.75]) by mail.gmx.com (mrgmx005 [212.227.17.184]) with ESMTPSA (Nemesis) id 1MKKUv-1kAfpK24Lv-00Lnws; Sun, 12 Jul 2020 00:06:05 +0200 From: Heinrich Schuchardt To: Alexander Graf Cc: Ilias Apalodimas , u-boot@lists.denx.de, AKASHI Takahiro , Heinrich Schuchardt Subject: [PATCH v4 08/17] efi_loader: read-only AuditMode and DeployedMode Date: Sun, 12 Jul 2020 00:05:35 +0200 Message-Id: <20200711220544.120976-9-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200711220544.120976-1-xypron.glpk@gmx.de> References: <20200711220544.120976-1-xypron.glpk@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:f8AvjUCvrXAbujfxeukxUNUUgpVeHTuVZ/bdD48Go3h9pTRIrRM aBvylBk1L10fRZSIUev1uKFKaaqGrvWv3tcAcUhTIpiyOlp/taHZhqLHYJ6ASgUw+0F+uZf 4ntDrQ3Jn6bQpXztnoUq7Nr+h7E68KbKRuISFXVdeOy0kk+FodQBOParCJ7hiIEft5y+njl W/BeqWnjq9jeHpgGE2lcA== X-UI-Out-Filterresults: notjunk:1;V03:K0:b+p4TaWl1hc=:H6+MQmniBMm4IN2GdNa55d AxE5P8/7LRdFwcpnfPGpKHm6O4HpiqILLEXwdlvcrqzjZLkGDGcp8TMtlD+mQ98yTYh4nFdHt 0VbeacKTWT9Gt/S/c4BgFMr+JnoWST05avrMxUoEL2Xkdcj8Ty1FYZbf/WTb2VvqleRLtJdqc CPhh2Pp9uIU872UwgJg6X/IQTDeypde1Ho3EsLWxxvOBeiwhIxeJ4fqRYrTpYh1LINv0xk1rd uHOqrn5e+sy9SpCRhAcea0sEdvGL9RDhy8b5SzA9nJKbXhnHFp6yOPj2H2WkkDW30bDabB+9a WVuoIbT9O2o/QCgowbaoCwG1KDRVxx1XbTK8vB+68Uq+o6lxU6hFzhGuD6kIOA2AMmO2MfpHs q9MHUubjaCx8L5zyRjMaacygKDHO+ZxFweFUWvApjP17KHsrwHrLFiCW9ZHhHNAOnVYSDOPCP 4PG/EjXBOhoq13Pw/OZ6glYoRvVCjCp3C89xeDP6Q49se7GB9VTjhz8qT/azkj418iIobvtsT UuBH1hGppwRnChVRi0q64da+F3ymFsADflc/iNw7uHw1rf2G2M2xxkyiKdsJXZNdrOTNhj2lK 7XHCv9S61g57DxrHcK+Akk6RcxPg7XnuPxVoVsSztLhtHH2HAmyOHhJpgcfY7mLJbrObs/giy PY0yDa9JdKpqgv/Mm+b/lSFaG44NETbxdRf8tNqmKGoD2EaS7rho4DED7AdpYCOJ3wSeQW4WZ qK7x/NsURFqEsnkkYWAQlPjOlOa5LLAOxgH/te9aEmytFph4igG8Q/VajCGOcAI7k1xV6zWYA h2TA172IFRZhQyXAdvD1nizkAy6kUp2QE0bYbUJYNzw8ipHdLB8ZaTSqU6RWWg5zxmTRH3dTY mvutXy0Nhv7m+1ig21RiFL1t/dgCM6tHwkYP2ZTtNzdrRBPWEnJSekLI+sHNQtLYtkoPOLCYA GZP1PRUSXHFKw+Ozu9wtq1KvK4gPtySpnZs+SEoPfb++nVjLy65Sq+dbrgGMOsEpoHBfj0ldq jiHCo8CXuWZTFO2Z4cicGiQIY1OUu9xIwuzMVHH4ktjSw8kjSQeHsoJUO+DDJbkFL82RNvGyH aFjqOPeK1vSkUnlidZlyWyncB1upp+Is7gdog/Y3dRv6+mtv2SKbyAPAB8ahCEiA8L+TYaVZE M7lME7ezVJobN5LRYgrlLWKSLk/eJPVHZ12GOVH4QZ4w98dxLjGEA1eLxLJIyOlnrO1kXptsA HKh9IhKGGhNVShuhuo1tM6AdkEmCdnkxBCgGk5w== 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.3 at phobos.denx.de X-Virus-Status: Clean Set the read only property of the UEFI variables AuditMode and DeployedMode conforming to the UEFI specification. Signed-off-by: Heinrich Schuchardt --- lib/efi_loader/efi_variable.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) -- 2.27.0 diff --git a/lib/efi_loader/efi_variable.c b/lib/efi_loader/efi_variable.c index 2f8005bd95..4bd976e44a 100644 --- a/lib/efi_loader/efi_variable.c +++ b/lib/efi_loader/efi_variable.c @@ -183,32 +183,36 @@ static const char *parse_attr(const char *str, u32 *attrp, u64 *timep) static efi_status_t efi_set_secure_state(u8 secure_boot, u8 setup_mode, u8 audit_mode, u8 deployed_mode) { - u32 attributes; efi_status_t ret; + const u32 attributes_ro = EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_RUNTIME_ACCESS | + EFI_VARIABLE_READ_ONLY; + const u32 attributes_rw = EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_RUNTIME_ACCESS; - attributes = EFI_VARIABLE_BOOTSERVICE_ACCESS | - EFI_VARIABLE_RUNTIME_ACCESS | - EFI_VARIABLE_READ_ONLY; ret = efi_set_variable_int(L"SecureBoot", &efi_global_variable_guid, - attributes, sizeof(secure_boot), + attributes_ro, sizeof(secure_boot), &secure_boot, false); if (ret != EFI_SUCCESS) goto err; ret = efi_set_variable_int(L"SetupMode", &efi_global_variable_guid, - attributes, sizeof(setup_mode), + attributes_ro, sizeof(setup_mode), &setup_mode, false); if (ret != EFI_SUCCESS) goto err; ret = efi_set_variable_int(L"AuditMode", &efi_global_variable_guid, - attributes, sizeof(audit_mode), - &audit_mode, false); + audit_mode || setup_mode ? + attributes_ro : attributes_rw, + sizeof(audit_mode), &audit_mode, false); if (ret != EFI_SUCCESS) goto err; ret = efi_set_variable_int(L"DeployedMode", - &efi_global_variable_guid, attributes, + &efi_global_variable_guid, + audit_mode || deployed_mode || setup_mode ? + attributes_ro : attributes_rw, sizeof(deployed_mode), &deployed_mode, false); err: From patchwork Sat Jul 11 22:05:36 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 1327426 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=k1NadIs0; 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 4B43vC35dZz9s1x for ; Sun, 12 Jul 2020 08:08:07 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 98187821FD; Sun, 12 Jul 2020 00:07:05 +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="k1NadIs0"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 2AE1581F11; Sun, 12 Jul 2020 00:06:23 +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.15.18]) (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 E8F6181F7C for ; Sun, 12 Jul 2020 00:06:06 +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=1594505166; bh=5nr96Rpm4ivsQgYF0jy//h/Oqw1joEET1SqofefCtcM=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=k1NadIs0UYfFkhD+4l5mf2HPpqoip+WPetaaYuuVXPXveZYdrkG0JRp8iNV+d5kSP CJ9RyZeHjigxqw9l/JY8HG3iq4b2rA7FQJncuDidEF6caErig2jc//bh1eHqiYh/qQ nSlKGU1munVoInhtyLvfhzP/7PQA31nZsDayfATU= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from LT02.fritz.box ([88.152.145.75]) by mail.gmx.com (mrgmx005 [212.227.17.184]) with ESMTPSA (Nemesis) id 1MXGvM-1kNY0Z3Bh0-00YmVz; Sun, 12 Jul 2020 00:06:05 +0200 From: Heinrich Schuchardt To: Alexander Graf Cc: Ilias Apalodimas , u-boot@lists.denx.de, AKASHI Takahiro , Heinrich Schuchardt Subject: [PATCH v4 09/17] efi_loader: secure boot flag Date: Sun, 12 Jul 2020 00:05:36 +0200 Message-Id: <20200711220544.120976-10-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200711220544.120976-1-xypron.glpk@gmx.de> References: <20200711220544.120976-1-xypron.glpk@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:nBJeFNk3O/eVd7voire47A+TkT97RxFcq1IwuVSu/HhRkEz+dvE AVvzohkOliY0LJLiUNnN972QHvvd3cX2tbiM0OOP5hvjIYg50eszCgkecLdXANaLxOEV4DU SzovIYCTYBOWHxmY//VTEPH0LpL5d+a2TY+xSjWoFnrr5kHvdEJCQEQ2oHmpF/0q+jb0haL plf0b3SD07EVaaXIQGrDA== X-UI-Out-Filterresults: notjunk:1;V03:K0:2hj/lk7cIuc=:O4eguHSjbHZKh2NNf7wnzl VUmyujpvgvxb/8HZhY/zH/p/529YWj3lSET70wf1ym6IPdEcbr0QZDtFmHM8JKQqwSLEAA4Iy s1IuBdduRAueXEvm5S+IhwC6X3P5tGh3Elol5O8sXDkYNIO4qLi62IqvqWdslooM3ZrZH0vqd cC5zgKtSb1/rurwwt1gumsp4bReSj4+fEcfVOFveAUT5g3lyY0iGXFSonwcfp1iKWxv9URxXo YvtMwrdVSJCv4FLILJaSF3Mr1Eg4gzh+klec/DN6U/8XKlpEhbRhrcLiRElzlYePztI6aOuLn JNbtxhSjDLgvUjVg66eP/3/BbKBFnu/F7Pojwq4DCsDOBvU6RA2Din7UcniT+yiuedPbH2Aj/ V5P/94uPVG03Az4pGVWwc38wRG0suZwOPL3vnL3A5XcwlciBgWxnAevtavW92mw7i1aMWtnsA FQGVSiZXI83wNoRGM7/LaOcDms1BAGOfSqcLK8ePaCuus6UHx6t/MDavBhbwUiROK2ztaVFb1 TUuF+B1jSGc092qN52LO5ypctnL2QwAzpf2tqZ2VGYyYm+zo9Q5A12rSeBpL6umAcgRcAk71W sJoTUWKheXZK99uVvd27w3eCCbo/C4nDyqnFpYZTXGkhM+MeBSIUQzjEJW2Rkzjw7TYY+fufk 3tPwFw2oAem+ndQBWnCPN1IL3S/yKSAHC45zTey/papfcIjGuZW/WrgEg7r5t1ZoWsVEa1UTK GO633UBKNLKEwuDyie5INIDV7nyVgGSxvE4WRygNJDcsW/+7domzCwJCIdhy5HdtnC/zHKdcU NiumEzEGnKxQbDey60b9ospOXDeP0CmAhLQZ/YTH5utGlchoFdMrWXo72BzAxocz1gMIy4w5D KKvM8vOzg4XytKvDCT9S8hjIGFTj30LbXPo22QBALj9Jhnrav4lTBr0BHbsQ+YUxeFtXQ0S7q JEVDRKuM6Ca2AImlIAH3e3bwKlhjGQAX0ugyE4d68SjuJY6OBeJ6aBgiQie5kF/haLhzdkZ60 v4ask1wP7gIdnP8L2SbjRoEqbxx5ZbGqAm+HoLGCiJBNponKMUj+M46jnUX4/Et9zXihryqlj ZUs/YmQ2hZ/lMWZ+JH45soddkg3ul0t3meNrtBbjEn+gFQ8K9wZH9CwNW1Og0hLBUDBtvuPd6 WlSJvKLyKsR5xaYxxt2L5jlPqytH49DHBbisQmV7DGE61Gc/dqhWOl7OW6tr5wJIU75RcDk2k a2oZ/sb90apwzGKSAOitnsKYJyL8SWDZIE6IIdg== 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.3 at phobos.denx.de X-Virus-Status: Clean In audit mode the UEFI variable SecureBoot is set to zero but the efi_secure_boot flag is set to true. The efi_secure_boot flag should match the UEFIvariable SecureBoot. Signed-off-by: Heinrich Schuchardt --- lib/efi_loader/efi_variable.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) -- 2.27.0 diff --git a/lib/efi_loader/efi_variable.c b/lib/efi_loader/efi_variable.c index 4bd976e44a..0d6bafc76d 100644 --- a/lib/efi_loader/efi_variable.c +++ b/lib/efi_loader/efi_variable.c @@ -190,6 +190,8 @@ static efi_status_t efi_set_secure_state(u8 secure_boot, u8 setup_mode, const u32 attributes_rw = EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS; + efi_secure_boot = secure_boot; + ret = efi_set_variable_int(L"SecureBoot", &efi_global_variable_guid, attributes_ro, sizeof(secure_boot), &secure_boot, false); @@ -240,8 +242,6 @@ static efi_status_t efi_transfer_secure_state(enum efi_secure_mode mode) ret = efi_set_secure_state(1, 0, 0, 1); if (ret != EFI_SUCCESS) goto err; - - efi_secure_boot = true; } else if (mode == EFI_MODE_AUDIT) { ret = efi_set_variable_int(L"PK", &efi_global_variable_guid, EFI_VARIABLE_BOOTSERVICE_ACCESS | @@ -253,14 +253,10 @@ static efi_status_t efi_transfer_secure_state(enum efi_secure_mode mode) ret = efi_set_secure_state(0, 1, 1, 0); if (ret != EFI_SUCCESS) goto err; - - efi_secure_boot = true; } else if (mode == EFI_MODE_USER) { ret = efi_set_secure_state(1, 0, 0, 0); if (ret != EFI_SUCCESS) goto err; - - efi_secure_boot = true; } else if (mode == EFI_MODE_SETUP) { ret = efi_set_secure_state(0, 1, 0, 0); if (ret != EFI_SUCCESS) From patchwork Sat Jul 11 22:05:37 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 1327428 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=j6ryeGjh; 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 4B43vf16KKz9s1x for ; Sun, 12 Jul 2020 08:08:29 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 1A6B3821F1; Sun, 12 Jul 2020 00:07:14 +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="j6ryeGjh"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 22017821BD; Sun, 12 Jul 2020 00:06:28 +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.15.15]) (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 54A6381F80 for ; Sun, 12 Jul 2020 00:06:07 +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=1594505166; bh=vZ15/QduN1CJRlKQ0ssxxBzDc8MpLKeDRMG38FVQx20=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=j6ryeGjhxQ3pj2ZAYng7W46GbExw6n+Jx8CfMbDyJrJ+eUnVYAnNA04tZwTGw6fpg /d3YicMjArbVC/VJ4muo0V4KxMAo9fGlfGyqGaE28+tHCVpe804UaIHwWiuTV8GV9U DwRe/hK1JaGA4E3kfW0ihWil05qO6/VzcjCemd1w= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from LT02.fritz.box ([88.152.145.75]) by mail.gmx.com (mrgmx005 [212.227.17.184]) with ESMTPSA (Nemesis) id 1MdvqW-1kUG520Ofu-00azRv; Sun, 12 Jul 2020 00:06:06 +0200 From: Heinrich Schuchardt To: Alexander Graf Cc: Ilias Apalodimas , u-boot@lists.denx.de, AKASHI Takahiro , Heinrich Schuchardt Subject: [PATCH v4 10/17] efi_loader: UEFI variable persistence Date: Sun, 12 Jul 2020 00:05:37 +0200 Message-Id: <20200711220544.120976-11-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200711220544.120976-1-xypron.glpk@gmx.de> References: <20200711220544.120976-1-xypron.glpk@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:AMVkcDWZIJvBf0FwpT8WS/C4oXA25s0+BWKkgIqHDRqgC3HO72Z GwSfGWPvRHN03IxXCmwIMpfoZzCY1gkLfyhAXBdU+tzl+JcxFJnKF3fFW/D7SMN8dGUJSeT Y2xDQSz9QHAo1uY45jWNfPnaWEvbz24P1UXF88/mlgdhWmHompdmjhwx3Lju0zaOE9fuBsh x3lRnH8Fxsb3obveUD5jg== X-UI-Out-Filterresults: notjunk:1;V03:K0:lcF7wnfcfvY=:OPdEtENMZbS1MmyXIXIOE3 UmzxD9nHb22GmJy5cUqjGG6IDPK2zkfaRv/bH9sx534AKah3pLRY3T/3nmplsaQToVGoadTUt WxZQvNNQ6wzdxGBIwZLFt+cO/SdOaV8U77enX7fyZi0W6RZPoksH3FQ/N/sq01bQJXJf7GmSV fnXs3NgZgZ4u4v8usGTUabOxtSrEDeezLHTScYCI4odW2qyxMeA2e91LX9/kjClExFtVh+Z0d HXhtSDB6JI9343y9MmOL/N4KClFhmuvU8zWXB2bvH6U/GAbnVTJ3kg77hp3st3gMgy5kW6Yp1 A1gkljhpWfTnFU/jvAQQHMobY+0936aeBXQWZzC7KlDTiZ7EYzW1T83dH4bwuR1k7NpAsXvKs zmgXRCnrY5DXVI2jsEJ5NmpQYSB8Fz2vXBh3/O0wgezySsr+cMC70uWQybI+97tNIbbwoS4Ls E5Vr3C96VWc5w3OvyF7eCMv45z6hS0qK/TEhKjRuMVXUk0q1QQjsJTqT7RxPs5fY2Mc+T8x3t mEykpGcCdzyRqu4zXkeMG6/bmA45F+ZUprlV4iFo5vBi14KH58+yiHpjlIXCB0N7FZzV8CrlK 2fR8zd6kVcgU3/5pORuRDLNJA3D1/rLnOXqBB5BAwvKJ2zDZszGAH1U4kDyUVDh7iaAM12+ij GDdugeKCDqy4uZpUCxwRRhaVmarMJzbdQFnKmZsFAnd809ciKnufql6+CJ21nF6i9Ie5RKoFX C2hnhlxcyNEzheuk1GX+KU39FeKJ7j6HWhFq6X1Xggj9qsdUVvZVPJGuUUOQZ0wkteRvYdgPS UPxMEOp5Y+x7Wwia1xbZfaIgJjpfEEnJym3hEEwfXfeaCP+jMd+yg/R4bw6C3qhgVU41PBGqT 0UvGd3Tm2pgQJC6w3+pIqyDBkL5Hu8o1jqs7Xwk9QztOaYWHIfWdIYNPfpPVeW0hJwKvvN4l5 HPEQNnlX8Qx44mpp9Z+UM1qhb3pmhHLJYVJknF8hktiO544CH9c3Ryc96anDM/YlWC7XOgzsy cQ7VgtP4dLLrHVr5zfoHupHyiFTHUjgI0n69LDNfMwoDZhxq0mT3xu+pkaq1hhSjvc/GTLa0g QKFa1aD5UJa7JchHOnizMBwyKAVWqwebbrbSLUZkeuLu5FcYJiV1LEMY/e64X6kbtz9eZPIr5 xYLKNBmJ57Lte5wh80/Zy4gIe7HaZ5PzirIid9CqCbkUIIhXl6NKj9v45b/xiQ4/PCfQ/ilIT bdiCdeFFxXtXj9OLTV9wOxdhaCTWEwTUcUhv8hA== 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.3 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. 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 | 62 +++++++++ lib/efi_loader/Kconfig | 8 ++ lib/efi_loader/Makefile | 1 + lib/efi_loader/efi_var_file.c | 239 ++++++++++++++++++++++++++++++++++ lib/efi_loader/efi_variable.c | 10 +- 5 files changed, 319 insertions(+), 1 deletion(-) create mode 100644 lib/efi_loader/efi_var_file.c -- 2.27.0 diff --git a/include/efi_variable.h b/include/efi_variable.h index 3ba274fce1..01054209c4 100644 --- a/include/efi_variable.h +++ b/include/efi_variable.h @@ -79,4 +79,66 @@ efi_status_t efi_query_variable_info_int(u32 attributes, u64 *remaining_variable_storage_size, u64 *maximum_variable_size); +#define EFI_VAR_FILE_NAME "ubootefi.var" + +#define EFI_VAR_BUF_SIZE 0x4000 + +#define EFI_VAR_FILE_MAGIC 0x0161566966456255 /* UbEfiVa, version 1 */ + +/** + * struct efi_var_entry - UEFI variable file entry + * + * @length: length of enty, multiple of 8 + * @attr: variable attributes + * @time: authentication time (seconds since start of epoch) + * @guid: vendor GUID + * @name: UTF16 variable name + */ +struct efi_var_entry { + u32 length; + u32 attr; + u64 time; + efi_guid_t guid; + u16 name[]; +}; + +/** + * struct efi_var_file - file for storing UEFI variables + * + * @reserved: unused, may be overwritten by memory probing + * @magic: identifies file format + * @length: length including header + * @crc32: CRC32 without header + * @var: variables + */ +struct efi_var_file { + u64 reserved; + u64 magic; + u32 length; + u32 crc32; + struct efi_var_entry var[]; +}; + +/** + * 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); + +/** + * 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); + #endif diff --git a/lib/efi_loader/Kconfig b/lib/efi_loader/Kconfig index 6c9df3a767..4324694d48 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 7eddd7ef37..c87b82db32 100644 --- a/lib/efi_loader/Makefile +++ b/lib/efi_loader/Makefile @@ -40,6 +40,7 @@ ifeq ($(CONFIG_EFI_MM_COMM_TEE),y) obj-y += efi_variable_tee.o else obj-y += efi_variable.o +obj-y += efi_var_file.o endif obj-y += efi_watchdog.o obj-$(CONFIG_LCD) += efi_gop.o diff --git a/lib/efi_loader/efi_var_file.c b/lib/efi_loader/efi_var_file.c new file mode 100644 index 0000000000..b1b7532495 --- /dev/null +++ b/lib/efi_loader/efi_var_file.c @@ -0,0 +1,239 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * File interface for UEFI variables + * + * Copyright (c) 2020, Heinrich Schuchardt + */ + +#define LOG_CATEGORY LOGC_EFI + +#include +#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) { + log_err("No EFI system partition\n"); + return EFI_DEVICE_ERROR; + } + 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) { + log_err("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, + &var->time); + 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) + log_err("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))) { + log_err("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, true); + if (ret != EFI_SUCCESS) + log_err("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) { + log_err("Out of memory\n"); + return EFI_OUT_OF_RESOURCES; + } + + ret = efi_set_blk_dev_to_system_partition(); + if (ret != EFI_SUCCESS) + 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)) { + log_err("Failed to load EFI variables\n"); + goto error; + } + if (buf->length != len || efi_var_restore(buf) != EFI_SUCCESS) + log_err("Invalid EFI variables file\n"); +error: + free(buf); +#endif + return EFI_SUCCESS; +} diff --git a/lib/efi_loader/efi_variable.c b/lib/efi_loader/efi_variable.c index 0d6bafc76d..8ed4b0830b 100644 --- a/lib/efi_loader/efi_variable.c +++ b/lib/efi_loader/efi_variable.c @@ -988,6 +988,11 @@ out: ret = EFI_SUCCESS; } + /* 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(); + err: free(native_name); free(old_data); @@ -1083,6 +1088,7 @@ efi_set_variable_runtime(u16 *variable_name, const efi_guid_t *vendor, */ void efi_variables_boot_exit_notify(void) { + /* 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; @@ -1102,6 +1108,8 @@ efi_status_t efi_init_variables(void) efi_status_t ret; ret = efi_init_secure_state(); + if (ret != EFI_SUCCESS) + return ret; - return ret; + return efi_var_from_file(); } From patchwork Sat Jul 11 22:05:38 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 1327429 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=E5JKkDnB; 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 4B43vt0Qcbz9s1x for ; Sun, 12 Jul 2020 08:08:41 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id E95D782207; Sun, 12 Jul 2020 00:07:17 +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="E5JKkDnB"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id B4AB681F80; Sun, 12 Jul 2020 00:06:28 +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.15.15]) (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 7211282178 for ; Sun, 12 Jul 2020 00:06:07 +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=1594505166; bh=ba4ruLHscHNKf1MuZxHRhm14R5UJzE557khuVNrytEE=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=E5JKkDnBflMKExmf4n3Vl6jtWL4l/T21PLw61jtsqD0CuOkg8scM8ZlOWBLe7C3eW hb/7Xy6bDqlDU4GCwCfkUeYlOI8IsY4aWQth/uaXT/loOsx8lAg1dBiFXjjkMaNgpt KHyRBUwLgiVS/UnLcTF/JT/ZUlqXrxn/4CZUaoKc= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from LT02.fritz.box ([88.152.145.75]) by mail.gmx.com (mrgmx005 [212.227.17.184]) with ESMTPSA (Nemesis) id 1MNt0M-1kEEru1XSK-00OINl; Sun, 12 Jul 2020 00:06:06 +0200 From: Heinrich Schuchardt To: Alexander Graf Cc: Ilias Apalodimas , u-boot@lists.denx.de, AKASHI Takahiro , Heinrich Schuchardt Subject: [PATCH v4 11/17] efi_loader: export efi_convert_pointer() Date: Sun, 12 Jul 2020 00:05:38 +0200 Message-Id: <20200711220544.120976-12-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200711220544.120976-1-xypron.glpk@gmx.de> References: <20200711220544.120976-1-xypron.glpk@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:X6aSyKlnylVpUKFjCFQMmQrWFfWFtetbOEc+GFW9AEj2vmDST9T JP1XEks6aEIilbcdlqj4LkDJ5l3T8VZlqFnCnMSbDmrUENVlmPjm4ZFeqamdaCA8vXDeuhS noCvJtW78h2fTjpzKp4JR4sTZSySknFntjs1Ipo6XJhnXiuRF38on/lpVpkceiMuHJ8Y8hK paxHhoVGHeg440T06Kr2A== X-UI-Out-Filterresults: notjunk:1;V03:K0:zDxRGbyxLyI=:mD1pFQaSbZHswWp6nRefQ9 TTuBboH/dweIt8yHOTa/ZoDaPdzgpfraBI4jzWZ/BJbU1GVhx4XMSHZGklo03l9oZaR2NgAKy Vhro3Yn8NbFGqfYOqHgnbzLSQXlei7+ikdDVvHgEqIfwZ0RhB7VJBlTN2v9v8T9DKOpObCdlx kGdeX6W4+Kr8wLMBY1a4OB8kaQ12MxkL9nZ8HLO9VJdR7M1Oxii7V/l9P3PfAQK85ZiYhT6AO NhfRQPhEhg8ATTUw8eNdF9LwsPvg8kqFGKIl1qzPFkLLcYe0fCoZnwzNMPn9tTnutHypMeLZc Rv2vmvpLvbMTiZoP3Hzzz3L/wdeVbTJAgPleowjPm3YC46y2+5ElK9a+dUGF/e3vMgWZE8HfY 2oJQknE3FtJhTU8UHDO7t3kFVciaiYXfaKnlXiFDS1ppLsc5VFmzY+uDpdgRKtLWSl1vzVKKL 1sr/j7uOtvN9A1RmWHFO7Ek0Qehmaoa3y7AvwI5kcZCacOPUHFbAEv/DOnMZPgb7gsf5Ke1eP PY7wGf/C2tNNl8kh68FVIGa+JzG7d/xnAmai7+9HTSAOGLVcpoUf0rYExyG7Is958lBhn+ilh 8quXuGLwYBbJpU67G2+B5rwlYhTiulsHbaUwqwvHQzbGZcLPVLz2bYRrL25r7lI16sUfIAejt 6KHC0paVB3tbG/v4KXYGq1Itw1b4m4+2elZ268isWp3vBafOQ+utEwJvnv5HzcJOEwJAC5heo Loz4INU93PZirib1572GILyb7XCuzDJUdCyPYwh430t66dgBZe2FNKD3CY35NhsuAnDvV7Woo ZS3VSJoJ0LVADdFcD5Z4T+z4hbQ9s/L2rBASrL33X57X/TWD5SXKzYMfyUlF4R9B7JBmMUR/v y+9yczPXVjOzZe/GFiL9hOfGGCPn6XOV8pqghT/p/s3Uq7zTEQajERZCNMidvAMUXnH9u8rJO uWAoVVjza3rMSBMaQXJr2ZO6eJF4ODlFM61eNJvcm9RpAOf80b3BUErVQ6xpxBYHUZS7CNkUj lv4bhLN2X8GHg5z5fztg9iwHMUXAHWOhdw+5fyz90+Wn5BRP4H0aD+5gb9d9GAS5tLGdREK3y HFD5L0146baNYWg2Lb0Zey38uAWLzRrEHn6JRu192zIwT9T97nxbAwO55sfXWA9Kh3Hf2poGs 25Bmkf1/X0To2gRGxHLVHjh4oWGz/Punkj9J8FbQLkn/VK2uuRePE3sewqevRS9SPzVVKIkEA WxhhRg4abi4rmxyeMjOoPJ65JgWu1U/s2DI9z5A== 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.3 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.27.0 diff --git a/include/efi_loader.h b/include/efi_loader.h index ceabbaadd0..be6cede92f 100644 --- a/include/efi_loader.h +++ b/include/efi_loader.h @@ -397,6 +397,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 121e2f65c6..45baa2fd3e 100644 --- a/lib/efi_loader/efi_runtime.c +++ b/lib/efi_loader/efi_runtime.c @@ -496,15 +496,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; 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; @@ -533,7 +531,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 Sat Jul 11 22:05: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: 1327430 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=UxdmYZdQ; 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 4B43w36qMWz9s1x for ; Sun, 12 Jul 2020 08:08:51 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id CF07282234; Sun, 12 Jul 2020 00:07:21 +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="UxdmYZdQ"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 592DB8216B; Sun, 12 Jul 2020 00:06:30 +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.15.18]) (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 CD9B68216B for ; Sun, 12 Jul 2020 00:06:07 +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=1594505166; bh=aF/dO+ii0ZptUzSO+SDOF/JS/NmeSoyXKuEhIuxHN64=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=UxdmYZdQXezkdpSIJ0myJqJgKN/MiWhdRIPggkIGTbWXGGV+WYzrqo4MehljlVtXT hDGC6/xHMDBmXG1j1k5/h0rIEQ737FZy52qbi0VBRsmIJMY1cY1rb8LXqcFrE8gQME R16gvM7v52hYq/HBk/27UqfpqDKB1Rz29/1kT53s= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from LT02.fritz.box ([88.152.145.75]) by mail.gmx.com (mrgmx005 [212.227.17.184]) with ESMTPSA (Nemesis) id 1MrhUE-1khxTW2nCO-00nh25; Sun, 12 Jul 2020 00:06:06 +0200 From: Heinrich Schuchardt To: Alexander Graf Cc: Ilias Apalodimas , u-boot@lists.denx.de, AKASHI Takahiro , Heinrich Schuchardt Subject: [PATCH v4 12/17] efi_loader: optional pointer for ConvertPointer Date: Sun, 12 Jul 2020 00:05:39 +0200 Message-Id: <20200711220544.120976-13-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200711220544.120976-1-xypron.glpk@gmx.de> References: <20200711220544.120976-1-xypron.glpk@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:jmURKsyk78Rr6CjvgxxaPh/vAxrLeAL/21eOdn69+nnXE8BbW+r 3vbU75v6adJg565NcofvZEtzrs8X1e+emyj0bAeRwQ9qiemH0Xy3gDPkYuDqWH/t93GdXdb OIFEeQP/lv8kK8Xe4fgdmGSF7t46duteo41v0Hmy9hX/ZQKOzEmjBLs4Cd2EU4QkEkpdSz0 pOlOdwaH1F5k81C7dp9Jg== X-UI-Out-Filterresults: notjunk:1;V03:K0:c4Ci5heizBg=:VfmXCtnmqVKyBrsAarvFzW I/HwaYPXwQjJI+/gcINhbJmIz158fIU2jSvfIHr9Ewx3p6ZvoFg9DyTvxttGy2ILttcrar+iY 75Et4/azd5U1cUWJEXihH+YCk3Hs64HjYgg+L3rzbezTDE2bVjOFC+Aa4AVqYZP8qUap2C5/G ORD+wVN384ZOqPflBawHFyszusAkYEKOyLklAu3Y0A0Io2oHxrqR8rIrPcCaz3CXRRh+RFZTx 1f/AcbplJ2z14bvy5TVhTfo7pYBw6gD23f2EoWG3g+2ydEUIgpTlN8GTD52oxRb3VsyM+OkIw XmO/NsCbCRXIVH+Swsr5SmZ9Oskk3RYKFbGb+NDbES7l9NKAhZr4x1Jegei6N+WdY4mNLig8/ 6hqGLz1Y0FD60ruLbEP90xWoh2Ml/AhraxeCmVY2BWW29lexk/SyYJWBuesnb2dNekQET2fiU CUIoDsldirODCHvQp5xfQDc0qzvuQPId0Dfsv8ZU3pf0BM85SY9TVW5X603FIgUtayx59dpwW VvELsJQiMgvWufxSWjv4p0ZwAzL+vmWqvug0k0vocQRT/wim4q1xV4QiPogr/ddZ9RegRmOOg AiGTVhFmGZmKM5HtDUN0Asi4TXUlOzE6H7tokYVrDwz0oAz7ACIW2sbmmwf8arJBnGE2lIn00 7hVXKZN45F8sJiA8KUX5bhyXIsxGEhsyNUuBH7BLHYxvnOJcxh4QuDo9kGnIiFoTKD/mEQq3x h4XUXZMOe5QXsz6Jyw0TLML1eh8pETlQiqRGqi47WG/16nhHqU1LeRsmTjt5aE38AetNLjgRB PLXtaTCLIOFMYq2pPgawBapoESplaWfzKWVNXvMXSbD2k7b5hWViAe182sZ3DJXgxK8u6Zl5X 4QgGpoYMdIt4DvIypvwJusTLnxb/Bk+SUT0+66uW+kjIZ9v58uK3CD6kjOLbOBtBQ9CiSKhgp LaKmYnwf8rxGJJZhl3Hd3tSxOpL3VkfocJI7k6715wSimTfI16cXf+XyQxjAG2ELDgqa0IZyw Vage4KK4rr6w0OayI7nrehBFEZve9jh3JKGUWPRgSJTmjah/4Q6psXnmzbHBw/QPEpf3D87uP 5pm43hoxOMsNPIjePqKpqBR5hYKVG8SDVPe3CrqXqFNjj2gkUtFtuZc/x6DMBr7h/WjGQiOui w9y0MJ197Dg2ysP32v9z7vdy4Au51mDK6q+Y3KEaxeva5UdDe/JlqtmpfWKJ73f+SCn3LBNNO BN5r/K5RhbZ6pJzxkWwdoJijuJ9K3totDR6h7SQ== 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.3 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.27.0 diff --git a/include/efi_api.h b/include/efi_api.h index 759d911875..5744f6aed8 100644 --- a/include/efi_api.h +++ b/include/efi_api.h @@ -251,6 +251,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 45baa2fd3e..a4aa1d8b6c 100644 --- a/lib/efi_loader/efi_runtime.c +++ b/lib/efi_loader/efi_runtime.c @@ -512,6 +512,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; + } addr = (uintptr_t)*address; for (i = 0; i < efi_descriptor_count; i++) { From patchwork Sat Jul 11 22: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: 1327427 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=UeyLXkc1; 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 4B43vQ4TYPz9s1x for ; Sun, 12 Jul 2020 08:08:18 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 1FFB282201; Sun, 12 Jul 2020 00:07:10 +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="UeyLXkc1"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 3EAD581F62; Sun, 12 Jul 2020 00:06:28 +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.15.15]) (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 1B6F882173 for ; Sun, 12 Jul 2020 00:06:08 +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=1594505167; bh=6exvAjW2rqO8kcTtlMfZ4UrxkdljQACnFiGmgCfNTd8=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=UeyLXkc19oslPUrLVnX5vuZL6weiSXFHm6ELOrAnktJpnFH5Iw9yI15G71L+bE14O 2slfTqXaP6oCYNnOLkv2qfHZ5L/1JH79wT9poB0wJBGk06jyo778DkZpD5nB6ujyzl LvGUZTh4jpgL3nPEUl6cgvV8+NQbIODKt1V2anaM= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from LT02.fritz.box ([88.152.145.75]) by mail.gmx.com (mrgmx005 [212.227.17.184]) with ESMTPSA (Nemesis) id 1MTzf6-1kKGDc41hK-00R3HX; Sun, 12 Jul 2020 00:06:07 +0200 From: Heinrich Schuchardt To: Alexander Graf Cc: Ilias Apalodimas , u-boot@lists.denx.de, AKASHI Takahiro , Heinrich Schuchardt Subject: [PATCH v4 13/17] efi_loader: new function efi_memcpy_runtime() Date: Sun, 12 Jul 2020 00:05:40 +0200 Message-Id: <20200711220544.120976-14-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200711220544.120976-1-xypron.glpk@gmx.de> References: <20200711220544.120976-1-xypron.glpk@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:C4BYUiF4RLzhld70dL6iRUtfBgskHLsba1Li7szw+UlCIkVYjL1 4v7PFF+f5Fu8Zkhk/x1YiPljMBiWrWLRBmcXvdtTTQEKDbYQCRf5WO1h9wskKbjKBg39N+m uRnfpXCAyImkpKR9nsDAPRoUTuVpLz1ENsyknHrfXqw+zNJMBwoIuHAMvzo9NvIvvQPnVj5 FbruWP3RuBjDrZhUGM0oQ== X-UI-Out-Filterresults: notjunk:1;V03:K0:nROBQloQobQ=:Dl8/fWN4F2eY6PzkP/2jkx X1g3zePlfl5pTmN+KMnWpDnGYfwOC6jEFtS7xxFtUe/zCiDvxHozOIW2NCCrPRJ/9IrckAbwy d1SYRHhn1J6WRU/FG0DQSHCXQ4krQiGjxVkYV+jkJkyU1dSOpf65d9FblNSKlLxfV6OSiaMmj 9Uq24I7NufGVKBm2iz9+xTrmQxz+6BgyOcoN7Qvfoe+AVhkwYEuJyuaaUSOJJAMBOPZWzK9W8 JlTLsIVi4yC8srEm9AJ1NJED9dm7O2WoyS4nA6oEmn7yOFwD723p9mCIPRuP84+NjAJk6TwKq X5aeMeX5R//Bq6asRlmQ6LJbGfwL8DuzR448a5judN+kvJvzsG0TB71YBqkBqVNJtFust73bY TuNiJ22RegIae+R4eQRCzX891YshlEzUzgrt9Zyc9sm4/QhBtLfed/A91P8dNx3DGZZRtbNEr BAgMsES6hpnTLhyo9nN2vdeOOGKcp6KgVByhfDcnX5pnDIibdHUFN7PmtOWTu9AMJJ2nb9caO uONwwWRSf3cUb3jPsBeVDYRapiO5azhFFS0KcS07lr91ndJMRkLz0dnaQ/FZFRCFiS2QIQEDH 1TEDGLDD9RTDEQLkG4yhqwme5qwcSOjRjjJgWOwcDHGpf3HL2t+DvHP2VdRenl02Qoxvn6Tts 4w1n9hJFW3JLe2YwsBmGTqnAlTOQpwg5Nz2x6X1MQo52OxCQbHthhhXjuv9pGux9hKvIbO4TK ki3rp1BZ1dT/MjGd6F9upWIcIXvwKka80eeh2HcgY76JXPb/1p9UV+fE9ajn5m7+5EEJ7n8go EUsvDtWLjs1uSMTRVR/0CCRA6uUw/JnRY4Nlk341hLrax+z0UnUGz7ggntiwBPc0rvObmw1Rm WSB4GEEsx+tOmYXbWxZXzfPXNiTzRxZOE1asTLNatxYP/Ll9BhQz7YxKEWgeOa8ZVweCqxOwA 4Mua4lJgVVLQ73NuysUlZHI4zAwlqqrUMqYZSpv2WCIzYcKunbccH46NTBmoJTlfJrNQi+rbZ OCn60mpyB43HRqWLmtgbye0Z3rAfoituCPnY3wSc8mVT1SvUM6CJXvTyuz5DLSqXriiR9NQRD nLu7+4cb7No68hlZNlJYMxwsARtOdq3sDoU08wSu/Ulb5mdAykk/CbKgp1xDuTjCZbABtoEvy 6JPCU2e4uFwQislEjS0pELD3hEunPGlkrT0KSif0OYfcT5KCGy/OZbTIlPR3VU/NTaqFP92GI eNxqc6pmtuRbzjjvhI2Ftu2yPCDpNPZKgahfE/Q== 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.3 at phobos.denx.de X-Virus-Status: Clean Provide a memcpy() function that we can use at UEFI runtime. Signed-off-by: Heinrich Schuchardt --- include/efi_loader.h | 3 +++ lib/efi_loader/efi_runtime.c | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+) -- 2.27.0 diff --git a/include/efi_loader.h b/include/efi_loader.h index be6cede92f..98944640be 100644 --- a/include/efi_loader.h +++ b/include/efi_loader.h @@ -792,6 +792,9 @@ bool efi_secure_boot_enabled(void); bool efi_image_parse(void *efi, size_t len, struct efi_image_regions **regp, WIN_CERTIFICATE **auth, size_t *auth_len); +/* runtime implementation of memcpy() */ +void efi_memcpy_runtime(void *dest, const void *src, size_t n); + #else /* CONFIG_IS_ENABLED(EFI_LOADER) */ /* Without CONFIG_EFI_LOADER we don't have a runtime section, stub it out */ diff --git a/lib/efi_loader/efi_runtime.c b/lib/efi_loader/efi_runtime.c index a4aa1d8b6c..5b6506fbdc 100644 --- a/lib/efi_loader/efi_runtime.c +++ b/lib/efi_loader/efi_runtime.c @@ -137,6 +137,25 @@ efi_status_t efi_init_runtime_supported(void) return ret; } +/** + * efi_memcpy_runtime() - 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_memcpy_runtime(void *dest, const void *src, size_t n) +{ + u8 *d = dest; + const u8 *s = src; + + for (; n; --n) + *d++ = *s++; +} + /** * efi_update_table_header_crc32() - Update crc32 in table header * From patchwork Sat Jul 11 22:05:41 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 1327431 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=ZKMQcKaB; 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 4B43wG299dz9s1x for ; Sun, 12 Jul 2020 08:09:02 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 4C37282205; Sun, 12 Jul 2020 00:07:25 +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="ZKMQcKaB"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 8831481EDE; Sun, 12 Jul 2020 00:06:33 +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.15.18]) (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 601498217B for ; Sun, 12 Jul 2020 00:06:08 +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=1594505167; bh=QEiOSiXHVy4gaZlIZChKOzM0W9dSW5VtAu+hd80rR4E=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=ZKMQcKaBAQGgDVt/AgH/WQ1cQXFYnijKdWl9l1iDG6eYJfyydAUKUT1Q7BxAyhBZ0 aC+V2iotF+91zD8i5izzkSOlKelH2I9vITsXfxg0hUXxxFBrUrcBTxcrUML8K+Tqtp K7fUdPNgh/ZbObO2to31+WA+aXZDMl6mqP7JL+B4= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from LT02.fritz.box ([88.152.145.75]) by mail.gmx.com (mrgmx005 [212.227.17.184]) with ESMTPSA (Nemesis) id 1Mz9Un-1kpUEO0u3v-00wFDm; Sun, 12 Jul 2020 00:06:07 +0200 From: Heinrich Schuchardt To: Alexander Graf Cc: Ilias Apalodimas , u-boot@lists.denx.de, AKASHI Takahiro , Heinrich Schuchardt Subject: [PATCH v4 14/17] efi_loader: memory buffer for variables Date: Sun, 12 Jul 2020 00:05:41 +0200 Message-Id: <20200711220544.120976-15-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200711220544.120976-1-xypron.glpk@gmx.de> References: <20200711220544.120976-1-xypron.glpk@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:3BfA8IWIzTryYcUzdBkRTIaEvLJmaquruo+Z/ZxNqizk38oc3ks 7jXZoFcEfXFzKsp8FvIQMVXUenhoxAeV0um/PkoYv04RbnTOW/0JNMyIZT2QLIRVtDVnGqx JBmJulnEdLGThC9/BZ547WoUTmOYKRQHpx0vxiQ97qKTMH5yFdA5gdL3p8NkFRWNUmra/FA /UKzqUi+YavYxwHCMfOMA== X-UI-Out-Filterresults: notjunk:1;V03:K0:Mhri/dpyWS0=:c+APYAxFMYK0n6UKYuaF7o UwaMRm0iv5AwnSMhr05c/kcVzmxQhp+iDiyOpVqduJY978JQlyQ7cV2gvHUVPvamDv+dw9Ftm Y23JtNw4wMifp8HADi7zP7pFUJ3gJK3fYYuStW//NhUtmsfGibDec6XHSzkFpRvWAU4YaUYWt 9WWLJmzozGmi1DIGdyWDKOEMYCLN02f1ZihZ5kDNasWY4kewOJP5fs+1ZOvtHSYfsrYuqXElp zDV+QDnZlQD+IX5PNnG3G9uPI9C7T374cSKH06NMR/D2Bkw9LZp7ldgKkwVo/A1NajSbvS2t7 GAFaiTD0uDjm1ecxiPdC7I6mnzcCxHw01f0L846HIOaHNezMrNKFJlZW23wbbM9oEv0qUMolc IA3nCUfpjfYBVG1xiOo2MuKXCGUQMnq0uBDziwb+tW6YMUu7OyUECbtAlI/rndYa51xZtTGI3 KaG47ebrkiSzb3V62zcNiwiR78/DDgSfe/MqDFl0CivrjmMaWVx5wcNXBw7nL24EiiPolJuYJ HM9NtvpzZMMD28ZoJT6QrpD53nQri3wLaZvPoh3J2fabXvEJdP61chYyDk9UWxwnL2719fzR0 sVaJc+2uLXQ2MltcPVKT6W8Lpb0pIf99m0vj/ZjzV6vMI4pNwJMwirM8+o+AKiBgmXD2i9Y+E e3JbJnAreV5ph+51Zeq7wJXNYo0yOvRfdb+gOWJ0WGeCHjHU1aCQk5usEaApi33qocJenMz0f zyCPkWD4ZJzVgOiOLh9v62jkQ3Hw28fnLlN3gAbuDdOeaeGkYmNG2jQc6Y6jVK01Ptv1hVpaU /W58u+3RFYi2wzC9+1D8xpH2ZLhrjkdIK1YrdkaVhPPdC9RLIUdvPM7C9f3J1GLfbe/Gcgtan tQtlZ/Y3rT/knSOmKGT5b1sYiq8mfnnMMqLMkxX8Vxbxzp7+mGh7Kvfee3VTKBnd3D1aRUnwm SkI/1QRS75BfphEc73A//kcr2cbvqsX1ygCIc6EUR9n4cx9UA++oqBN2U3OAzq6UxiQbdzyCT lOxWeNYW8jD7m1RsBb1Vp1E5gnVlIUzyiaTHH74dmEalSb392F4fZWPdYIhnEsSfMrqCsEtK6 3rnvM2tGl4AHzq8XJo8K5w59ZGDhjIysiA2kgT0jXtn9vHVRXgFULojoMrtQx0Ah7ZfW+E3nq cli0zhkK+p8gmKLuKzZm1mTD0ntgsRmZeqIo/IwUDNd87hbqZwBjiuEiOON/sVcw7sxiZLHFA 3mvRIU+HwEu9EHLn8dTepXa2SlpVPmqMpIOb9JQ== 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.3 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 --- v4: Use memmove() instead of a loop for copying Set efi_current_var in efi_var_mem_compare() to speed up finding variables. --- include/efi_variable.h | 54 +++++++ lib/efi_loader/Makefile | 1 + lib/efi_loader/efi_var_mem.c | 266 +++++++++++++++++++++++++++++++++++ 3 files changed, 321 insertions(+) create mode 100644 lib/efi_loader/efi_var_mem.c -- 2.27.0 diff --git a/include/efi_variable.h b/include/efi_variable.h index 01054209c4..bc5985cfdb 100644 --- a/include/efi_variable.h +++ b/include/efi_variable.h @@ -141,4 +141,58 @@ efi_status_t efi_var_to_file(void); */ efi_status_t efi_var_from_file(void); +/** + * efi_var_mem_init() - set-up variable list + * + * Return: status code + */ +efi_status_t efi_var_mem_init(void); + +/** + * 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_var_mem_find(const efi_guid_t *guid, const u16 *name, + struct efi_var_entry **next); + +/** + * efi_var_mem_del() - delete a variable from the list of variables + * + * @var: variable to delete + */ +void efi_var_mem_del(struct efi_var_entry *var); + +/** + * 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. + * + * @variable_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 + * @time: time of authentication (as seconds since start of epoch) + * Result: status code + */ +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, + const u64 time); + +/** + * efi_var_mem_free() - determine free memory for variables + * + * Return: maximum data size plus variable name size + */ +u64 efi_var_mem_free(void); + #endif diff --git a/lib/efi_loader/Makefile b/lib/efi_loader/Makefile index c87b82db32..f81ec8d277 100644 --- a/lib/efi_loader/Makefile +++ b/lib/efi_loader/Makefile @@ -36,6 +36,7 @@ obj-y += efi_runtime.o obj-y += efi_setup.o obj-$(CONFIG_EFI_UNICODE_COLLATION_PROTOCOL2) += efi_unicode_collation.o obj-y += efi_var_common.o +obj-y += efi_var_mem.o ifeq ($(CONFIG_EFI_MM_COMM_TEE),y) obj-y += efi_variable_tee.o else diff --git a/lib/efi_loader/efi_var_mem.c b/lib/efi_loader/efi_var_mem.c new file mode 100644 index 0000000000..7a2dba7dc2 --- /dev/null +++ b/lib/efi_loader/efi_var_mem.c @@ -0,0 +1,266 @@ +// 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; + +/** + * 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); + + if (match) + efi_current_var = var; + + return match; +} + +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; +} + +void __efi_runtime efi_var_mem_del(struct efi_var_entry *var) +{ + u16 *data; + struct efi_var_entry *next, *last; + + 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; + + memmove(var, next, (uintptr_t)last - (uintptr_t)next); + efi_var_buf->crc32 = crc32(0, (u8 *)efi_var_buf->var, + efi_var_buf->length - + sizeof(struct efi_var_file)); +} + +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, + const u64 time) +{ + 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; + var->time = time; + + efi_memcpy_runtime(&var->guid, vendor, sizeof(efi_guid_t)); + efi_memcpy_runtime(var->name, variable_name, + sizeof(u16) * var_name_len); + efi_memcpy_runtime(data, data1, size1); + efi_memcpy_runtime((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; +} + +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) +{ + EFI_ENTRY("%p, %p", event, context); + + /* Delete boot service only variables */ + efi_var_mem_bs_del(); + + EFI_EXIT(EFI_SUCCESS); +} + +/** + * 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_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 Sat Jul 11 22:05:42 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 1327434 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=gd5yoY9U; 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 4B43ws5JTdz9s1x for ; Sun, 12 Jul 2020 08:09:33 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id CA09882294; Sun, 12 Jul 2020 00:07:33 +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="gd5yoY9U"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 3468382185; Sun, 12 Jul 2020 00:06:46 +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.15.19]) (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 AECDC8217D for ; Sun, 12 Jul 2020 00:06:08 +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=1594505167; bh=zD0u/8MDohuf3wJmSeisbHMzjhGPtvBnj1+5OQ2sc9w=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=gd5yoY9U1OgJCc005c4wyXNL2X87/5Q86qA3gcd7w5BJPKUj/V+ki02Evczaov2vB zFZ39ciN7IEIEvZxF1rgLjF4SZS1vVYya+78L/YSVE7v6XCynh22u5WptHU4cFyzT7 5tQocDMds598bsVlSbp6KCaTmbinRPTjpey05O6o= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from LT02.fritz.box ([88.152.145.75]) by mail.gmx.com (mrgmx005 [212.227.17.184]) with ESMTPSA (Nemesis) id 1MIdeR-1k8thq27sL-00EdCG; Sun, 12 Jul 2020 00:06:07 +0200 From: Heinrich Schuchardt To: Alexander Graf Cc: Ilias Apalodimas , u-boot@lists.denx.de, AKASHI Takahiro , Heinrich Schuchardt Subject: [PATCH v4 15/17] efi_loader: use memory based variable storage Date: Sun, 12 Jul 2020 00:05:42 +0200 Message-Id: <20200711220544.120976-16-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200711220544.120976-1-xypron.glpk@gmx.de> References: <20200711220544.120976-1-xypron.glpk@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:3Eig+Bh8RUFBN95gOTNS72TdCXQSlZZZ6MxxduB3u2D1ZXuHv7v XD3X82wy0qqZ9oha9ROx3oLR6N22mNnO1Zshf5UzdEB9rkfpm+fp7h2rmIUDr5oqz812BqQ rjKK2XNEQK8miks3y/mww2QVpLkOWIPyOvVbXQVmhbC9YeqsWql4azeqETv5efmZynAYwQX lYgmzQaGO1T0R2I5rSx/A== X-UI-Out-Filterresults: notjunk:1;V03:K0:v2Y8dyxOTA8=:bt6jIce2IDB8rwjqR4rWZF qRu1BUCQ7KduPRU4/+hf5+2TfF64YnPcLhsFabOz7cAAf6IGQTq8lMYVqPdU+OZKOOLu56Qwg qDwdF1zVrz4cZuA1/woVxjj1Tv3i1BhBt6XhtNki/nFEAQfI7MnkIkVdyHB1/F7e3rYctDhro fHN7PbHEgr8FpAsN1s2ypXknzQJsnVNg5RRqJZnF0SPnw79llj1i943Ba4MwB7LZrUuq6VJW0 YgeRY3WSgVwLsS6aRg8lybm+UOFI7Bq7kCy1ukXN9tl886EEbsSACzJVA9cr8fvN962/W7k8t 8/0MpHnUmFVQgx8R03wrJp/Ju2fP1h2d0+o83OkNHUm33WX6Pur5UNScQvuRZ6hhZuyhW9oKA koOFhsPSKTB/rzjv3yKlb3op2Bh8lD5AUPpmqBIy35B8+s55NMIjm26ONejxTwhk9a+MUJoiX 6Htpk3IcvnDCQhGUr6JuwpMOZHNxQoBgEQ2lwBes/H+Iyz6WBItNl23CKKxgfUkKQPEcaX/Uw claXIzJEFzT/irWuGfthu0u3wJsehU41ci4xueXCMUH9ljzH7BNjmbPiaY2jiwfZeq7fzOkk9 wVLn2lG/IPE6/ilSmOgmIDzBc4leeBE3BKwwGwRPhKPLrGK56+jQbzAYNp/9MspU/EJtVc0gV 48DRJKmzouHIeMs4UZknQ0SGnsrB+B0OwjDzp6w2ROHtE5gxLfB4wsJIp1bhp1LrNqRyIJgkm 5GQQw5aXhip9NJkwWic1LCyTQiXVF+D8Qwa1UsAN3elHN6bcmRJf8jGlyYbuRdVNXnmQyf2LS +r8eSevbcwg0chkv3QLsckDZLpOKklYjL2JsOGYnUhLz7Grov+eTA+YjVozzajpu51Rx7Y3f5 fB3DOrkWgRxqfyP25fm5xFwSp1OxvS4ynZEu3Q3NRgLR4RbBYcVgUWaURLc1SpsZaRhL9HpTA 6wA51VO9pcKKJe52MA1RdAX8fcYd/DW4uqKDqBumOCF4pdGopZ4Sgf65WipPoN3NuWdAvdGqg kj/+JK896PQvNf9TSZ9yIA5h74HBoEpdYPAMQzfQujjv/gxAlEwudRpdxbUYgTyokyGdEFOht lZ1FKDZv5hLXUKTjqyo+CDGCosV18TfFJ9bY4QGFgqz1i7ECE9t3no+OwKK8hws7pIZiaNSEw 1Td32/vhCZRijzIzdzYVHronomOxGkGyyrJRvvCXhOhcK++A3ZFnT0VEQDbsi5WrPgyuOuNZl SSIqyXhVOdRP8pOIqFz64VuWU3In7lmbT2L6SAw== 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.3 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 --- v4: correct appending of variables --- lib/efi_loader/efi_variable.c | 562 ++++++---------------------------- 1 file changed, 94 insertions(+), 468 deletions(-) -- 2.27.0 diff --git a/lib/efi_loader/efi_variable.c b/lib/efi_loader/efi_variable.c index 8ed4b0830b..bbdc071126 100644 --- a/lib/efi_loader/efi_variable.c +++ b/lib/efi_loader/efi_variable.c @@ -30,145 +30,6 @@ static bool efi_secure_boot; static enum efi_secure_mode efi_secure_mode; static u8 efi_vendor_keys; -/* - * 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 - * @timep: pointer to time attribute - * Return: pointer to remainder of U-Boot variable value - */ -static const char *parse_attr(const char *str, u32 *attrp, u64 *timep) -{ - 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 |= EFI_VARIABLE_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 if ((s = prefix(str, "time="))) { - attr |= EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS; - hex2bin((u8 *)timep, s, sizeof(*timep)); - s += sizeof(*timep) * 2; - } else if (*str == '}') { - break; - } else { - printf("invalid attribute: %s\n", str); - break; - } - - str = s; - sep = ','; - } - - str++; - - *attrp = attr; - - return str; -} - /** * efi_set_secure_state - modify secure boot state variables * @secure_boot: value of SecureBoot @@ -568,296 +429,115 @@ static efi_status_t efi_variable_authenticate(u16 *variable, } #endif /* CONFIG_EFI_SECURE_BOOT */ -efi_status_t efi_get_variable_int(u16 *variable_name, const efi_guid_t *vendor, - u32 *attributes, efi_uintn_t *data_size, - void *data, u64 *timep) +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, + u64 *timep) { - char *native_name; - efi_status_t ret; - unsigned long in_size; - const char *val = NULL, *s; - u64 time = 0; - 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, &time); - - if (timep) - *timep = time; - - 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) { - EFI_PRINT("Variable with no data shouldn't exist.\n"); - 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) { - EFI_PRINT("Variable with no data shouldn't exist.\n"); - 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; - - 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; - u64 time; - 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; + *attributes = var->attr; + if (timep) + *timep = var->time; - 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; - - /* guid */ - c = *(name - 1); - *(name - 1) = '\0'; /* guid need be null-terminated here */ - if (uuid_str_to_bin(guid, (unsigned char *)vendor, - UUID_STR_FORMAT_GUID)) - /* The only error would be EINVAL. */ + if (!data) return EFI_INVALID_PARAMETER; - *(name - 1) = c; - /* attributes */ - parse_attr(end, attributes, &time); + for (pdata = var->name; *pdata; ++pdata) + ; + ++pdata; + + efi_memcpy_runtime(data, pdata, var->length); return EFI_SUCCESS; } -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; + efi_var_mem_find(vendor, variable_name, &var); - /* search for the last-returned variable */ - ret = efi_to_native(&native_name, variable_name, vendor); - if (ret) - return ret; + if (!var) + return EFI_NOT_FOUND; - name_len = strlen(native_name); - for (variable = efi_variables_list; variable && *variable;) { - if (!strncmp(variable, native_name, name_len) && - variable[name_len] == '=') - break; + for (pdata = var->name; *pdata; ++pdata) + ; + ++pdata; - variable = strchr(variable, '\n'); - if (variable) - variable++; - } - - free(native_name); - if (!(variable && *variable)) - return EFI_INVALID_PARAMETER; + old_size = *variable_name_size; + *variable_name_size = (uintptr_t)pdata - (uintptr_t)var->name; - /* 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); - - if (list_len <= 1) - return EFI_NOT_FOUND; - - 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_memcpy_runtime(variable_name, var->name, *variable_name_size); + efi_memcpy_runtime(vendor, &var->guid, sizeof(efi_guid_t)); - return ret; + return EFI_SUCCESS; } 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, bool ro_check) { - char *native_name = NULL, *old_data = NULL, *val = NULL, *s; - efi_uintn_t old_size; + struct efi_var_entry *var; + efi_uintn_t ret; bool append, delete; u64 time = 0; - u32 old_attr; - efi_status_t ret = EFI_SUCCESS; if (!variable_name || !*variable_name || !vendor || ((attributes & EFI_VARIABLE_RUNTIME_ACCESS) && - !(attributes & EFI_VARIABLE_BOOTSERVICE_ACCESS))) { - ret = EFI_INVALID_PARAMETER; - goto err; - } - - ret = efi_to_native(&native_name, variable_name, vendor); - if (ret) - goto err; + !(attributes & EFI_VARIABLE_BOOTSERVICE_ACCESS))) + return EFI_INVALID_PARAMETER; /* check if a variable exists */ - old_size = 0; - old_attr = 0; - ret = efi_get_variable_int(variable_name, vendor, &old_attr, - &old_size, NULL, &time); + var = efi_var_mem_find(vendor, variable_name, NULL); append = !!(attributes & EFI_VARIABLE_APPEND_WRITE); attributes &= ~(u32)EFI_VARIABLE_APPEND_WRITE; delete = !append && (!data_size || !attributes); /* check attributes */ - if (old_size) { - if (ro_check && (old_attr & EFI_VARIABLE_READ_ONLY)) { - ret = EFI_WRITE_PROTECTED; - goto err; - } + if (var) { + if (ro_check && (var->attr & EFI_VARIABLE_READ_ONLY)) + return EFI_WRITE_PROTECTED; /* attributes won't be changed */ if (!delete && - ((ro_check && old_attr != attributes) || - (!ro_check && ((old_attr & ~(u32)EFI_VARIABLE_READ_ONLY) + ((ro_check && var->attr != attributes) || + (!ro_check && ((var->attr & ~(u32)EFI_VARIABLE_READ_ONLY) != (attributes & ~(u32)EFI_VARIABLE_READ_ONLY))))) { - ret = EFI_INVALID_PARAMETER; - goto err; + return EFI_INVALID_PARAMETER; } + time = var->time; } else { - if (delete || append) { + if (delete || append) /* * Trying to delete or to update a non-existent * variable. */ - ret = EFI_NOT_FOUND; - goto err; - } + return EFI_NOT_FOUND; } if (((!u16_strcmp(variable_name, L"PK") || @@ -869,27 +549,26 @@ efi_status_t efi_set_variable_int(u16 *variable_name, const efi_guid_t *vendor, /* authentication is mandatory */ if (!(attributes & EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS)) { - EFI_PRINT("%ls: AUTHENTICATED_WRITE_ACCESS required\n", + EFI_PRINT("%ls: TIME_BASED_AUTHENTICATED_WRITE_ACCESS required\n", variable_name); - ret = EFI_INVALID_PARAMETER; - goto err; + return EFI_INVALID_PARAMETER; } } /* authenticate a variable */ if (IS_ENABLED(CONFIG_EFI_SECURE_BOOT)) { - if (attributes & EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS) { - ret = EFI_INVALID_PARAMETER; - goto err; - } + if (attributes & EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS) + return EFI_INVALID_PARAMETER; if (attributes & EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) { + u32 env_attr; + ret = efi_variable_authenticate(variable_name, vendor, &data_size, &data, - attributes, &old_attr, + attributes, &env_attr, &time); if (ret != EFI_SUCCESS) - goto err; + return ret; /* last chance to check for delete */ if (!data_size) @@ -900,105 +579,42 @@ efi_status_t efi_set_variable_int(u16 *variable_name, const efi_guid_t *vendor, (EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS)) { EFI_PRINT("Secure boot is not configured\n"); - ret = EFI_INVALID_PARAMETER; - goto err; + return EFI_INVALID_PARAMETER; } } - /* delete a variable */ if (delete) { - /* !old_size case has been handled before */ - val = NULL; + /* EFI_NOT_FOUND has been handled before */ ret = EFI_SUCCESS; - goto out; - } - - if (append) { - old_data = malloc(old_size); - if (!old_data) { - ret = EFI_OUT_OF_RESOURCES; - goto err; - } - ret = efi_get_variable_int(variable_name, vendor, - &old_attr, &old_size, old_data, NULL); - if (ret != EFI_SUCCESS) - goto err; + } else if (append) { + u16 *old_data = var->name; + + for (; *old_data; ++old_data) + ; + ++old_data; + ret = efi_var_mem_ins(variable_name, vendor, attributes, + var->length, old_data, data_size, data, + time); } else { - old_size = 0; - } - - val = malloc(2 * old_size + 2 * data_size - + strlen("{ro,run,boot,nv,time=0123456701234567}(blob)") - + 1); - if (!val) { - ret = EFI_OUT_OF_RESOURCES; - goto err; - } - - s = val; - - /* - * store attributes - */ - attributes &= (EFI_VARIABLE_READ_ONLY | - EFI_VARIABLE_NON_VOLATILE | - EFI_VARIABLE_BOOTSERVICE_ACCESS | - EFI_VARIABLE_RUNTIME_ACCESS | - EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS); - s += sprintf(s, "{"); - for (u32 attr_rem = attributes; attr_rem;) { - u32 attr = 1 << (ffs(attr_rem) - 1); - - if (attr == EFI_VARIABLE_READ_ONLY) { - s += sprintf(s, "ro"); - } else 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"); - } else if (attr == - EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) { - s += sprintf(s, "time="); - s = bin2hex(s, (u8 *)&time, sizeof(time)); - } - - attr_rem &= ~attr; - if (attr_rem) - s += sprintf(s, ","); + ret = efi_var_mem_ins(variable_name, vendor, attributes, + data_size, data, 0, NULL, time); } - s += sprintf(s, "}"); - s += sprintf(s, "(blob)"); - - /* store payload: */ - if (append) - s = bin2hex(s, old_data, old_size); - s = bin2hex(s, data, data_size); - *s = '\0'; + efi_var_mem_del(var); - EFI_PRINT("setting: %s=%s\n", native_name, val); + if (ret != EFI_SUCCESS) + return ret; -out: - if (env_set(native_name, val)) { - ret = EFI_DEVICE_ERROR; - } else { - if (!u16_strcmp(variable_name, L"PK")) - ret = efi_init_secure_state(); - else - ret = EFI_SUCCESS; - } + if (!u16_strcmp(variable_name, L"PK")) + ret = efi_init_secure_state(); + else + ret = EFI_SUCCESS; /* 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(); -err: - free(native_name); - free(old_data); - free(val); - - return ret; + return EFI_SUCCESS; } efi_status_t efi_query_variable_info_int(u32 attributes, @@ -1006,7 +622,13 @@ efi_status_t efi_query_variable_info_int(u32 attributes, u64 *remaining_variable_storage_size, u64 *maximum_variable_size) { - return EFI_UNSUPPORTED; + *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_SUCCESS; } /** @@ -1107,6 +729,10 @@ efi_status_t efi_init_variables(void) { efi_status_t ret; + ret = efi_var_mem_init(); + if (ret != EFI_SUCCESS) + return ret; + ret = efi_init_secure_state(); if (ret != EFI_SUCCESS) return ret; From patchwork Sat Jul 11 22:05:43 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 1327432 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=RUj7G6cz; 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 4B43wT6Zgpz9s1x for ; Sun, 12 Jul 2020 08:09:13 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 5D3FC82275; Sun, 12 Jul 2020 00:07:27 +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="RUj7G6cz"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 7878B821CB; Sun, 12 Jul 2020 00:06:37 +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.15.19]) (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 0CC8482183 for ; Sun, 12 Jul 2020 00:06:09 +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=1594505168; bh=Vti6eo07GVpzo7KEhHUqa+qsG8jhZCqhbLraqcr6Qm0=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=RUj7G6czZCbX27jxr98tCzk5HiZftIK3nfyL3P2iV1jSJpGfXRdSSoOVjL9fOWg6/ Qu6YibWqCCVoBEDR2IkoZTJXMWlI6tC8YtcZ78IqVaEScLWi4zUUeR6/A2+A7P8SxH a2BtAFXKt020P+5h4f8JD6rJuKcawl/J3UxLb7xU= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from LT02.fritz.box ([88.152.145.75]) by mail.gmx.com (mrgmx005 [212.227.17.184]) with ESMTPSA (Nemesis) id 1MGhyS-1k6yZ33OWg-00DniV; Sun, 12 Jul 2020 00:06:07 +0200 From: Heinrich Schuchardt To: Alexander Graf Cc: Ilias Apalodimas , u-boot@lists.denx.de, AKASHI Takahiro , Heinrich Schuchardt Subject: [PATCH v4 16/17] efi_loader: enable UEFI variables at runtime Date: Sun, 12 Jul 2020 00:05:43 +0200 Message-Id: <20200711220544.120976-17-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200711220544.120976-1-xypron.glpk@gmx.de> References: <20200711220544.120976-1-xypron.glpk@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:LYVE2eTStT8SX8sBEtiOGLQgP6KvzG4q5Rbg7Ljcr/P/hb+INaq 7S0/+VNIzabzyvAQOoph+/TWK4CeCegX12ljwB6uiBH6Ap7U4LlPYbsFDDOGox8xk+SYlP2 AI8Qa48Mn56k/LvJyRXmPysjV+axIFtZCYyWh1HcJVaQRNboIHNeAw71CEte1EMzsWE/ule njCwCt2Yqr5hZT4oFXqBg== X-UI-Out-Filterresults: notjunk:1;V03:K0:FS4hIusReOg=:oYxJELppfGGpLx/fpaZSVe E4v6bpyBLq78anWMswRiaiQsFFiH12ncq4Y3eByGO1AvA3XD6E1bKbJ104CJBcOWYJN7slZ25 l1R+/vtCd0n2LsRzBr4ac6f0PpV7n1ABnibvgnx2ZVJ3pcGTHdUnr56bA32iaJbhkekkgrx7z dzCwt3CxQme+qWv/5gjwAZdZzc1cdq8LaP71khl77h5jok/dtJgV0rlR8T0+31t3j5nyq3Dg7 QdCBwLHSM8tRfXU1r4OJxbNlWGudD7wJGiD5Wk69whcor8SDDu1VnfjZgHyMHiRgq2KQugFq/ V7bvhGXQxuPaxY3sKm/Twd9Pu9Gc9WkyM9flKFxZ2FMZPVGv0T+yW4TfdMjrdEcPtumWtdyR3 g58kvpZEKl4rDCIRd7Uer8I5SEvbBHibSHgjeRLfqxeFYB/Wzh5nG9mVU9VxFl0Izg5ZLht+6 tpEcVNTxecuczH0fjJKhQPTB+cpmWRWV31vHaeH02Bch1253v/An7DnB4e1SHBsuNCYKdERhY Ws4qhrUY4cY0pxEQl2KZaOK1GLR9yGuiZfUJ3bgxU3wPkZWIEpMW1+M80+Y4iJ7C0xdWAY1w6 0rwHmDLoqVGJcM8NW8tlmiO2kB5Kt65PNOao3sNT7Jw35R9uxZ1S+6gOPWT0THdlqi1InyYlJ p/i/dlSe01yUOAyfp/WxP86xvyHmY4oKG38OpOXMXlBZerVaJRkqA639eEe7TqjHDpmLy1kqY TsLCCCvL0fNtYB2rz7p7TKoboMtmlm3FvmerLvcGnByGMDIQ0Esb0pg/W53E3DBq8y/BayWYl jTF+52I5uk2Yzu2gtzSipSBV9zyzGbnaBP904Do1Ki2lVYatCqeeDbw/cBwOS+iCqVPPKvX0+ 3xoKsnVU7K4hqzhnBo+b0XPe2b2W/ALfxu0Q+K0X8WZQSfrXpkOlxpFN5jrqniqgJWAUXgA1c 0+8AChCfISSJdR0GlLBS6iU6UaSMLtB0j9mrWoNbITNZiuGJmZqFcXE73U9EHNdNuMCOG+cke vtBhoS5Em7EmybRyKdUspA0pX2WwD+G52LxW1BAgjFH+hs1O5tAnJYIJukis9irtvrIlX+l42 qKsdyg3eIPnRGnCn9Hu9QuGDPVa3n8WuTIzoZRSuwhpICUiIGHXRonOfm/01/U/zhrarDtNDa 02mp+20MByTNCoLI5A+IBZwS1F2Po/m2mgQZScDpYgLigN7/A+hxV9HJ+D5/rkqhTnhRiFCab TQfJtS8uZwXwSPqQKRh0YGaut0FG8ffmqlQcmvg== 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.3 at phobos.denx.de X-Virus-Status: Clean Enable UEFI variables at runtime. Signed-off-by: Heinrich Schuchardt --- lib/efi_loader/efi_runtime.c | 2 ++ lib/efi_loader/efi_var_file.c | 6 +++--- lib/efi_loader/efi_variable.c | 14 ++++++++++++-- 3 files changed, 17 insertions(+), 5 deletions(-) -- 2.27.0 diff --git a/lib/efi_loader/efi_runtime.c b/lib/efi_loader/efi_runtime.c index 5b6506fbdc..91a4551448 100644 --- a/lib/efi_loader/efi_runtime.c +++ b/lib/efi_loader/efi_runtime.c @@ -121,6 +121,8 @@ 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_VIRTUAL_ADDRESS_MAP | EFI_RT_SUPPORTED_CONVERT_POINTER; diff --git a/lib/efi_loader/efi_var_file.c b/lib/efi_loader/efi_var_file.c index b1b7532495..880c279aef 100644 --- a/lib/efi_loader/efi_var_file.c +++ b/lib/efi_loader/efi_var_file.c @@ -183,9 +183,9 @@ static efi_status_t __maybe_unused efi_var_restore(struct efi_var_file *buf) 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, true); + ret = efi_var_mem_ins(var->name, &var->guid, var->attr, + var->length, data, 0, NULL, + var->time); if (ret != EFI_SUCCESS) log_err("Failed to set EFI variable %ls\n", var->name); diff --git a/lib/efi_loader/efi_variable.c b/lib/efi_loader/efi_variable.c index bbdc071126..eab5f005da 100644 --- a/lib/efi_loader/efi_variable.c +++ b/lib/efi_loader/efi_variable.c @@ -668,7 +668,16 @@ 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; + efi_status_t ret; + + ret = efi_get_variable_int(variable_name, vendor, attributes, + data_size, data, NULL); + + /* Remove EFI_VARIABLE_READ_ONLY flag */ + if (attributes) + *attributes &= EFI_VARIABLE_MASK; + + return ret; } /** @@ -684,7 +693,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); } /** From patchwork Sat Jul 11 22:05:44 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 1327433 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=dP8SWioK; 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 4B43wg5mBVz9s1x for ; Sun, 12 Jul 2020 08:09:23 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 5E30C82286; Sun, 12 Jul 2020 00:07:30 +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="dP8SWioK"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id CA3A082183; Sun, 12 Jul 2020 00:06:37 +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.15.19]) (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 39E5082193 for ; Sun, 12 Jul 2020 00:06:09 +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=1594505168; bh=gDTRAW0QQGpMN9z2Hr1jR/FRtbhJgHxq/Lepel6wRHg=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=dP8SWioK2i2+4pozuqX2IZ7qLvAnTgkh94iQkx9eKMeO3Yk5Z24fQ9DHmAnAxtk/D vrQezIKpYnf0yyU0BmvQIDQdafGCwc3kyJhXLnfE0wi1BSzMcD8UnE/zpCFwzqZUWZ WZioriDCTENUsoD4dHZcT5hxd+1H/KZGkh4l3l40= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from LT02.fritz.box ([88.152.145.75]) by mail.gmx.com (mrgmx005 [212.227.17.184]) with ESMTPSA (Nemesis) id 1M2f5Z-1jt0SV0NqR-0048XW; Sun, 12 Jul 2020 00:06:08 +0200 From: Heinrich Schuchardt To: Alexander Graf Cc: Ilias Apalodimas , u-boot@lists.denx.de, AKASHI Takahiro , Heinrich Schuchardt Subject: [PATCH v4 17/17] efi_selftest: adjust runtime test for variables Date: Sun, 12 Jul 2020 00:05:44 +0200 Message-Id: <20200711220544.120976-18-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200711220544.120976-1-xypron.glpk@gmx.de> References: <20200711220544.120976-1-xypron.glpk@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:K5K51YKhlJwirkHCBhtaUewzqopfmq3bZSndbBGixv90M5KvXpS 7Wh8Vlv251UVSCvkdF7a92WJU3jTDVtD2C9FrE9gdZ9JjRJDI19yahCyJ74SVxFSl55vwNe 71JsvAbkX/3EuoGrPQotMBQAx8T5JqToMt7AMnXPCqVTs5PcxAZazcntnO7wADcAtmzVChT ZAm9j4wL3NarKDL2NGMIg== X-UI-Out-Filterresults: notjunk:1;V03:K0:dtU03Be1eIg=:jC01Ng8VrjhcPBA9FauPQ0 YmfaL540Cm7XEWHoAxZUc4p9Pnkkdru1UvcGaLzcoQcRERwn33F823GQ6f8HHtfaDyJvAtxT5 kWnTlQxvx47U7i2rdsqtXMNQh6gmPxwg7pyQAnbBTnVGdUeGrVtSXcp9gv8JJOmqAtyK6BPqE 5C+jCta/BC87olUbixe9ryRqhDBpkwZdKY0Xk4eSibMOSPSyIW8Bf320X5FAxYdJfADWi+48q DlPTmDEK4k3FXGRqpBcpEw9hBgZOr2w1yfRhPziVUqnuKH5xv9hf281jxZjUx7uOdyF+awtm7 XvGy7KmiUoCyymHZzYcELIK7qOPuEUZU/vnsIlfFrL85k4+solgHRDRpaciji4jP+4igHLABy Uv0WcdjNQXf/vs00USG8D6ZUY3GLnKgpzcdjNvXU8K+BxEUOdZQg0CM+sXSpKNbbPEB0HbuDV pNn99L67jeOL/2oxbiSDoRoNPLwFh4xIS5CyCGLGq25XCEKqbdQSz+DC+aP1J55fcAuxOmufC VdB8eeP3Vq7TWHlfEQbJ3ZxvIzBSB0ZAk5xpgFdFez5mSFMB7Wtvb5UGuugBEJtEJyhtlT6hV gMnqO4N2khHb03e2bmDAY98J53sWF9K9tTqw87dXlBBMJkAikL7brZNusNZKJOB+JZDAr7IB1 X7G0LIw2iKMcfz16r/OAJKVlcMFkChWYkmV4gOO9qDjKWrU61b1HqFpkekNYVoWQyds8wv6BI F5eemY3iGzpaDUbP5Un/j0rrMHrqQw8FPy4ZKX8kKFRUklc9NTgFqLFpnV9OtKumfQR2IrEqv 04QpiXREf63y3pff966lbVWgMjUUPZI3CTq+7E7q++lSbSSPyXn/MnkjDZ/m26nP+GdOW6nAS rUqV/py8tvjArXYAJNhEDtVuEugkTyHy3zivjBQvVw93B1TIxGBwh/BeCSFHVlrCaW2Que6xz WYkDdK+Eu2/5otJLnXVIOzWwjztaisd3aPz5h8MlFS4JMrLSImGLzfNY3d95326w96DUEZcyG UIk07Y64/01akf9TKEafuW1450pUnF0LAnAwrfiAQOdtDOCKpfTZKtncNHesv76qx6nHPfspF VOwwEnfiqZBd1fZsL8saRIbPzZbsFDJ+2Rh8kl/IynCpeZd+W/SiGqyxZpsPOtmneY9M3QYGr aI10P/ivs1t+eDAKOD78My9nKM9bNGbgxle/jtEvfdXS0Yd4/gkzAOMnjJVP0BYIMaNm2uuhZ g5EM4IRq3qwVj0zj5nIfFHgukh7Ars3LJ6FOFHg== 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.3 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. Signed-off-by: Heinrich Schuchardt --- lib/efi_selftest/efi_selftest_variables_runtime.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) -- 2.27.0 diff --git a/lib/efi_selftest/efi_selftest_variables_runtime.c b/lib/efi_selftest/efi_selftest_variables_runtime.c index b3b40ad2cf..3226069c0b 100644 --- a/lib/efi_selftest/efi_selftest_variables_runtime.c +++ b/lib/efi_selftest/efi_selftest_variables_runtime.c @@ -16,9 +16,7 @@ static struct efi_boot_services *boottime; static struct efi_runtime_services *runtime; -static const efi_guid_t guid_vendor0 = - EFI_GUID(0x67029eb5, 0x0af2, 0xf6b1, - 0xda, 0x53, 0xfc, 0xb5, 0x66, 0xdd, 0x1c, 0xe6); +static const efi_guid_t guid_vendor0 = EFI_GLOBAL_VARIABLE_GUID; /* * Setup unit test. @@ -68,17 +66,18 @@ static int execute(void) efi_st_error("SetVariable failed\n"); return EFI_ST_FAILURE; } - len = 3; - ret = runtime->get_variable(L"efi_st_var0", &guid_vendor0, + len = EFI_ST_MAX_DATA_SIZE; + ret = runtime->get_variable(L"PlatformLangCodes", &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 = 2 * EFI_ST_MAX_VARNAME_SIZE; 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; }