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;