From patchwork Fri Sep 6 06:09:52 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: AKASHI Takahiro X-Patchwork-Id: 1158770 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=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="UgnsMGvz"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 46PnCs3mxDz9s3Z for ; Fri, 6 Sep 2019 16:07:53 +1000 (AEST) Received: by lists.denx.de (Postfix, from userid 105) id 2C719C21DFA; Fri, 6 Sep 2019 06:07:19 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id 2699FC21E2C; Fri, 6 Sep 2019 06:07:17 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id A0630C21E52; Fri, 6 Sep 2019 06:07:09 +0000 (UTC) Received: from mail-pf1-f193.google.com (mail-pf1-f193.google.com [209.85.210.193]) by lists.denx.de (Postfix) with ESMTPS id DEA19C21E18 for ; Fri, 6 Sep 2019 06:07:06 +0000 (UTC) Received: by mail-pf1-f193.google.com with SMTP id b13so3617822pfo.8 for ; Thu, 05 Sep 2019 23:07:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=tFuooaKrph4PpeH3HFKXgSGwCMtxHq+43Xyt3og8TZQ=; b=UgnsMGvz2VDm/9qvO5aFRvPVPB1ptUJyGTUN32u2XGziGEQm8ShMXWufSvzMt+Erf+ Z/YrKtHJR1UqpvCyIEhaClb185YOeFMcm0Rho8VQBMsdrodqW1F8WtstXoedc/MfG/3Z A10kF/mPenmwWNVXR1VhKyAgxXTsFHLEma7dnu2idkb/1LQI3p7Z7l0qwJX0LBz/7m3o gTcyDnhugYFhdX5RawCin8bzUJZOPCIowW6TUGKStZJWOfdjJp5lz5NqkWglO2zyRPih 0wzjB3GRey1p1oEAncEmHEfjhISUbaWGsGW8bmjIlrB1LD4tZ+SIsCgOmOBN5m1shZFg wwRA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=tFuooaKrph4PpeH3HFKXgSGwCMtxHq+43Xyt3og8TZQ=; b=ggJE18xfQohZzlROV0GW0sRze2ebdAyzV4mbWjVodhqlzC09kBUxmGDxh0fsIISdgt Nc3sgDljq7u2cy85wYL7HcwQ9dCChy1PYolxK/GwyHJuxv/mr3XDX22Iy5/4Favj8kbC fu3NISiYaAvZ4Qg8Xzj4mBcc1lsi/podtNpS4u5an24MCQvK/pFfVa/M0VsmDGMx+FsX CH56mRsuyrgb6BYDufa839G1x++UoT5qc30OIkP4O4oivOwSPXCHmn0qTxPmSQT1myv5 s5067OYiV4Kn1vqc4gmP7gkBO2jWf0z92ImUQJLo9cWUtAR8YB6shRPS/xlBtSwAruc6 K5zQ== X-Gm-Message-State: APjAAAUwCTrvMObmia1EGlyvkbPy1YjcRU5ZQJsz2tPn+uuELBr5vSbQ 2tZDeSbyUQZRTaBxyqy9tsqHtg== X-Google-Smtp-Source: APXvYqz7zuAuXiEkqhjLkHlxhBD/vm+xij8K3pqJ1zqVRwFrTkv8ei9YeuFCUeTUinstbijQn/CMLg== X-Received: by 2002:a17:90b:909:: with SMTP id bo9mr4912573pjb.41.1567750025448; Thu, 05 Sep 2019 23:07:05 -0700 (PDT) Received: from linaro.org ([121.95.100.191]) by smtp.googlemail.com with ESMTPSA id x125sm1158077pfb.93.2019.09.05.23.07.04 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 05 Sep 2019 23:07:05 -0700 (PDT) From: AKASHI Takahiro To: xypron.glpk@gmx.de, agraf@csgraf.de Date: Fri, 6 Sep 2019 15:09:52 +0900 Message-Id: <20190906060953.31481-2-takahiro.akashi@linaro.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190906060953.31481-1-takahiro.akashi@linaro.org> References: <20190906060953.31481-1-takahiro.akashi@linaro.org> MIME-Version: 1.0 Cc: u-boot@lists.denx.de Subject: [U-Boot] [PATCH v2 1/2] efi_loader: variable: support APPEND_WRITE X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" If EFI_VARIABLE_APPEND_WRITE is specified in attributes at efi_set_variable(), specified data will be appended to the variable's original value. Attributes other than APPEND_WRITE should not be modified. With this patch, APPEND_WRITE test in 'variables' selftest will pass. Signed-off-by: AKASHI Takahiro --- lib/efi_loader/efi_variable.c | 70 ++++++++++++++++++++++------------- 1 file changed, 44 insertions(+), 26 deletions(-) diff --git a/lib/efi_loader/efi_variable.c b/lib/efi_loader/efi_variable.c index 6687b69a400d..48ee255f879b 100644 --- a/lib/efi_loader/efi_variable.c +++ b/lib/efi_loader/efi_variable.c @@ -424,17 +424,17 @@ efi_status_t EFIAPI efi_set_variable(u16 *variable_name, efi_uintn_t data_size, const void *data) { char *native_name = NULL, *val = NULL, *s; + const char *old_val; + size_t old_size; efi_status_t ret = EFI_SUCCESS; u32 attr; EFI_ENTRY("\"%ls\" %pUl %x %zu %p", variable_name, vendor, attributes, data_size, data); - /* TODO: implement APPEND_WRITE */ if (!variable_name || !*variable_name || !vendor || ((attributes & EFI_VARIABLE_RUNTIME_ACCESS) && - !(attributes & EFI_VARIABLE_BOOTSERVICE_ACCESS)) || - (attributes & EFI_VARIABLE_APPEND_WRITE)) { + !(attributes & EFI_VARIABLE_BOOTSERVICE_ACCESS))) { ret = EFI_INVALID_PARAMETER; goto out; } @@ -445,35 +445,51 @@ efi_status_t EFIAPI efi_set_variable(u16 *variable_name, #define ACCESS_ATTR (EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS) - if ((data_size == 0) || !(attributes & ACCESS_ATTR)) { - /* delete the variable: */ - env_set(native_name, NULL); - ret = EFI_SUCCESS; - goto out; - } + old_val = env_get(native_name); + if (old_val) { + old_val = parse_attr(old_val, &attr); - val = env_get(native_name); - if (val) { - parse_attr(val, &attr); - - /* We should not free val */ - val = NULL; + /* check read-only first */ if (attr & READ_ONLY) { ret = EFI_WRITE_PROTECTED; goto out; } - /* - * attributes won't be changed - * TODO: take care of APPEND_WRITE once supported - */ - if (attr != attributes) { + if ((data_size == 0) || !(attributes & ACCESS_ATTR)) { + /* delete the variable: */ + env_set(native_name, NULL); + ret = EFI_SUCCESS; + goto out; + } + + /* attributes won't be changed */ + if (attr != (attributes & ~EFI_VARIABLE_APPEND_WRITE)) { ret = EFI_INVALID_PARAMETER; goto out; } + + if (attributes & EFI_VARIABLE_APPEND_WRITE) { + if (!prefix(old_val, "(blob)")) { + return EFI_DEVICE_ERROR; + goto out; + } + old_size = strlen(old_val); + } else { + old_size = 0; + } + } else { + if ((data_size == 0) || !(attributes & ACCESS_ATTR) || + (attributes & EFI_VARIABLE_APPEND_WRITE)) { + /* delete, but nothing to do */ + ret = EFI_NOT_FOUND; + goto out; + } + + old_size = 0; } - val = malloc(2 * data_size + strlen("{ro,run,boot,nv}(blob)") + 1); + val = malloc(old_size + 2 * data_size + + strlen("{ro,run,boot,nv}(blob)") + 1); if (!val) { ret = EFI_OUT_OF_RESOURCES; goto out; @@ -481,10 +497,7 @@ efi_status_t EFIAPI efi_set_variable(u16 *variable_name, s = val; - /* - * store attributes - * TODO: several attributes are not supported - */ + /* store attributes */ attributes &= (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS); @@ -505,8 +518,13 @@ efi_status_t EFIAPI efi_set_variable(u16 *variable_name, } s += sprintf(s, "}"); + if (old_size) + /* APPEND_WRITE */ + s += sprintf(s, old_val); + else + s += sprintf(s, "(blob)"); + /* store payload: */ - s += sprintf(s, "(blob)"); s = bin2hex(s, data, data_size); *s = '\0'; From patchwork Fri Sep 6 06:09:53 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: AKASHI Takahiro X-Patchwork-Id: 1158771 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=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="CsuHrfTo"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 46PnDK5Bw8z9s3Z for ; Fri, 6 Sep 2019 16:08:17 +1000 (AEST) Received: by lists.denx.de (Postfix, from userid 105) id 71F56C21E53; Fri, 6 Sep 2019 06:07:43 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id D007DC21E29; Fri, 6 Sep 2019 06:07:41 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 024EFC21E38; Fri, 6 Sep 2019 06:07:11 +0000 (UTC) Received: from mail-pl1-f193.google.com (mail-pl1-f193.google.com [209.85.214.193]) by lists.denx.de (Postfix) with ESMTPS id 628ABC21E36 for ; Fri, 6 Sep 2019 06:07:11 +0000 (UTC) Received: by mail-pl1-f193.google.com with SMTP id f19so2601538plr.3 for ; Thu, 05 Sep 2019 23:07:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=jWMgn5aX+Nl+hVI5yqHuEeXI0A9SaUwd7rVTDZOAvqs=; b=CsuHrfToRgdeRSmFKpZC6rvcI9dzIpOsKnSEGkgVTNZ7Ny2VjMqTCGbcXFr9J0Jq/d dOJ3UUboVEDYABY9hP7N/FeIxXs7SAuODSh9YI3RKVSDFMQ1mFRdrQfC6tk+57yhf1Wl CKZ90kBGTX8DWtPvZzp8/mTgH618JYVawkt3UCt8qt3MaISp4Key8xl5EZyf8xtxv0Xo SNrDmlgyC95Iio5jym5gK8Z7JatVATAT0jdzTLOWFj7or1k5fFd167HH7mxTPO/MfnR6 EnNHP2VnWvY7QNOXbwatMVzoqxeKUKHiptGgTALUnJbEZGmHH0UHFfMaVqozwtNxv5Em hV/A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=jWMgn5aX+Nl+hVI5yqHuEeXI0A9SaUwd7rVTDZOAvqs=; b=HEUnazcPMEuYioUx/ZQRsHFBCh3ux7whZ595WxYDXgkIAUhVJoqU7+v0XyRQMGb0pr 7jMhQ+MydGGYSgQ7a8ML9088HFAJgv44YbrEdVW+0c5W5r/LMmV3fOGMcjh3sqU9sug4 4SDBG/0i5wWD/TTW4ysADSZDYq4UXp4sBz3OlwYOUN2xaI+yvJzdkoXUwF07fGkoxOGS miMGNYJTyqNqea81C8Ce+O1y23MvAg/S5Ux/1Ro+ejd7TtT0xZijy0WJVqH+1YsOBfPb dPA4EeSJrzeHkIGPRkyHgIN4iBF06zvgecfi1/5YX8/FpRxutivx+udWpVKknj69jbcS 7MHg== X-Gm-Message-State: APjAAAWVawrHeHlBE5eHjuGwHYUEwkXjemA8HMhqXhE4JXi2B/LfAd2e gtuXSV1oIsqXxlqPA4HoUZ5CbQ== X-Google-Smtp-Source: APXvYqx9acYUyshx0FaL6B/kmT8Ga4VJ+6NDK5kslUDiJyW/REjPEEv3U4o1AbCPprQ+orbAnAlGHQ== X-Received: by 2002:a17:902:d888:: with SMTP id b8mr7324421plz.272.1567750029648; Thu, 05 Sep 2019 23:07:09 -0700 (PDT) Received: from linaro.org ([121.95.100.191]) by smtp.googlemail.com with ESMTPSA id d69sm4948702pfd.175.2019.09.05.23.07.09 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 05 Sep 2019 23:07:09 -0700 (PDT) From: AKASHI Takahiro To: xypron.glpk@gmx.de, agraf@csgraf.de Date: Fri, 6 Sep 2019 15:09:53 +0900 Message-Id: <20190906060953.31481-3-takahiro.akashi@linaro.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190906060953.31481-1-takahiro.akashi@linaro.org> References: <20190906060953.31481-1-takahiro.akashi@linaro.org> MIME-Version: 1.0 Cc: u-boot@lists.denx.de Subject: [U-Boot] [PATCH v2 2/2] efi_loader: selftest: enable APPEND_WRITE tests X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" Now that APPEND_WRITE is supported, the result check for the only existing test case should be changed to 'todo' to 'error', while two more test cases are added. Signed-off-by: AKASHI Takahiro --- lib/efi_selftest/efi_selftest_variables.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/efi_selftest/efi_selftest_variables.c b/lib/efi_selftest/efi_selftest_variables.c index 06c1a032dd04..a6b41d1f008d 100644 --- a/lib/efi_selftest/efi_selftest_variables.c +++ b/lib/efi_selftest/efi_selftest_variables.c @@ -21,6 +21,9 @@ static const efi_guid_t guid_vendor0 = static const efi_guid_t guid_vendor1 = EFI_GUID(0xff629290, 0x1fc1, 0xd73f, 0x8f, 0xb1, 0x32, 0xf9, 0x0c, 0xa0, 0x42, 0xea); +static const efi_guid_t guid_global = + EFI_GUID(0x8be4df61, 0x93ca, 0x11d2, + 0xaa, 0x0d, 0x00, 0xe0, 0x98, 0x03, 0x2b, 0x8c); /* * Setup unit test. @@ -116,7 +119,7 @@ static int execute(void) EFI_VARIABLE_APPEND_WRITE, 7, v + 8); if (ret != EFI_SUCCESS) { - efi_st_todo("SetVariable(APPEND_WRITE) failed\n"); + efi_st_error("SetVariable(APPEND_WRITE) failed\n"); } else { len = EFI_ST_MAX_DATA_SIZE; ret = runtime->get_variable(L"efi_st_var1", &guid_vendor1, @@ -131,6 +134,21 @@ static int execute(void) if (memcmp(data, v, len)) efi_st_todo("GetVariable returned wrong value\n"); } + /* Append variable 2 */ + ret = runtime->set_variable(L"efi_none", &guid_vendor1, + EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_APPEND_WRITE, + 15, v); + if (ret != EFI_NOT_FOUND) + efi_st_error("SetVariable(APPEND_WRITE) with size 0 to non-existent variable returns wrong code\n"); + /* Append variable 3 */ + ret = runtime->set_variable(L"PlatformLangCodes", &guid_global, + EFI_VARIABLE_BOOTSERVICE_ACCESS | + EFI_VARIABLE_RUNTIME_ACCESS | + EFI_VARIABLE_APPEND_WRITE, + 15, v); + if (ret != EFI_WRITE_PROTECTED) + efi_st_todo("SetVariable(APPEND_WRITE) to read-only variable returns wrong code\n"); /* Enumerate variables */ boottime->set_mem(&guid, 16, 0); *varname = 0;