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); +}