From patchwork Thu Jan 3 18:28:20 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ard Biesheuvel X-Patchwork-Id: 154737 Delivered-To: patch@linaro.org Received: by 2002:a2e:299d:0:0:0:0:0 with SMTP id p29-v6csp950299ljp; Thu, 3 Jan 2019 10:28:58 -0800 (PST) X-Google-Smtp-Source: ALg8bN7sHrJUgi4Fup9dcoDLpMG5IzdBB25F5evd98sTt928LifJafGmhojom4RnYH7vSwO1UVWy X-Received: by 2002:a17:902:6f09:: with SMTP id w9mr49136515plk.309.1546540138698; Thu, 03 Jan 2019 10:28:58 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1546540138; cv=none; d=google.com; s=arc-20160816; b=R5aMKzoWaKm13WsHugv4ftH38zUD+GVOZqxsNbFst72J0f0rYcB23vSBU49xCQROI3 ELK7ZuHGJNxe67chnhq5RsNQmYn5HUwyCy3yczQOFNRiqxqjIvMsNd7GPmDkei6eqnmf qKuMmVYodxD43zyNhhjt+5qCIqi2edXApQZo5qiGy933QuPrzeeqJRSjRYUep6dPCvY0 zzEIxlcmOq9VWKZ3C/K6liKB4VMuOS3FxSMCMGh2fbOqRB9OCQBRd0hhe0rl9JBKJRoz EGAIcmozb0jsxO5152yNTtHkylrc8CzzWgKRy8+aI2xhYVvrDpuYTnnXA/1bzqR1+7/9 bDmg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to; bh=53n3BDtUt6mswajtHqipV72LLQ7amyCGK7tzD+VHrqo=; b=01t0s5rQ3bAq/IoInbEl8WI5Ip1Ptaj87QdEcGgUkbQJIuPDjQ7Cj9X2USv3sh9emH 8Ul0F0mHGKW9sDtoKBBLr+V9v1o3w1JiKGcZY7cIZs9bWZjuCQ5mHH4ySuDpE9Iwcg5E bI48e4NWE9+8NrqPAQDlL+vB0ca5cjZr8iJsqYe7FrqtXucYlMDAoNGsFiuj2lZrRdlb CZxurYWjhmI9XDz02HodROoVCjuqrve9FjXJkHxNJZ9yxqAQ+Jsl4eLsz1K24FowbwiO 7uDE8/Y/SVR9FMycE4xTjMHB/buGAqCDGXvuzGxw0uV1bmknS8rg/Vs3uqs8sRMJJxqu eUKg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=QpDuhalC; spf=pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 198.145.21.10 as permitted sender) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from ml01.01.org (ml01.01.org. [198.145.21.10]) by mx.google.com with ESMTPS id 133si4628319pfw.64.2019.01.03.10.28.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 03 Jan 2019 10:28:58 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 198.145.21.10 as permitted sender) client-ip=198.145.21.10; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=QpDuhalC; spf=pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 198.145.21.10 as permitted sender) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 0BC86211ADA45; Thu, 3 Jan 2019 10:28:54 -0800 (PST) X-Original-To: edk2-devel@lists.01.org Delivered-To: edk2-devel@lists.01.org Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=2a00:1450:4864:20::543; helo=mail-ed1-x543.google.com; envelope-from=ard.biesheuvel@linaro.org; receiver=edk2-devel@lists.01.org Received: from mail-ed1-x543.google.com (mail-ed1-x543.google.com [IPv6:2a00:1450:4864:20::543]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id B1777211ADA3B for ; Thu, 3 Jan 2019 10:28:52 -0800 (PST) Received: by mail-ed1-x543.google.com with SMTP id h15so29799208edb.4 for ; Thu, 03 Jan 2019 10:28:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=xJoQURgxYEJ3pzhOVyuRI2bfPOf00NGpGGG3zUqfqBs=; b=QpDuhalCP29yqQCElOcrAU35OMcMf3jVZwyLPz7rgDKDCihVzs3fVNz4Dbl4PfGccA ia03ShM5r209fEEgF+wTy0qf68REv0h7hGGkRvrLF1el15rndBZGCk+7b8VXGTu60VyH 0tej9BBchIkLOgewULinbV4eANG5OODNj7kBg= 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; bh=xJoQURgxYEJ3pzhOVyuRI2bfPOf00NGpGGG3zUqfqBs=; b=Tpw129SMjp+wp0X1k9asmlqZZlzu4KEz43QG1Tsu9SW0yfgYrrMzWjkwmMGg72l47B pIYemQ/e/n1SbMIFgCCBumMa+RwS4m15lftEyAl0rwCF7btZoaGRlLwtk4UWN05lu8dq idKzcoD6e2XxVLPON2SRn3LsTvdPG3kKk/VscqujftvmjqN0UfNkqn/WTtNbQseqOVet OQ7ppJRG40zQoCiuj46aM88zostA4P3OoqjC6fEgJ2ubUNJGRDdJQVmjev9Se9koPJPz zXl954EjGGF6Y4Rdn3eBcHSoKinAd3/hUO2srNFi32Pt1w3vl4XzEHm6MYaHxtgjXEhc gYpQ== X-Gm-Message-State: AJcUukcEtSDfMES/vzXQiyvV4ZC1KcJv+67L89u3Bow3Zi8S/1oOhm15 dXm4NnvCqTLw8BzBgOz80ATXpIK1bxPalw== X-Received: by 2002:a50:d753:: with SMTP id i19mr3260270edj.75.1546540130869; Thu, 03 Jan 2019 10:28:50 -0800 (PST) Received: from dogfood.home ([2a01:cb1d:112:6f00:704e:c241:dc88:597d]) by smtp.gmail.com with ESMTPSA id a11sm25707206edc.28.2019.01.03.10.28.49 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 03 Jan 2019 10:28:50 -0800 (PST) From: Ard Biesheuvel To: edk2-devel@lists.01.org Date: Thu, 3 Jan 2019 19:28:20 +0100 Message-Id: <20190103182825.32231-3-ard.biesheuvel@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190103182825.32231-1-ard.biesheuvel@linaro.org> References: <20190103182825.32231-1-ard.biesheuvel@linaro.org> Subject: [edk2] [PATCH 1/6] MdePkg/Include: add MmServicesTableLib header file X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Hao Wu , Liming Gao , Michael D Kinney , Laszlo Ersek MIME-Version: 1.0 Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" From: Jagadeesh Ujja SMM has been rebranded as MM, and can be implemented in traditional mode or standalone mode, using the same prototype for the services table. Expose this table via MmServicesTableLib, permitting the respective implementations to expose a traditional or standalone version. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Jagadeesh Ujja Signed-off-by: Ard Biesheuvel --- MdePkg/Include/Library/MmServicesTableLib.h | 25 ++++++++++++++++++++ MdePkg/MdePkg.dec | 4 ++++ 2 files changed, 29 insertions(+) -- 2.17.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel diff --git a/MdePkg/Include/Library/MmServicesTableLib.h b/MdePkg/Include/Library/MmServicesTableLib.h new file mode 100644 index 000000000000..12bd01e98641 --- /dev/null +++ b/MdePkg/Include/Library/MmServicesTableLib.h @@ -0,0 +1,25 @@ +/** @file + Provides a service to retrieve a pointer to the Standalone MM Services Table. + Only available to Standalone MM module types. + +Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.
+Copyright (c) 2016 - 2018, ARM Limited. All rights reserved.
+ +This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#ifndef __MM_SERVICES_TABLE_LIB_H__ +#define __MM_SERVICES_TABLE_LIB_H__ + +#include + +extern EFI_MM_SYSTEM_TABLE *gMmst; + +#endif diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec index 712bd46dd3d3..a7383b6daafb 100644 --- a/MdePkg/MdePkg.dec +++ b/MdePkg/MdePkg.dec @@ -243,6 +243,10 @@ [LibraryClasses] ## SafeIntLib|Include/Library/SafeIntLib.h + ## @libraryclass Provides a service to retrieve a pointer to the Standalone MM Services Table. + # Only available to MM_STANDALONE, SMM/DXE Combined and SMM module types. + MmServicesTableLib|Include/Library/MmServicesTableLib.h + [LibraryClasses.IA32, LibraryClasses.X64] ## @libraryclass Abstracts both S/W SMI generation and detection. ## From patchwork Thu Jan 3 18:28:21 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ard Biesheuvel X-Patchwork-Id: 154738 Delivered-To: patch@linaro.org Received: by 2002:a2e:299d:0:0:0:0:0 with SMTP id p29-v6csp950335ljp; Thu, 3 Jan 2019 10:29:02 -0800 (PST) X-Google-Smtp-Source: ALg8bN6UFjiidsqF1vegbSfrjNIPhJH6HaRDLU2TDw7PVMlBw7kyGTA93KjIeJGzNubv5VW1yRLg X-Received: by 2002:a25:1883:: with SMTP id 125mr18606642yby.161.1546540141916; Thu, 03 Jan 2019 10:29:01 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1546540141; cv=none; d=google.com; s=arc-20160816; b=axCAp6ggzzCQtBTti8GeiMzvDjUcJVEdBiGf9hGaeMHloxIeFaFcz/ELYOsFQ/l6GP 33btXaIdgKs2+vfTnvc03d5IHfpBZmIGehcVlsiA4gIKWfmiXtRCI7/CEvcBP/z8DByw wtWl1xM9jzz5D090DkjqyEQJWk8HHYbWpt0xfCg10MBgpQZ7FOfV8axWzOOjLJ26dtvz f6NDVxvbIjSKQ91cDCxjgsozVeuZj7Hi2TXMds3DGPSXhRuoKe3ZF2t30q1s/2vmsPg/ W7u5yyxwVreW4fxiz4hI7xw53d0w9UmPPXiI44c48zgugAWiTxtcuXzy4K13ZTw+SfVu xsGA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to; bh=cYusNjckeyTvhB7JY0nPL33utP85Krkgm8s6GpjXBB4=; b=uqqG5TVZHsnUL/7R4s/7hW02Q3m6u+V9CC40g1mflzCHrHBifA3M4NIYnlTg92DRzq 7y5I6BOaOke6rv9gksVg+pcfCjbFFhktQOxtXX9ND+6w1TXAZwyFxUKOnJTWadN/AfbC 9eKm0KIGzXnoafJwQGtd0w4diJoLMH2ds6ZDt6BMSuZVbIORwUHFjjcjBCZZdUEwZTvh kSycbnzUJie4yuDUpf+RvsV27anENO+TjAXkOfx1QSbM2hmkOTg7ex9Nh8iFcrxC7ozC ShF39IYvtwg6dXQ7aWPAoSZWL0mKSWKOiHNE5Y7WWCJCeCcGFtnpkJFetBDFaLFSUerA fWEg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=YrSLKMJO; spf=pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 2001:19d0:306:5::1 as permitted sender) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from ml01.01.org (ml01.01.org. [2001:19d0:306:5::1]) by mx.google.com with ESMTPS id 1si9511009ybd.370.2019.01.03.10.29.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 03 Jan 2019 10:29:01 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 2001:19d0:306:5::1 as permitted sender) client-ip=2001:19d0:306:5::1; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=YrSLKMJO; spf=pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 2001:19d0:306:5::1 as permitted sender) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 3BF5B211ADA48; Thu, 3 Jan 2019 10:28:57 -0800 (PST) X-Original-To: edk2-devel@lists.01.org Delivered-To: edk2-devel@lists.01.org Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=2a00:1450:4864:20::544; helo=mail-ed1-x544.google.com; envelope-from=ard.biesheuvel@linaro.org; receiver=edk2-devel@lists.01.org Received: from mail-ed1-x544.google.com (mail-ed1-x544.google.com [IPv6:2a00:1450:4864:20::544]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 676A4211ADA3B for ; Thu, 3 Jan 2019 10:28:55 -0800 (PST) Received: by mail-ed1-x544.google.com with SMTP id b3so29889468ede.1 for ; Thu, 03 Jan 2019 10:28:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=MBiXcKoD/ZIdpRcJu1r2/wb9917ICJJbHxvZhq7nYhE=; b=YrSLKMJO6nz2nfmu7Ib/wx7AuCDMhOrM1jwaq83OqKQexnmapVuYx0tuTcvCCAUeTZ QviWuIOZ+mP0BBdUqqJ/ZjL7ce8BkajVADvyjqZ6qaJM26BFQJ2pCybjseXrxcAJf7Bo bDkx6DYvWefwmyiRTy5szVFhGFT04BhVdJV6Q= 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; bh=MBiXcKoD/ZIdpRcJu1r2/wb9917ICJJbHxvZhq7nYhE=; b=eM9kylTg8TkTczSoaPgSBbLFy5D+sMWE9HsyHj14HJ6Xb6QH9x3IAQ/RYKbGEAl2PZ yzhDIvORVWYmVJXTGIJHOt4Y+7kTCR53DFigD4zVXMyV+X7kgGXDzgLooe1B3C/RSOe5 dV30hAeFs83CAJVzO4Nx5+lYTD3XHqUDoXRfnu9K78vd1uFjiTKRGI9bl+0A5bFza5Hw LTfhKoQx3d4K/0nzpwFQg8kfa2M4qmkfkQSCnk7xATVXVkQSg4cttNoykMNFFuigiG1D hB0sU0MxvqViMkvRXlFBQTeXjxq2KMgXrC/kFwecN/zxGUYHGFfy8gFhLNnMwFr1X/6N qJgQ== X-Gm-Message-State: AA+aEWZHsff2y89Gwvc+T95I8voWohtgyeNa89OWbdrfxMrFSmMOSFCn SeNcSjhuAU04hVwn2j9R1v1z+ELjiyHc5w== X-Received: by 2002:a50:a844:: with SMTP id j62mr45121370edc.2.1546540132452; Thu, 03 Jan 2019 10:28:52 -0800 (PST) Received: from dogfood.home ([2a01:cb1d:112:6f00:704e:c241:dc88:597d]) by smtp.gmail.com with ESMTPSA id a11sm25707206edc.28.2019.01.03.10.28.50 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 03 Jan 2019 10:28:51 -0800 (PST) From: Ard Biesheuvel To: edk2-devel@lists.01.org Date: Thu, 3 Jan 2019 19:28:21 +0100 Message-Id: <20190103182825.32231-4-ard.biesheuvel@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190103182825.32231-1-ard.biesheuvel@linaro.org> References: <20190103182825.32231-1-ard.biesheuvel@linaro.org> Subject: [edk2] [PATCH 2/6] MdePkg: implement MmServicesTableLib based on traditional SMM X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Hao Wu , Liming Gao , Michael D Kinney , Laszlo Ersek MIME-Version: 1.0 Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" The definitions of the rebranded MM protocol stack were chosen such that the existing SMM based core drivers can be reused. So let's implement MmServicesTableLib based on gEfiMmBaseProtocolGuid, which is simply gEfiSmmBase2ProtocolGuid under the hood. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ard Biesheuvel --- MdePkg/Library/MmServicesTableLib/MmServicesTableLib.c | 63 ++++++++++++++++++++ MdePkg/Library/MmServicesTableLib/MmServicesTableLib.inf | 45 ++++++++++++++ MdePkg/Library/MmServicesTableLib/MmServicesTableLib.uni | 22 +++++++ MdePkg/MdePkg.dsc | 1 + 4 files changed, 131 insertions(+) -- 2.17.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel diff --git a/MdePkg/Library/MmServicesTableLib/MmServicesTableLib.c b/MdePkg/Library/MmServicesTableLib/MmServicesTableLib.c new file mode 100644 index 000000000000..f41d25e59805 --- /dev/null +++ b/MdePkg/Library/MmServicesTableLib/MmServicesTableLib.c @@ -0,0 +1,63 @@ +/** @file + MM Services Table Library. + + Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.
+ Copyright (c) 2018, Linaro, Ltd. All rights reserved.
+ This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#include +#include +#include +#include + +EFI_MM_SYSTEM_TABLE *gMmst = NULL; + +/** + The constructor function caches the pointer of SMM Services Table. + + @param ImageHandle The firmware allocated handle for the EFI image. + @param SystemTable A pointer to the EFI System Table. + + @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS. + +**/ +EFI_STATUS +EFIAPI +MmServicesTableLibConstructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + EFI_MM_BASE_PROTOCOL *InternalMmBase; + + InternalMmBase = NULL; + // + // Retrieve MM Base Protocol, Do not use gBS from UefiBootServicesTableLib on purpose + // to prevent inclusion of gBS, gST, and gImageHandle from SMM Drivers unless the + // MM driver explicity declares that dependency. + // + Status = SystemTable->BootServices->LocateProtocol ( + &gEfiMmBaseProtocolGuid, + NULL, + (VOID **)&InternalMmBase + ); + ASSERT_EFI_ERROR (Status); + ASSERT (InternalMmBase != NULL); + + // + // We are in MM, retrieve the pointer to MM System Table + // + InternalMmBase->GetMmstLocation (InternalMmBase, &gMmst); + ASSERT (gMmst != NULL); + + return EFI_SUCCESS; +} diff --git a/MdePkg/Library/MmServicesTableLib/MmServicesTableLib.inf b/MdePkg/Library/MmServicesTableLib/MmServicesTableLib.inf new file mode 100644 index 000000000000..4418cc2f1464 --- /dev/null +++ b/MdePkg/Library/MmServicesTableLib/MmServicesTableLib.inf @@ -0,0 +1,45 @@ +## @file +# MM Services Table Library. +# +# Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.
+# Copyright (c) 2018, Linaro, Ltd. All rights reserved.
+# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php. +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +# +## + +[Defines] + INF_VERSION = 0x0001001B + BASE_NAME = MmServicesTableLib + MODULE_UNI_FILE = MmServicesTableLib.uni + FILE_GUID = 9508ECFD-66D1-4B4C-9415-F25F0FFF9E93 + MODULE_TYPE = DXE_SMM_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = MmServicesTableLib|DXE_SMM_DRIVER + PI_SPECIFICATION_VERSION = 0x00010032 + CONSTRUCTOR = MmServicesTableLibConstructor + +# +# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 +# + +[Sources] + MmServicesTableLib.c + +[Packages] + MdePkg/MdePkg.dec + +[LibraryClasses] + DebugLib + +[Protocols] + gEfiMmBaseProtocolGuid ## CONSUMES + +[Depex] + gEfiMmBaseProtocolGuid diff --git a/MdePkg/Library/MmServicesTableLib/MmServicesTableLib.uni b/MdePkg/Library/MmServicesTableLib/MmServicesTableLib.uni new file mode 100644 index 000000000000..2b2c7e14024c --- /dev/null +++ b/MdePkg/Library/MmServicesTableLib/MmServicesTableLib.uni @@ -0,0 +1,22 @@ +// /** @file +// MM Services Table Library. +// +// MM Services Table Library. +// +// Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.
+// Copyright (c) 2018, Linaro, Ltd. All rights reserved.
+// +// This program and the accompanying materials +// are licensed and made available under the terms and conditions of the BSD License +// which accompanies this distribution. The full text of the license may be found at +// http://opensource.org/licenses/bsd-license.php. +// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +// +// **/ + + +#string STR_MODULE_ABSTRACT #language en-US "MM Services Table Library" + +#string STR_MODULE_DESCRIPTION #language en-US "MM Services Table Library." + diff --git a/MdePkg/MdePkg.dsc b/MdePkg/MdePkg.dsc index d43ffe4deb49..428b14e6a4e0 100644 --- a/MdePkg/MdePkg.dsc +++ b/MdePkg/MdePkg.dsc @@ -141,6 +141,7 @@ [Components.IA32, Components.X64] MdePkg/Library/BaseRngLib/BaseRngLib.inf MdePkg/Library/SmmPciExpressLib/SmmPciExpressLib.inf MdePkg/Library/SmiHandlerProfileLibNull/SmiHandlerProfileLibNull.inf + MdePkg/Library/MmServicesTableLib/MmServicesTableLib.inf [Components.EBC] MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf From patchwork Thu Jan 3 18:28:22 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ard Biesheuvel X-Patchwork-Id: 154739 Delivered-To: patch@linaro.org Received: by 2002:a2e:299d:0:0:0:0:0 with SMTP id p29-v6csp950387ljp; Thu, 3 Jan 2019 10:29:04 -0800 (PST) X-Google-Smtp-Source: ALg8bN4jMh/15Whk9F5RSeOvd8wNXvVtCPmxYDTFp6Qm2H2VbrtCeygynw4iXELkorOb6EE31C7f X-Received: by 2002:a17:902:9045:: with SMTP id w5mr45995184plz.32.1546540144547; Thu, 03 Jan 2019 10:29:04 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1546540144; cv=none; d=google.com; s=arc-20160816; b=SxX4j1awGSyL3smoQK1DgKCpWWh9Xy4um46F/XSENPmsBLVDQAAw1R6xVUAztRzV3F p6GZ9Ig2rSXSO7tHVr/bTz9yRVaiVcV9jgzY5RlXECZQnZys+JsjrEbh+Z3HPsL0cMKW XwKUj1xFWGYLF0OmZjICfVttetArqej65UnsHRSzB/bJmxzsQF24PHrZQuYAuvrfvY8/ /abM3NSZD2f6vRKzVjhwqCNud9mMAs9p3+xyxUn3zOnhcG9zBykKgK2R2P4FB/XrGw5K ktPjSD5C+bqhlcnMJlQx0EdCr+KJ2pJZ6tfcQP11gRT28l8uqWsVSp3yR4kp2LKh6p5R nMPA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to; bh=8VpRQYqR99UF+/oGcteQrIaK22DkIoFUSHspB2dHOG4=; b=rL/Vx62KhZdwvOkVqHT588FxgreS0C0hlqk0jvZVxGS7IdeyIvOAZal9tqAAOQMK5e yIq/FXiFiA35uzCKJKW3lHjI1wuBGO/kgXUrrM0iWdplnoU2k5OC3RRVHwynNQhQoOpp s92m7ZaSug59gDRHN5qjsL/5q3eWtv24HbeyCHXN+rHhfYZ1Pst59l+f48vvFCifjl0v gHU83UlPrdT1NoV6h8eGZbbkvfamBGbFuycD1NFC96eLv6RMUzbfGhrNNOkVD9oUcuLw 6LfXUoWq/R593p96bw2jpLQVJbyvhG2+BmHd5ypmrOP1GriUfPJ3A4DBlgoj5ezDmKT8 g/cQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=HEQg9mgf; spf=pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 198.145.21.10 as permitted sender) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from ml01.01.org (ml01.01.org. [198.145.21.10]) by mx.google.com with ESMTPS id s2si4946652pgj.60.2019.01.03.10.29.04 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 03 Jan 2019 10:29:04 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 198.145.21.10 as permitted sender) client-ip=198.145.21.10; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=HEQg9mgf; spf=pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 198.145.21.10 as permitted sender) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 6614A2194D3B3; Thu, 3 Jan 2019 10:28:57 -0800 (PST) X-Original-To: edk2-devel@lists.01.org Delivered-To: edk2-devel@lists.01.org Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=2a00:1450:4864:20::544; helo=mail-ed1-x544.google.com; envelope-from=ard.biesheuvel@linaro.org; receiver=edk2-devel@lists.01.org Received: from mail-ed1-x544.google.com (mail-ed1-x544.google.com [IPv6:2a00:1450:4864:20::544]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id F1F502194D3B3 for ; Thu, 3 Jan 2019 10:28:55 -0800 (PST) Received: by mail-ed1-x544.google.com with SMTP id b14so29783246edt.6 for ; Thu, 03 Jan 2019 10:28:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=1FqYe4KRlCjyjsIMks+TyLuGCvsrSGhE5M/nPFfq0OY=; b=HEQg9mgfaulx71a0m241MtMZCUNJCWiDcBUWRZorVqH41lOPIQBT66s9lHVBnPefIW 3Q7zP6jFg4BgCeVeOzroiTZ9PsdASGnbRoqFzfja56+TZKlEW5pX+Oi1df4jpYz+WJ50 hA21XRpJCozoM40k8DAV5F+FrkiBqDiOY0Aq8= 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; bh=1FqYe4KRlCjyjsIMks+TyLuGCvsrSGhE5M/nPFfq0OY=; b=NHiYEkrqbL4t4kleZRP7A+W5ygQRIoMICIF3EwsatIw1jEOcqSxs+MqLHi6v91m/Ma YkfO2wXRz3SQlNQJhJ8eCBR1eyndDzrl8atacgWxnbgAfsv/3Bj2Zt7sR9U8p8kC59J8 KIWPlAD+i9gmglHf89+Q4bwLAkB8LC49u/sspafhW0ImRd5poZ1IDs5XbzTzeLjL+WyX FKPJcJMjanpdXDkffq2naQcmqW1C54leskUoJU34B5eM7ckTwohDmfDKXITvbRavXiaw gnDoRPaUuKdVdcsD+gAqHIN2bCozC8btfhpiXKaICLSFzWmyImM4Ruzftsi0C7VhEhA0 4TeA== X-Gm-Message-State: AA+aEWbYxF5mWyD/efwWczUDiGxCNUwqX389VIDZMghgLDzVFOYkmCaI 3fb+WrHXU8O5m//5wajJomMZYzP7Gzuiuw== X-Received: by 2002:a50:bae3:: with SMTP id x90mr44454624ede.221.1546540134084; Thu, 03 Jan 2019 10:28:54 -0800 (PST) Received: from dogfood.home ([2a01:cb1d:112:6f00:704e:c241:dc88:597d]) by smtp.gmail.com with ESMTPSA id a11sm25707206edc.28.2019.01.03.10.28.52 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 03 Jan 2019 10:28:53 -0800 (PST) From: Ard Biesheuvel To: edk2-devel@lists.01.org Date: Thu, 3 Jan 2019 19:28:22 +0100 Message-Id: <20190103182825.32231-5-ard.biesheuvel@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190103182825.32231-1-ard.biesheuvel@linaro.org> References: <20190103182825.32231-1-ard.biesheuvel@linaro.org> Subject: [edk2] [PATCH 3/6] MdeModulePkg/FaultTolerantWriteDxe: factor out boot service accesses X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Hao Wu , Liming Gao , Michael D Kinney , Laszlo Ersek MIME-Version: 1.0 Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" In preparation of providing a standalone MM based FTW driver, move the existing SMM driver to the new MM services table, and factor out some pieces that are specific to the traditional driver, mainly related to the use of UEFI boot services, which are not accessible to standalone MM drivers. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ard Biesheuvel --- MdeModulePkg/MdeModulePkg.dsc | 1 + MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWrite.h | 22 ++++- MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.c | 31 +++++++ MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmm.c | 54 +++++------ MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmm.inf | 5 +- MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmmCommon.h | 31 +++++++ MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmmDxe.c | 1 + MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteTraditionalMm.c | 94 ++++++++++++++++++++ MdeModulePkg/Universal/FaultTolerantWriteDxe/UpdateWorkingBlock.c | 10 +-- 9 files changed, 205 insertions(+), 44 deletions(-) -- 2.17.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel Reviewed-by: Jian J Wang diff --git a/MdeModulePkg/MdeModulePkg.dsc b/MdeModulePkg/MdeModulePkg.dsc index 5d042be3a862..ef3c144ed524 100644 --- a/MdeModulePkg/MdeModulePkg.dsc +++ b/MdeModulePkg/MdeModulePkg.dsc @@ -153,6 +153,7 @@ [LibraryClasses.common.DXE_SMM_DRIVER] DebugLib|MdePkg/Library/UefiDebugLibConOut/UefiDebugLibConOut.inf MemoryAllocationLib|MdePkg/Library/SmmMemoryAllocationLib/SmmMemoryAllocationLib.inf SmmServicesTableLib|MdePkg/Library/SmmServicesTableLib/SmmServicesTableLib.inf + MmServicesTableLib|MdePkg/Library/MmServicesTableLib/MmServicesTableLib.inf LockBoxLib|MdeModulePkg/Library/SmmLockBoxLib/SmmLockBoxSmmLib.inf SmmMemLib|MdePkg/Library/SmmMemLib/SmmMemLib.inf diff --git a/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWrite.h b/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWrite.h index 844cf3bee04d..8d146264b129 100644 --- a/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWrite.h +++ b/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWrite.h @@ -31,7 +31,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include #include #include -#include #include // @@ -766,4 +765,25 @@ WriteWorkSpaceData ( IN UINT8 *Buffer ); +/** + Internal implementation of CRC32. Depending on the execution context + (traditional SMM or DXE vs standalone MM), this function is implemented + via a call to the CalculateCrc32 () boot service, or via a library + call. + + If Buffer is NULL, then ASSERT(). + If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). + + @param[in] Buffer A pointer to the buffer on which the 32-bit CRC is to be computed. + @param[in] Length The number of bytes in the buffer Data. + + @retval Crc32 The 32-bit CRC was computed for the data buffer. + +**/ +UINT32 +FtwCalculateCrc32 ( + IN VOID *Buffer, + IN UINTN Length + ); + #endif diff --git a/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.c b/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.c index 094e40f9d86c..24e507104bbe 100644 --- a/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.c +++ b/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.c @@ -51,6 +51,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. **/ +#include #include "FaultTolerantWrite.h" EFI_EVENT mFvbRegistration = NULL; @@ -250,3 +251,33 @@ FaultTolerantWriteInitialize ( return EFI_SUCCESS; } + +/** + Internal implementation of CRC32. Depending on the execution context + (traditional SMM or DXE vs standalone MM), this function is implemented + via a call to the CalculateCrc32 () boot service, or via a library + call. + + If Buffer is NULL, then ASSERT(). + If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). + + @param[in] Buffer A pointer to the buffer on which the 32-bit CRC is to be computed. + @param[in] Length The number of bytes in the buffer Data. + + @retval Crc32 The 32-bit CRC was computed for the data buffer. + +**/ +UINT32 +FtwCalculateCrc32 ( + IN VOID *Buffer, + IN UINTN Length + ) +{ + EFI_STATUS Status; + UINT32 ReturnValue; + + Status = gBS->CalculateCrc32 (Buffer, Length, &ReturnValue); + ASSERT_EFI_ERROR (Status); + + return ReturnValue; +} diff --git a/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmm.c b/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmm.c index 481fea3f1fdf..e91d04e56d7c 100644 --- a/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmm.c +++ b/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmm.c @@ -54,14 +54,13 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. **/ -#include -#include -#include +#include +#include #include #include #include "FaultTolerantWrite.h" #include "FaultTolerantWriteSmmCommon.h" -#include +#include EFI_EVENT mFvbRegistration = NULL; EFI_FTW_DEVICE *mFtwDevice = NULL; @@ -92,7 +91,7 @@ FtwGetFvbByHandle ( // // To get the SMM FVB protocol interface on the handle // - return gSmst->SmmHandleProtocol ( + return gMmst->MmHandleProtocol ( FvBlockHandle, &gEfiSmmFirmwareVolumeBlockProtocolGuid, (VOID **) FvBlock @@ -119,7 +118,7 @@ FtwGetSarProtocol ( // // Locate Smm Swap Address Range protocol // - Status = gSmst->SmmLocateProtocol ( + Status = gMmst->MmLocateProtocol ( &gEfiSmmSwapAddressRangeProtocolGuid, NULL, SarProtocol @@ -158,7 +157,7 @@ GetFvbCountAndBuffer ( BufferSize = 0; *NumberHandles = 0; *Buffer = NULL; - Status = gSmst->SmmLocateHandle ( + Status = gMmst->MmLocateHandle ( ByProtocol, &gEfiSmmFirmwareVolumeBlockProtocolGuid, NULL, @@ -174,7 +173,7 @@ GetFvbCountAndBuffer ( return EFI_OUT_OF_RESOURCES; } - Status = gSmst->SmmLocateHandle ( + Status = gMmst->MmLocateHandle ( ByProtocol, &gEfiSmmFirmwareVolumeBlockProtocolGuid, NULL, @@ -336,8 +335,7 @@ SmmFaultTolerantWriteHandler ( } CommBufferPayloadSize = TempCommBufferSize - SMM_FTW_COMMUNICATE_HEADER_SIZE; - if (!SmmIsBufferOutsideSmmValid ((UINTN)CommBuffer, TempCommBufferSize)) { - DEBUG ((EFI_D_ERROR, "SmmFtwHandler: SMM communication buffer in SMRAM or overflow!\n")); + if (!FtwSmmIsBufferOutsideSmmValid ((UINTN)CommBuffer, TempCommBufferSize)) { return EFI_SUCCESS; } @@ -525,13 +523,12 @@ FvbNotificationEvent ( EFI_STATUS Status; EFI_SMM_FAULT_TOLERANT_WRITE_PROTOCOL *FtwProtocol; EFI_HANDLE SmmFtwHandle; - EFI_HANDLE FtwHandle; // // Just return to avoid install SMM FaultTolerantWriteProtocol again // if SMM Fault Tolerant Write protocol had been installed. // - Status = gSmst->SmmLocateProtocol ( + Status = gMmst->MmLocateProtocol ( &gEfiSmmFaultTolerantWriteProtocolGuid, NULL, (VOID **) &FtwProtocol @@ -551,7 +548,7 @@ FvbNotificationEvent ( // // Install protocol interface // - Status = gSmst->SmmInstallProtocolInterface ( + Status = gMmst->MmInstallProtocolInterface ( &mFtwDevice->Handle, &gEfiSmmFaultTolerantWriteProtocolGuid, EFI_NATIVE_INTERFACE, @@ -562,20 +559,13 @@ FvbNotificationEvent ( /// /// Register SMM FTW SMI handler /// - Status = gSmst->SmiHandlerRegister (SmmFaultTolerantWriteHandler, &gEfiSmmFaultTolerantWriteProtocolGuid, &SmmFtwHandle); + Status = gMmst->MmiHandlerRegister (SmmFaultTolerantWriteHandler, &gEfiSmmFaultTolerantWriteProtocolGuid, &SmmFtwHandle); ASSERT_EFI_ERROR (Status); // // Notify the Ftw wrapper driver SMM Ftw is ready // - FtwHandle = NULL; - Status = gBS->InstallProtocolInterface ( - &FtwHandle, - &gEfiSmmFaultTolerantWriteProtocolGuid, - EFI_NATIVE_INTERFACE, - NULL - ); - ASSERT_EFI_ERROR (Status); + FtwNotifySmmReady (); return EFI_SUCCESS; } @@ -592,7 +582,7 @@ FvbNotificationEvent ( **/ EFI_STATUS EFIAPI -SmmEndOfDxeCallback ( +MmEndOfDxeCallback ( IN CONST EFI_GUID *Protocol, IN VOID *Interface, IN EFI_HANDLE Handle @@ -614,14 +604,12 @@ SmmEndOfDxeCallback ( **/ EFI_STATUS -EFIAPI -SmmFaultTolerantWriteInitialize ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable +MmFaultTolerantWriteInitialize ( + VOID ) { EFI_STATUS Status; - VOID *SmmEndOfDxeRegistration; + VOID *MmEndOfDxeRegistration; // // Allocate private data structure for SMM FTW protocol and do some initialization @@ -634,17 +622,17 @@ SmmFaultTolerantWriteInitialize ( // // Register EFI_SMM_END_OF_DXE_PROTOCOL_GUID notify function. // - Status = gSmst->SmmRegisterProtocolNotify ( - &gEfiSmmEndOfDxeProtocolGuid, - SmmEndOfDxeCallback, - &SmmEndOfDxeRegistration + Status = gMmst->MmRegisterProtocolNotify ( + &gEfiMmEndOfDxeProtocolGuid, + MmEndOfDxeCallback, + &MmEndOfDxeRegistration ); ASSERT_EFI_ERROR (Status); // // Register FvbNotificationEvent () notify function. // - Status = gSmst->SmmRegisterProtocolNotify ( + Status = gMmst->MmRegisterProtocolNotify ( &gEfiSmmFirmwareVolumeBlockProtocolGuid, FvbNotificationEvent, &mFvbRegistration diff --git a/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmm.inf b/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmm.inf index 606cc2266bda..1653365bc247 100644 --- a/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmm.inf +++ b/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmm.inf @@ -37,6 +37,7 @@ [Sources] FtwMisc.c UpdateWorkingBlock.c FaultTolerantWrite.c + FaultTolerantWriteTraditionalMm.c FaultTolerantWriteSmm.c FaultTolerantWrite.h FaultTolerantWriteSmmCommon.h @@ -46,7 +47,7 @@ [Packages] MdeModulePkg/MdeModulePkg.dec [LibraryClasses] - SmmServicesTableLib + MmServicesTableLib MemoryAllocationLib BaseMemoryLib UefiDriverEntryPoint @@ -73,7 +74,7 @@ [Protocols] ## PRODUCES ## UNDEFINED # SmiHandlerRegister gEfiSmmFaultTolerantWriteProtocolGuid - gEfiSmmEndOfDxeProtocolGuid ## CONSUMES + gEfiMmEndOfDxeProtocolGuid ## CONSUMES [FeaturePcd] gEfiMdeModulePkgTokenSpaceGuid.PcdFullFtwServiceEnable ## CONSUMES diff --git a/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmmCommon.h b/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmmCommon.h index 8ad0015f3c9e..25b5f7c87326 100644 --- a/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmmCommon.h +++ b/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmmCommon.h @@ -77,4 +77,35 @@ typedef struct { UINT8 Data[1]; } SMM_FTW_GET_LAST_WRITE_HEADER; +/** + Entry point of the module +**/ +EFI_STATUS +MmFaultTolerantWriteInitialize ( + VOID + ); + +/** + This function check if the buffer is valid per processor architecture and not overlap with SMRAM. + + @param Buffer The buffer start address to be checked. + @param Length The buffer length to be checked. + + @retval TRUE This buffer is valid per processor architecture and not overlap with SMRAM. + @retval FALSE This buffer is not valid per processor architecture or overlap with SMRAM. +**/ +BOOLEAN +FtwSmmIsBufferOutsideSmmValid ( + IN EFI_PHYSICAL_ADDRESS Buffer, + IN UINT64 Length + ); + +/** + Notify the system that the SMM driver is ready +**/ +VOID +FtwNotifySmmReady ( + VOID + ); + #endif diff --git a/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmmDxe.c b/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmmDxe.c index 259e9365f483..8694b9254cde 100644 --- a/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmmDxe.c +++ b/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmmDxe.c @@ -14,6 +14,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. **/ +#include #include "FaultTolerantWriteSmmDxe.h" EFI_HANDLE mHandle = NULL; diff --git a/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteTraditionalMm.c b/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteTraditionalMm.c new file mode 100644 index 000000000000..440dced37bf8 --- /dev/null +++ b/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteTraditionalMm.c @@ -0,0 +1,94 @@ +/** @file + + Parts of the SMM/MM implementation that are specific to traditional MM + +Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.
+Copyright (c) 2018, Linaro, Ltd. All rights reserved.
+This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#include +#include +#include "FaultTolerantWrite.h" +#include "FaultTolerantWriteSmmCommon.h" + +BOOLEAN +FtwSmmIsBufferOutsideSmmValid ( + IN EFI_PHYSICAL_ADDRESS Buffer, + IN UINT64 Length + ) +{ + if (!SmmIsBufferOutsideSmmValid (Buffer, Length)) { + DEBUG ((EFI_D_ERROR, "SmmFtwHandler: SMM communication buffer in SMRAM or overflow!\n")); + return FALSE; + } + return TRUE; +} + +/** + Internal implementation of CRC32. Depending on the execution context + (traditional SMM or DXE vs standalone MM), this function is implemented + via a call to the CalculateCrc32 () boot service, or via a library + call. + + If Buffer is NULL, then ASSERT(). + If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). + + @param[in] Buffer A pointer to the buffer on which the 32-bit CRC is to be computed. + @param[in] Length The number of bytes in the buffer Data. + + @retval Crc32 The 32-bit CRC was computed for the data buffer. + +**/ +UINT32 +FtwCalculateCrc32 ( + IN VOID *Buffer, + IN UINTN Length + ) +{ + EFI_STATUS Status; + UINT32 ReturnValue; + + Status = gBS->CalculateCrc32 (Buffer, Length, &ReturnValue); + ASSERT_EFI_ERROR (Status); + + return ReturnValue; +} + +/** + Notify the system that the SMM driver is ready +**/ +VOID +FtwNotifySmmReady ( + VOID + ) +{ + EFI_HANDLE FtwHandle; + EFI_STATUS Status; + + FtwHandle = NULL; + Status = gBS->InstallProtocolInterface ( + &FtwHandle, + &gEfiSmmFaultTolerantWriteProtocolGuid, + EFI_NATIVE_INTERFACE, + NULL + ); + ASSERT_EFI_ERROR (Status); +} + +EFI_STATUS +EFIAPI +SmmFaultTolerantWriteInitialize ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return MmFaultTolerantWriteInitialize (); +} diff --git a/MdeModulePkg/Universal/FaultTolerantWriteDxe/UpdateWorkingBlock.c b/MdeModulePkg/Universal/FaultTolerantWriteDxe/UpdateWorkingBlock.c index 50d3421b88bb..d09e9719cf05 100644 --- a/MdeModulePkg/Universal/FaultTolerantWriteDxe/UpdateWorkingBlock.c +++ b/MdeModulePkg/Universal/FaultTolerantWriteDxe/UpdateWorkingBlock.c @@ -29,8 +29,6 @@ InitializeLocalWorkSpaceHeader ( VOID ) { - EFI_STATUS Status; - // // Check signature with gEdkiiWorkingBlockSignatureGuid. // @@ -64,12 +62,8 @@ InitializeLocalWorkSpaceHeader ( // // Calculate the Crc of woking block header // - Status = gBS->CalculateCrc32 ( - &mWorkingBlockHeader, - sizeof (EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER), - &mWorkingBlockHeader.Crc - ); - ASSERT_EFI_ERROR (Status); + mWorkingBlockHeader.Crc = FtwCalculateCrc32 (&mWorkingBlockHeader, + sizeof (EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER)); mWorkingBlockHeader.WorkingBlockValid = FTW_VALID_STATE; mWorkingBlockHeader.WorkingBlockInvalid = FTW_INVALID_STATE; From patchwork Thu Jan 3 18:28:23 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ard Biesheuvel X-Patchwork-Id: 154740 Delivered-To: patch@linaro.org Received: by 2002:a2e:299d:0:0:0:0:0 with SMTP id p29-v6csp950439ljp; Thu, 3 Jan 2019 10:29:07 -0800 (PST) X-Google-Smtp-Source: ALg8bN7cLvFog8lldk5vpneUQhSWsvX1ejYQUG0/xdB4+x93U9lMDtfT+nBavoWWAxO2HlSsfXHe X-Received: by 2002:a63:be4d:: with SMTP id g13mr18099325pgo.378.1546540147734; Thu, 03 Jan 2019 10:29:07 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1546540147; cv=none; d=google.com; s=arc-20160816; b=x1XL363wj/099DCf6I65gKAcYcolw+PMQraJmLcc7gN9hUMcXxW+NkFnAs7ChczQ43 Dt8sq/H9jxU4+jWmip5NsverbsxteZQhJlX+U+pYPYULyIlsaYP7u/+9lib7YvLsUrO3 I95Rl9+uBDp+O7JhE/QjSPVlnDQQZq+nBhhrneDT3V1Ca3y9hGsGXFKRIK1CR1Rg+Gln 9z3Y7LesfbzjzHlg01IC03sS+1r1SB3FVg0tiCHwk8RGLl4rmZtSMJ4c5sSCp0tdsK3v CzEcZ+ojk+idL4JQN1NZrPX37aGWbeT4a3+ONqVrN7SJmcJSLNYgdvVKs52Qef04gHuH gMag== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to; bh=hwP71924TU+q8U/xBoglv7WPInunjmF0ahcgEfopstY=; b=Mx6AsATCEm6NaQnWYDECHHe6c8DOfhdeC8HndNOefzNf/gVINoX8HvTesf6j4zfpe1 92Sp2siOVPYnm5royUBPGsxtG2WQ4JVd4a+QHMnqp42mBrMFbx/0vAB5Z+LP0SydeUwn FNQqXBJwUcSKXYlVAPFYOB7Pye1bHdI5zO1kcyvJYzqIk4X6RJ8tR/3U58C4vweSuNTJ r8HbAQIgp25NA16cyqTOFinT1tjohlVNRn5SmCZOAvnb9rgxAK4c50oCWyiMmb/EZZER a8q9VTjnHfyF24eKEDWql0PpdXWcUHLTHXs+eK6lxmZO10Bn3iJNQnjlActCiIJ+ng4I AEIg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=jxa8hk7c; spf=pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 198.145.21.10 as permitted sender) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from ml01.01.org (ml01.01.org. [198.145.21.10]) by mx.google.com with ESMTPS id p3si33994210plk.424.2019.01.03.10.29.07 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 03 Jan 2019 10:29:07 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 198.145.21.10 as permitted sender) client-ip=198.145.21.10; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=jxa8hk7c; spf=pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 198.145.21.10 as permitted sender) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 90445211ADA4D; Thu, 3 Jan 2019 10:28:59 -0800 (PST) X-Original-To: edk2-devel@lists.01.org Delivered-To: edk2-devel@lists.01.org Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=2a00:1450:4864:20::541; helo=mail-ed1-x541.google.com; envelope-from=ard.biesheuvel@linaro.org; receiver=edk2-devel@lists.01.org Received: from mail-ed1-x541.google.com (mail-ed1-x541.google.com [IPv6:2a00:1450:4864:20::541]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 9A86D211ADA34 for ; Thu, 3 Jan 2019 10:28:57 -0800 (PST) Received: by mail-ed1-x541.google.com with SMTP id h50so29810626ede.5 for ; Thu, 03 Jan 2019 10:28:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=shT3Q/Zocz0DJtBVOptUWODAts4+Q7AZH9hJtqDcNOI=; b=jxa8hk7coUs3O8Kndh/n67nrMvUBuLzEE85TL+ojeU0dihYdLo8vBCYM+iAx3nV4KO ywVLZP2WYyxFJglmFtkV6R8r2h5Z7h8wrH1mw4evtsbBa2tNlS3+zm5Ub5NFunESGAxU q6hVgx/A/hfrZW5I8sUg39NLthkuYoLcV/bJo= 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; bh=shT3Q/Zocz0DJtBVOptUWODAts4+Q7AZH9hJtqDcNOI=; b=sv31LNsQEdgPAzUn9rwDHFY5fNq23i0qO8Rg/ch41bNxADzxsCq4Q9L98KxU/lhS6a 1TWZqioMjLjwGjmF1tXtfBIM6nDr14t1JH1WsL06nBTElAkVuq/G7RZ7ccwSbmMf0QZQ 31b2HAbdUO+lnyt5XEj3wcVVjPgeAg55YFhQGUdsKXiFOd0wLBcmrCZHQfdgnQCD/ruQ 5zbtB4GPNCXfxITxM6vT1xibg/uguUpzLzsgN7DaO0TdISYZDL6Sjl5NKBeSMECVxbMj zcM++OXWi+p7BRQeqLUpxffXAlDPeHj5pmWJRqbhf7geUPCQv4DryDKT/qpNInUZcSiK 6WSw== X-Gm-Message-State: AA+aEWY57beX3nniKogjkdQD/zfi9NlsHWBB1QEkzBcj9C6Ama3EnWc/ qzGhVzUqriwmoJlt7BpnERPt/1VeVPongw== X-Received: by 2002:a17:906:195b:: with SMTP id b27-v6mr36968543eje.220.1546540135652; Thu, 03 Jan 2019 10:28:55 -0800 (PST) Received: from dogfood.home ([2a01:cb1d:112:6f00:704e:c241:dc88:597d]) by smtp.gmail.com with ESMTPSA id a11sm25707206edc.28.2019.01.03.10.28.54 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 03 Jan 2019 10:28:54 -0800 (PST) From: Ard Biesheuvel To: edk2-devel@lists.01.org Date: Thu, 3 Jan 2019 19:28:23 +0100 Message-Id: <20190103182825.32231-6-ard.biesheuvel@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190103182825.32231-1-ard.biesheuvel@linaro.org> References: <20190103182825.32231-1-ard.biesheuvel@linaro.org> Subject: [edk2] [PATCH 4/6] MdeModulePkg/FaultTolerantWriteDxe: implement standalone MM version X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Hao Wu , Liming Gao , Michael D Kinney , Laszlo Ersek MIME-Version: 1.0 Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" Implement a new version of the fault tolerant write driver that can be used in the context of a standalone MM implementation. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ard Biesheuvel --- MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteStandaloneMm.c | 70 +++++++++++++++ MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteStandaloneMm.inf | 90 ++++++++++++++++++++ 2 files changed, 160 insertions(+) -- 2.17.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel Reviewed-by: Jian J Wang diff --git a/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteStandaloneMm.c b/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteStandaloneMm.c new file mode 100644 index 000000000000..b6fbf6c64f8a --- /dev/null +++ b/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteStandaloneMm.c @@ -0,0 +1,70 @@ +/** @file + + Parts of the SMM/MM implementation that are specific to standalone MM + +Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.
+Copyright (c) 2018, Linaro, Ltd. All rights reserved.
+This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#include +#include +#include "FaultTolerantWrite.h" +#include "FaultTolerantWriteSmmCommon.h" + +BOOLEAN +FtwSmmIsBufferOutsideSmmValid ( + IN EFI_PHYSICAL_ADDRESS Buffer, + IN UINT64 Length + ) +{ + return TRUE; +} + +/** + Internal implementation of CRC32. Depending on the execution context + (standalone SMM or DXE vs standalone MM), this function is implemented + via a call to the CalculateCrc32 () boot service, or via a library + call. + + If Buffer is NULL, then ASSERT(). + If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). + + @param[in] Buffer A pointer to the buffer on which the 32-bit CRC is to be computed. + @param[in] Length The number of bytes in the buffer Data. + + @retval Crc32 The 32-bit CRC was computed for the data buffer. + +**/ +UINT32 +FtwCalculateCrc32 ( + IN VOID *Buffer, + IN UINTN Length + ) +{ + return CalculateCrc32 (Buffer, Length); +} + +VOID +FtwNotifySmmReady ( + VOID + ) +{ +} + +EFI_STATUS +EFIAPI +StandaloneMmFaultTolerantWriteInitialize ( + IN EFI_HANDLE ImageHandle, + IN EFI_MM_SYSTEM_TABLE *MmSystemTable + ) +{ + return MmFaultTolerantWriteInitialize (); +} diff --git a/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteStandaloneMm.inf b/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteStandaloneMm.inf new file mode 100644 index 000000000000..99bd62ad5ceb --- /dev/null +++ b/MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteStandaloneMm.inf @@ -0,0 +1,90 @@ + ## @file +# Fault Tolerant Write Smm Driver. +# +# This driver installs SMM Fault Tolerant Write (FTW) protocol, which provides fault +# tolerant write capability in SMM environment for block devices. Its implementation +# depends on the full functionality SMM FVB protocol that support read, write/erase +# flash access. +# +# Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.
+# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +## + +[Defines] + INF_VERSION = 0x0001001A + BASE_NAME = FaultTolerantWriteStandaloneMm + FILE_GUID = 3aade4ec-63cc-4a48-a928-5a374dd463eb + MODULE_TYPE = MM_STANDALONE + VERSION_STRING = 1.0 + PI_SPECIFICATION_VERSION = 0x00010032 + ENTRY_POINT = StandaloneMmFaultTolerantWriteInitialize + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = AARCH64 +# + +[Sources] + FtwMisc.c + UpdateWorkingBlock.c + FaultTolerantWrite.c + FaultTolerantWriteStandaloneMm.c + FaultTolerantWriteSmm.c + FaultTolerantWrite.h + FaultTolerantWriteSmmCommon.h + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + StandaloneMmPkg/StandaloneMmPkg.dec + +[LibraryClasses] + BaseLib + BaseMemoryLib + DebugLib + MemoryAllocationLib + MmServicesTableLib + PcdLib + ReportStatusCodeLib + StandaloneMmDriverEntryPoint + +[Guids] + # + # Signature in EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER + # + ## CONSUMES ## GUID + ## PRODUCES ## GUID + gEdkiiWorkingBlockSignatureGuid + +[Protocols] + gEfiSmmSwapAddressRangeProtocolGuid | gEfiMdeModulePkgTokenSpaceGuid.PcdFullFtwServiceEnable ## SOMETIMES_CONSUMES + ## NOTIFY + ## CONSUMES + gEfiSmmFirmwareVolumeBlockProtocolGuid + ## PRODUCES + ## UNDEFINED # SmiHandlerRegister + gEfiSmmFaultTolerantWriteProtocolGuid + gEfiMmEndOfDxeProtocolGuid ## CONSUMES + +[FeaturePcd] + gEfiMdeModulePkgTokenSpaceGuid.PcdFullFtwServiceEnable ## CONSUMES + +[Pcd] + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase ## SOMETIMES_CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase64 ## CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize ## CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase ## SOMETIMES_CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase64 ## CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize ## CONSUMES + +[Depex] + TRUE + From patchwork Thu Jan 3 18:28:24 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ard Biesheuvel X-Patchwork-Id: 154741 Delivered-To: patch@linaro.org Received: by 2002:a2e:299d:0:0:0:0:0 with SMTP id p29-v6csp950510ljp; Thu, 3 Jan 2019 10:29:11 -0800 (PST) X-Google-Smtp-Source: AFSGD/Vc9Le4NwMDUKKMW/CpbzxpP9FlNcrJMvrWTCrkswrAQrK2+b3lY6AJScRsLXTG0GaDo22E X-Received: by 2002:a81:5d5:: with SMTP id 204mr50519824ywf.338.1546540151532; Thu, 03 Jan 2019 10:29:11 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1546540151; cv=none; d=google.com; s=arc-20160816; b=XctcQt4Hrr2u86jCrNT8/i73t7/2IID3NGlkk41dIvKwQdJjSYJpo+uxXxGim1NlKT BgfXZj6ZrH8k8ydD+UpOIJIERpIbK0X7sZgN1TtYcVzFhbR28ESXIsDvCfmxHYK3MkrV HL711fcEDIK5qzBPx223zdehlAO2DbmAbuodESA4XA6kWYlDW6iDjwBp1Uy+d9jmDbpo qDTOOz80vnhdySy0pE39HTW3HoYOYuYGaSmV9I6/nXOEHQ6w2B6+g+OgfkBUaewTjx1e sFZEC/hgbrU20zIol0ARW7o5Zcy5UhEGj28qg0fgUot9pDkcnTwLKYN2+bdBLr3jwyy5 INiw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to; bh=zxYbYApLzLt7X5QfSO3lMbjEyfAlJ57mzbd6B8sApQA=; b=fnhhiEMvxxnniyYE+QaI+o7c0XgaRCmW/0PEYgR0dWcKAI5x+rzXv7DUHG+5s8fYi5 a2yM/UwQQX/Z9VZ//zpZgn2QfTGqEtCM0aAAHlEMW1fEGn18vBO86x5eDoiQi/GzTn4O oP02m6GyeANvYOjHRZcxGMaXtWSWocgrVwZrNG4CWIpR/uKUfB7jTKC/eDK1/NuFCOqs aorn2CkM/Iry80nEw9JbIlUZtvNFhz5WN5d23PyWBB+/ATxYIvlnOfgsjqL89Z9WEwb2 Sxpc1HWELQPS0HI07LZfTbKzzcbCcBQ5UDkhn9R6UrtLa6dZTpjI37srFmZcQWBAdk0p IQMw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b="WM/LpLA/"; spf=pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 2001:19d0:306:5::1 as permitted sender) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from ml01.01.org (ml01.01.org. [2001:19d0:306:5::1]) by mx.google.com with ESMTPS id y8si34400334ywc.47.2019.01.03.10.29.11 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 03 Jan 2019 10:29:11 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 2001:19d0:306:5::1 as permitted sender) client-ip=2001:19d0:306:5::1; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b="WM/LpLA/"; spf=pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 2001:19d0:306:5::1 as permitted sender) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id BA912211ADA3B; Thu, 3 Jan 2019 10:29:01 -0800 (PST) X-Original-To: edk2-devel@lists.01.org Delivered-To: edk2-devel@lists.01.org Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=2a00:1450:4864:20::541; helo=mail-ed1-x541.google.com; envelope-from=ard.biesheuvel@linaro.org; receiver=edk2-devel@lists.01.org Received: from mail-ed1-x541.google.com (mail-ed1-x541.google.com [IPv6:2a00:1450:4864:20::541]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 42CD6211ADA3E for ; Thu, 3 Jan 2019 10:28:59 -0800 (PST) Received: by mail-ed1-x541.google.com with SMTP id b3so29889665ede.1 for ; Thu, 03 Jan 2019 10:28:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=l3/VRTimsaL2BfE+nBoFQehRm1ScfNEDSrZYikx9QrM=; b=WM/LpLA/EY2LoJWnAW01TrgnByRgtYfQRnFmvxHqJgE5GmyT801joaP/qfrwAePD/8 8cEO+P4pd/9qD9ATGfZG5En49EdVLEYR22db7IDKNyy+jzyD9V4EjYKpdrHLkuEoPrQg ZXJUH7G4d8A+PBZtic48cUftpvF5c1NZdnLvQ= 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; bh=l3/VRTimsaL2BfE+nBoFQehRm1ScfNEDSrZYikx9QrM=; b=d9oTgxTGtXYfYYXVSpGFvqyWb3Yp//Q1GReWFerHG90dvTeRlhPlcj4lIX8vNVX93b iNC2Ybpjm/ovc/d8b15SuFVYZbI4AGm4hZl4bwaRoQ/BjMqo6ISV2r8UpWHM4GB1sCnC 5niHld2/vuZCwYsBNnuckaUNSWaxM10E1mpWzPvhroU309LSns3MFmdM3DOUx1LhmGvX PSalbgWNyg9Pv1zQgn2mNSXlbHtxn5YjbZEtvZSjkvBl5UHLdTIUBoL1rDek9JZqm1BB kejEBrYIpWc3vW5KI16xabGBAr8NV7Adm4KC1LTHnpeuGIIr54SRLbPxEF/9edlfa8l3 f+Ow== X-Gm-Message-State: AA+aEWaEXGqnZjbS/wyQpt8KhXRKlnYtfgA7Do9EEf189h6ISZizhnM9 19LCM+/82IG2Zl7eynV9dKJMjJLXLFrVvA== X-Received: by 2002:a17:906:288d:: with SMTP id o13-v6mr35985853ejd.53.1546540137430; Thu, 03 Jan 2019 10:28:57 -0800 (PST) Received: from dogfood.home ([2a01:cb1d:112:6f00:704e:c241:dc88:597d]) by smtp.gmail.com with ESMTPSA id a11sm25707206edc.28.2019.01.03.10.28.55 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 03 Jan 2019 10:28:56 -0800 (PST) From: Ard Biesheuvel To: edk2-devel@lists.01.org Date: Thu, 3 Jan 2019 19:28:24 +0100 Message-Id: <20190103182825.32231-7-ard.biesheuvel@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190103182825.32231-1-ard.biesheuvel@linaro.org> References: <20190103182825.32231-1-ard.biesheuvel@linaro.org> Subject: [edk2] [PATCH 5/6] MdeModulePkg/VariableRuntimeDxe: factor out boot service accesses X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Hao Wu , Liming Gao , Michael D Kinney , Laszlo Ersek MIME-Version: 1.0 Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" In preparation of providing a standalone MM based variable runtime driver, move the existing SMM driver to the new MM services table, and factor out some pieces that are specific to the traditional driver, mainly related to the use of UEFI boot services, which are not accessible to standalone MM drivers. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ard Biesheuvel --- MdeModulePkg/Universal/Variable/RuntimeDxe/TcgMorLockSmm.c | 18 +--- MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.h | 50 +++++++++ MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.c | 59 ++++------ MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf | 5 +- MdeModulePkg/Universal/Variable/RuntimeDxe/VariableTraditionalMm.c | 114 ++++++++++++++++++++ 5 files changed, 187 insertions(+), 59 deletions(-) -- 2.17.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel diff --git a/MdeModulePkg/Universal/Variable/RuntimeDxe/TcgMorLockSmm.c b/MdeModulePkg/Universal/Variable/RuntimeDxe/TcgMorLockSmm.c index 28aa2893c6f8..009d96c3a65e 100644 --- a/MdeModulePkg/Universal/Variable/RuntimeDxe/TcgMorLockSmm.c +++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/TcgMorLockSmm.c @@ -21,7 +21,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include #include #include -#include #include "Variable.h" typedef struct { @@ -419,8 +418,6 @@ MorLockInitAtEndOfDxe ( { UINTN MorSize; EFI_STATUS MorStatus; - EFI_STATUS TcgStatus; - VOID *TcgInterface; if (!mMorLockInitializationRequired) { // @@ -458,20 +455,7 @@ MorLockInitAtEndOfDxe ( // can be deduced from the absence of the TCG / TCG2 protocols, as edk2's // MOR implementation depends on (one of) those protocols. // - TcgStatus = gBS->LocateProtocol ( - &gEfiTcg2ProtocolGuid, - NULL, // Registration - &TcgInterface - ); - if (EFI_ERROR (TcgStatus)) { - TcgStatus = gBS->LocateProtocol ( - &gEfiTcgProtocolGuid, - NULL, // Registration - &TcgInterface - ); - } - - if (!EFI_ERROR (TcgStatus)) { + if (VariableHaveTcgProtocols ()) { // // The MOR variable originates from the platform firmware; set the MOR // Control Lock variable to report the locking capability to the OS. diff --git a/MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.h b/MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.h index 938eb5de61fa..11822575ac4d 100644 --- a/MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.h +++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.h @@ -924,4 +924,54 @@ VariableExLibAtRuntime ( VOID ); +/** + Notify the system that the SMM variable driver is ready +**/ +VOID +VariableNotifySmmReady ( + VOID + ); + +/** + Notify the system that the SMM variable write driver is ready +**/ +VOID +VariableNotifySmmWriteReady ( + VOID + ); + +/** + Variable service MM driver entry point +**/ +EFI_STATUS +EFIAPI +MmVariableServiceInitialize ( + VOID + ); + +/** + This function check if the buffer is valid per processor architecture and not overlap with SMRAM. + + @param Buffer The buffer start address to be checked. + @param Length The buffer length to be checked. + + @retval TRUE This buffer is valid per processor architecture and not overlap with SMRAM. + @retval FALSE This buffer is not valid per processor architecture or overlap with SMRAM. +**/ +BOOLEAN +VariableSmmIsBufferOutsideSmmValid ( + IN EFI_PHYSICAL_ADDRESS Buffer, + IN UINT64 Length + ); + +/** + Whether the TCG or TCG2 protocols are installed in the UEFI protocol database. + This information is used by the MorLock code to infer whether an existing + MOR variable is legitimate or not. +**/ +BOOLEAN +VariableHaveTcgProtocols ( + VOID + ); + #endif diff --git a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.c b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.c index 8c53f84ff6e8..7245587052df 100644 --- a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.c +++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.c @@ -15,6 +15,7 @@ SmmVariableGetStatistics() should also do validation based on its own knowledge. Copyright (c) 2010 - 2016, Intel Corporation. All rights reserved.
+Copyright (c) 2018, Linaro, Ltd. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at @@ -28,18 +29,15 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include #include #include -#include +#include #include -#include -#include +#include #include #include "Variable.h" extern VARIABLE_INFO_ENTRY *gVariableInfo; -EFI_HANDLE mSmmVariableHandle = NULL; -EFI_HANDLE mVariableHandle = NULL; BOOLEAN mAtRuntime = FALSE; UINT8 *mVariableBufferPayload = NULL; UINTN mVariableBufferPayloadSize; @@ -218,7 +216,7 @@ GetFtwProtocol ( // // Locate Smm Fault Tolerent Write protocol // - Status = gSmst->SmmLocateProtocol ( + Status = gMmst->MmLocateProtocol ( &gEfiSmmFaultTolerantWriteProtocolGuid, NULL, FtwProtocol @@ -248,7 +246,7 @@ GetFvbByHandle ( // // To get the SMM FVB protocol interface on the handle // - return gSmst->SmmHandleProtocol ( + return gMmst->MmHandleProtocol ( FvBlockHandle, &gEfiSmmFirmwareVolumeBlockProtocolGuid, (VOID **) FvBlock @@ -287,7 +285,7 @@ GetFvbCountAndBuffer ( BufferSize = 0; *NumberHandles = 0; *Buffer = NULL; - Status = gSmst->SmmLocateHandle ( + Status = gMmst->MmLocateHandle ( ByProtocol, &gEfiSmmFirmwareVolumeBlockProtocolGuid, NULL, @@ -303,7 +301,7 @@ GetFvbCountAndBuffer ( return EFI_OUT_OF_RESOURCES; } - Status = gSmst->SmmLocateHandle ( + Status = gMmst->MmLocateHandle ( ByProtocol, &gEfiSmmFirmwareVolumeBlockProtocolGuid, NULL, @@ -500,7 +498,7 @@ SmmVariableHandler ( return EFI_SUCCESS; } - if (!SmmIsBufferOutsideSmmValid ((UINTN)CommBuffer, TempCommBufferSize)) { + if (!VariableSmmIsBufferOutsideSmmValid ((UINTN)CommBuffer, TempCommBufferSize)) { DEBUG ((EFI_D_ERROR, "SmmVariableHandler: SMM communication buffer in SMRAM or overflow!\n")); return EFI_SUCCESS; } @@ -911,13 +909,7 @@ SmmFtwNotificationEvent ( // // Notify the variable wrapper driver the variable write service is ready // - Status = gBS->InstallProtocolInterface ( - &mSmmVariableHandle, - &gSmmVariableWriteGuid, - EFI_NATIVE_INTERFACE, - NULL - ); - ASSERT_EFI_ERROR (Status); + VariableNotifySmmWriteReady (); return EFI_SUCCESS; } @@ -928,18 +920,11 @@ SmmFtwNotificationEvent ( runtime services in the EFI System Table and installs arch protocols for variable read and write services being available. It also registers a notification function for an EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE event. - - @param[in] ImageHandle The firmware allocated handle for the EFI image. - @param[in] SystemTable A pointer to the EFI System Table. - - @retval EFI_SUCCESS Variable service successfully initialized. - **/ EFI_STATUS EFIAPI -VariableServiceInitialize ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable +MmVariableServiceInitialize ( + VOID ) { EFI_STATUS Status; @@ -957,7 +942,7 @@ VariableServiceInitialize ( // Install the Smm Variable Protocol on a new handle. // VariableHandle = NULL; - Status = gSmst->SmmInstallProtocolInterface ( + Status = gMmst->MmInstallProtocolInterface ( &VariableHandle, &gEfiSmmVariableProtocolGuid, EFI_NATIVE_INTERFACE, @@ -965,7 +950,7 @@ VariableServiceInitialize ( ); ASSERT_EFI_ERROR (Status); - Status = gSmst->SmmInstallProtocolInterface ( + Status = gMmst->MmInstallProtocolInterface ( &VariableHandle, &gEdkiiSmmVarCheckProtocolGuid, EFI_NATIVE_INTERFACE, @@ -976,7 +961,7 @@ VariableServiceInitialize ( mVariableBufferPayloadSize = GetMaxVariableSize () + OFFSET_OF (SMM_VARIABLE_COMMUNICATE_VAR_CHECK_VARIABLE_PROPERTY, Name) - GetVariableHeaderSize (); - Status = gSmst->SmmAllocatePool ( + Status = gMmst->MmAllocatePool ( EfiRuntimeServicesData, mVariableBufferPayloadSize, (VOID **)&mVariableBufferPayload @@ -987,25 +972,19 @@ VariableServiceInitialize ( /// Register SMM variable SMI handler /// VariableHandle = NULL; - Status = gSmst->SmiHandlerRegister (SmmVariableHandler, &gEfiSmmVariableProtocolGuid, &VariableHandle); + Status = gMmst->MmiHandlerRegister (SmmVariableHandler, &gEfiSmmVariableProtocolGuid, &VariableHandle); ASSERT_EFI_ERROR (Status); // // Notify the variable wrapper driver the variable service is ready // - Status = SystemTable->BootServices->InstallProtocolInterface ( - &mVariableHandle, - &gEfiSmmVariableProtocolGuid, - EFI_NATIVE_INTERFACE, - &gSmmVariable - ); - ASSERT_EFI_ERROR (Status); + VariableNotifySmmReady (); // // Register EFI_SMM_END_OF_DXE_PROTOCOL_GUID notify function. // - Status = gSmst->SmmRegisterProtocolNotify ( - &gEfiSmmEndOfDxeProtocolGuid, + Status = gMmst->MmRegisterProtocolNotify ( + &gEfiMmEndOfDxeProtocolGuid, SmmEndOfDxeCallback, &SmmEndOfDxeRegistration ); @@ -1014,7 +993,7 @@ VariableServiceInitialize ( // // Register FtwNotificationEvent () notify function. // - Status = gSmst->SmmRegisterProtocolNotify ( + Status = gMmst->MmRegisterProtocolNotify ( &gEfiSmmFaultTolerantWriteProtocolGuid, SmmFtwNotificationEvent, &SmmFtwRegistration diff --git a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf index db7d220e06df..ed7392cbcffc 100644 --- a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf +++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf @@ -48,6 +48,7 @@ [Defines] [Sources] Reclaim.c Variable.c + VariableTraditionalMm.c VariableSmm.c VarCheck.c Variable.h @@ -66,7 +67,7 @@ [LibraryClasses] BaseLib SynchronizationLib UefiLib - SmmServicesTableLib + MmServicesTableLib BaseMemoryLib DebugLib DxeServicesTableLib @@ -85,7 +86,7 @@ [Protocols] ## PRODUCES ## UNDEFINED # SmiHandlerRegister gEfiSmmVariableProtocolGuid - gEfiSmmEndOfDxeProtocolGuid ## NOTIFY + gEfiMmEndOfDxeProtocolGuid ## NOTIFY gEdkiiSmmVarCheckProtocolGuid ## PRODUCES gEfiTcgProtocolGuid ## SOMETIMES_CONSUMES gEfiTcg2ProtocolGuid ## SOMETIMES_CONSUMES diff --git a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableTraditionalMm.c b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableTraditionalMm.c new file mode 100644 index 000000000000..2143d3337e87 --- /dev/null +++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableTraditionalMm.c @@ -0,0 +1,114 @@ +/** @file + + Parts of the SMM/MM implementation that are specific to traditional MM + +Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.
+Copyright (c) 2018, Linaro, Ltd. All rights reserved.
+This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#include +#include +#include "Variable.h" + +BOOLEAN +VariableSmmIsBufferOutsideSmmValid ( + IN EFI_PHYSICAL_ADDRESS Buffer, + IN UINT64 Length + ) +{ + if (!SmmIsBufferOutsideSmmValid (Buffer, Length)) { + DEBUG ((EFI_D_ERROR, "SmmVariableHandler: SMM communication buffer in SMRAM or overflow!\n")); + return FALSE; + } + return TRUE; +} + +/** + Notify the system that the SMM variable driver is ready +**/ +VOID +VariableNotifySmmReady ( + VOID + ) +{ + EFI_STATUS Status; + EFI_HANDLE Handle; + + Handle = NULL; + Status = gBS->InstallProtocolInterface ( + &Handle, + &gEfiSmmVariableProtocolGuid, + EFI_NATIVE_INTERFACE, + NULL + ); + ASSERT_EFI_ERROR (Status); +} + +/** + Notify the system that the SMM variable write driver is ready +**/ +VOID +VariableNotifySmmWriteReady ( + VOID + ) +{ + EFI_STATUS Status; + EFI_HANDLE Handle; + + Handle = NULL; + Status = gBS->InstallProtocolInterface ( + &Handle, + &gSmmVariableWriteGuid, + EFI_NATIVE_INTERFACE, + NULL + ); + ASSERT_EFI_ERROR (Status); +} + +EFI_STATUS +EFIAPI +VariableServiceInitialize ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return MmVariableServiceInitialize (); +} + +/** + Whether the TCG or TCG2 protocols are installed in the UEFI protocol database. + This information is used by the MorLock code to infer whether an existing + MOR variable is legitimate or not. +**/ +BOOLEAN +VariableHaveTcgProtocols ( + VOID + ) +{ + EFI_STATUS Status; + VOID *Interface; + + Status = gBS->LocateProtocol ( + &gEfiTcg2ProtocolGuid, + NULL, // Registration + &Interface + ); + if (!EFI_ERROR (Status)) { + return TRUE; + } + + Status = gBS->LocateProtocol ( + &gEfiTcgProtocolGuid, + NULL, // Registration + &Interface + ); + return !EFI_ERROR (Status); +} From patchwork Thu Jan 3 18:28:25 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ard Biesheuvel X-Patchwork-Id: 154742 Delivered-To: patch@linaro.org Received: by 2002:a2e:299d:0:0:0:0:0 with SMTP id p29-v6csp950581ljp; Thu, 3 Jan 2019 10:29:15 -0800 (PST) X-Google-Smtp-Source: ALg8bN6o8ub6QqiZDaVlHL7a3gduYpkrpZW0+lkMQCCuUYRchu3qKaTGUJodX4JQm3lamc39t8bW X-Received: by 2002:a25:ac2:: with SMTP id 185mr39355496ybk.349.1546540155029; Thu, 03 Jan 2019 10:29:15 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1546540155; cv=none; d=google.com; s=arc-20160816; b=eSw2anexEvK2smqibPdJSUBCjX81ks6rG5ibnMocAH5mUGUpYytXmQ3WajpTRfViQV eJaX1myOapc/Lo1aaWHs3SKVyaolxgLleGyjDFQGSFxcXcew6dny/9r8GUt7zordKWbA ptj3WceVnpHo6d73qVit9gDGN6/qyobZQ1UpNp7ZCWNo7l4NdHNhGCDST2r2/0fDVBGb RmIeRHfIa+1njipaU5RtPHsHsXg6fQlFwH22ju28tF8h4rsjzopyvx7+6mfIp0WLHeVw u1g545VqouEF3/DiW0vIpOhhF4OzWsuk7ZrPUpOLIM0Wc7XUc0nAPT7NF5sXoc8O9Irm pBBw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to; bh=kcT4zxVOWuS82AAj5v8f4PLuCkbDZTM/Y6KhyWgwzME=; b=OMWks9/b//ZR1JMPdnz5O1CRynWcD5uwiVpXnwrJIhgOgPBRRe6GXHPqKjQCit/wLc LNyt0d15URY68FNqa4IM1ZkNglLzE8ftz7p2/9v0km22JwAk1DiJdqJeV42u/VRSat/T 3lkoqSJjVqFFFaFcG91zO0hnWannDcoiQ9oxWkFR68kEAzat7KWFubrqt1MmtnCzp8xt VQTGig2VidiA8tB29XohBrPgZSRcayt6Wjyxphv9SQe7WEFdKg6IyMt4zSb9UKpoKmjl jbZoFD6DPUngGANlXb6niJCLYfRwBV+n7hWiBSRRaOq5WpkdRotNTGXOMADG9yneii7g 7Scw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=GLKsLG2j; spf=pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 2001:19d0:306:5::1 as permitted sender) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from ml01.01.org (ml01.01.org. [2001:19d0:306:5::1]) by mx.google.com with ESMTPS id v130-v6si33160832yba.86.2019.01.03.10.29.14 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 03 Jan 2019 10:29:15 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 2001:19d0:306:5::1 as permitted sender) client-ip=2001:19d0:306:5::1; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=GLKsLG2j; spf=pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 2001:19d0:306:5::1 as permitted sender) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id EA715211ADA51; Thu, 3 Jan 2019 10:29:01 -0800 (PST) X-Original-To: edk2-devel@lists.01.org Delivered-To: edk2-devel@lists.01.org Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=2a00:1450:4864:20::542; helo=mail-ed1-x542.google.com; envelope-from=ard.biesheuvel@linaro.org; receiver=edk2-devel@lists.01.org Received: from mail-ed1-x542.google.com (mail-ed1-x542.google.com [IPv6:2a00:1450:4864:20::542]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id BDB712119FF5E for ; Thu, 3 Jan 2019 10:29:00 -0800 (PST) Received: by mail-ed1-x542.google.com with SMTP id y20so29766679edw.9 for ; Thu, 03 Jan 2019 10:29:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=R4ya6wR45kIuELixQwkVRO8ITaklcisKhfXoMMHeVyM=; b=GLKsLG2jG2KB38TwmLz93zcLL+nL7NqX8vAzP7176RVSQBeccukqeI47i9QKd56Z4j sBPsxxvf8Ez5UWPADsbPyE/wU7P1uSgu70SdZ5qExeyJpse2LHTWy13L83+esJSbHfgb a8JvbQvVauMAi+2UfhrciZZDFl9Diiah/+nJU= 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; bh=R4ya6wR45kIuELixQwkVRO8ITaklcisKhfXoMMHeVyM=; b=s8e+nkTwkVqSXHX3RFrAAYSKZ52D+Z+A6xzIAwxXYt0WLs+cNXWB90xL4z8h3KHYUg S8Ol3nKatviC55W6Ig1aPBFJMQ0G6nw+UNhmcOt5DJnhwScMMXFQ7vx7KHiOo2WahSGI mMwrHF2Fdr+wFmv3zneKWiMuhc7hzXl3A++YwC33chWjjEm92V8x77eitGV+uRgFJSHL yzmKgwRNuGjQrUKP53LbwyIj3aaBhNhN1eCdupH1R4yCGu0tPrIj0TvtKesrj8cuTKHn y4yltlh0w1A+/406jhRQX/Eb9gPfw+NcT47FM9LPosR846H4u1fhfNY8pMjOhoIwSiRn 2tNg== X-Gm-Message-State: AJcUukcDEbqVG783k5fk4QZ843A8btaC7kDAGc3phlkUmtQwSh3cgD4R eOJVw8Yn3NBdl6t5u34XA8Lla4WfRgDnng== X-Received: by 2002:a17:906:3f55:: with SMTP id f21-v6mr12512189ejj.120.1546540139049; Thu, 03 Jan 2019 10:28:59 -0800 (PST) Received: from dogfood.home ([2a01:cb1d:112:6f00:704e:c241:dc88:597d]) by smtp.gmail.com with ESMTPSA id a11sm25707206edc.28.2019.01.03.10.28.57 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 03 Jan 2019 10:28:58 -0800 (PST) From: Ard Biesheuvel To: edk2-devel@lists.01.org Date: Thu, 3 Jan 2019 19:28:25 +0100 Message-Id: <20190103182825.32231-8-ard.biesheuvel@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190103182825.32231-1-ard.biesheuvel@linaro.org> References: <20190103182825.32231-1-ard.biesheuvel@linaro.org> Subject: [edk2] [PATCH 6/6] MdeModulePkg/VariableRuntimeDxe: implement standalone MM version X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Hao Wu , Liming Gao , Michael D Kinney , Laszlo Ersek MIME-Version: 1.0 Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" Reuse most of the existing code to implement a variable runtime driver that will be able to execute in the context of standalone MM. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ard Biesheuvel --- MdeModulePkg/Universal/Variable/RuntimeDxe/VariableStandaloneMm.c | 69 ++++++++++ MdeModulePkg/Universal/Variable/RuntimeDxe/VariableStandaloneMm.inf | 135 ++++++++++++++++++++ 2 files changed, 204 insertions(+) -- 2.17.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel Reviewed-by: Jian J Wang Reviewed-by: Jian J Wang diff --git a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableStandaloneMm.c b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableStandaloneMm.c new file mode 100644 index 000000000000..fbc99467c057 --- /dev/null +++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableStandaloneMm.c @@ -0,0 +1,69 @@ +/** @file + + Parts of the SMM/MM implementation that are specific to standalone MM + +Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.
+Copyright (c) 2018, Linaro, Ltd. All rights reserved.
+This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#include "Variable.h" + +BOOLEAN +VariableSmmIsBufferOutsideSmmValid ( + IN EFI_PHYSICAL_ADDRESS Buffer, + IN UINT64 Length + ) +{ + return TRUE; +} + +/** + Notify the system that the SMM variable driver is ready +**/ +VOID +VariableNotifySmmReady ( + VOID + ) +{ +} + +/** + Notify the system that the SMM variable write driver is ready +**/ +VOID +VariableNotifySmmWriteReady ( + VOID + ) +{ +} + +EFI_STATUS +EFIAPI +VariableServiceInitialize ( + IN EFI_HANDLE ImageHandle, + IN EFI_MM_SYSTEM_TABLE *MmSystemTable + ) +{ + return MmVariableServiceInitialize (); +} + +/** + Whether the TCG or TCG2 protocols are installed in the UEFI protocol database. + This information is used by the MorLock code to infer whether an existing + MOR variable is legitimate or not. +**/ +BOOLEAN +VariableHaveTcgProtocols ( + VOID + ) +{ + return FALSE; +} diff --git a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableStandaloneMm.inf b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableStandaloneMm.inf new file mode 100644 index 000000000000..54d647af914c --- /dev/null +++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableStandaloneMm.inf @@ -0,0 +1,135 @@ +## @file +# Provides SMM variable service. +# +# This module installs SMM variable protocol into SMM protocol database, +# which can be used by SMM driver, and installs SMM variable protocol +# into BS protocol database, which can be used to notify the SMM Runtime +# Dxe driver that the SMM variable service is ready. +# This module should be used with SMM Runtime DXE module together. The +# SMM Runtime DXE module would install variable arch protocol and variable +# write arch protocol based on SMM variable module. +# +# Caution: This module requires additional review when modified. +# This driver will have external input - variable data and communicate buffer in SMM mode. +# This external input must be validated carefully to avoid security issues such as +# buffer overflow or integer overflow. +# The whole SMM authentication variable design relies on the integrity of flash part and SMM. +# which is assumed to be protected by platform. All variable code and metadata in flash/SMM Memory +# may not be modified without authorization. If platform fails to protect these resources, +# the authentication service provided in this driver will be broken, and the behavior is undefined. +# +# Copyright (c) 2010 - 2016, Intel Corporation. All rights reserved.
+# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +## + +[Defines] + INF_VERSION = 0x0001001A + BASE_NAME = VariableStandaloneMm + FILE_GUID = 7ee2c0c1-c21a-4113-a53a-66824a95696f + MODULE_TYPE = MM_STANDALONE + VERSION_STRING = 1.0 + PI_SPECIFICATION_VERSION = 0x00010032 + ENTRY_POINT = VariableServiceInitialize + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = AARCH64 +# + + +[Sources] + Reclaim.c + Variable.c + VariableSmm.c + VariableStandaloneMm.c + VarCheck.c + Variable.h + PrivilegePolymorphic.h + VariableExLib.c + TcgMorLockSmm.c + SpeculationBarrierSmm.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + StandaloneMmPkg/StandaloneMmPkg.dec + +[LibraryClasses] + AuthVariableLib + BaseLib + BaseMemoryLib + DebugLib + HobLib + MemoryAllocationLib + MmServicesTableLib + StandaloneMmDriverEntryPoint + SynchronizationLib + VarCheckLib + +[Protocols] + gEfiSmmFirmwareVolumeBlockProtocolGuid ## CONSUMES + ## CONSUMES + ## NOTIFY + gEfiSmmFaultTolerantWriteProtocolGuid + ## PRODUCES + ## UNDEFINED # SmiHandlerRegister + gEfiSmmVariableProtocolGuid + gEfiMmEndOfDxeProtocolGuid ## NOTIFY + gEdkiiSmmVarCheckProtocolGuid ## PRODUCES + +[Guids] + ## SOMETIMES_CONSUMES ## GUID # Signature of Variable store header + ## SOMETIMES_PRODUCES ## GUID # Signature of Variable store header + ## SOMETIMES_CONSUMES ## HOB + ## SOMETIMES_PRODUCES ## SystemTable + gEfiAuthenticatedVariableGuid + + ## SOMETIMES_CONSUMES ## GUID # Signature of Variable store header + ## SOMETIMES_PRODUCES ## GUID # Signature of Variable store header + ## SOMETIMES_CONSUMES ## HOB + ## SOMETIMES_PRODUCES ## SystemTable + gEfiVariableGuid + + ## SOMETIMES_CONSUMES ## Variable:L"PlatformLang" + ## SOMETIMES_PRODUCES ## Variable:L"PlatformLang" + ## SOMETIMES_CONSUMES ## Variable:L"Lang" + ## SOMETIMES_PRODUCES ## Variable:L"Lang" + gEfiGlobalVariableGuid + + gEfiMemoryOverwriteControlDataGuid ## SOMETIMES_CONSUMES ## Variable:L"MemoryOverwriteRequestControl" + gEfiMemoryOverwriteRequestControlLockGuid ## SOMETIMES_PRODUCES ## Variable:L"MemoryOverwriteRequestControlLock" + + gEfiSystemNvDataFvGuid ## CONSUMES ## GUID + gEdkiiFaultTolerantWriteGuid ## SOMETIMES_CONSUMES ## HOB + + ## SOMETIMES_CONSUMES ## Variable:L"VarErrorFlag" + ## SOMETIMES_PRODUCES ## Variable:L"VarErrorFlag" + gEdkiiVarErrorFlagGuid + +[FixedPcd] + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize ## CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase ## SOMETIMES_CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64 ## CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVariableSize ## CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdMaxAuthVariableSize ## CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVolatileVariableSize ## CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdMaxHardwareErrorVariableSize ## CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdVariableStoreSize ## CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdHwErrStorageSize ## CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdMaxUserNvVariableSpaceSize ## CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdBoottimeReservedNvVariableSpaceSize ## CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdReclaimVariableSpaceAtEndOfDxe ## CONSUMES + +[FeaturePcd] + gEfiMdeModulePkgTokenSpaceGuid.PcdVariableCollectStatistics ## CONSUMES # statistic the information of variable. + gEfiMdePkgTokenSpaceGuid.PcdUefiVariableDefaultLangDeprecate ## CONSUMES # Auto update PlatformLang/Lang + +[Depex] + TRUE