From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pg1-f173.google.com (mail-pg1-f173.google.com [209.85.215.173]) by mx.groups.io with SMTP id smtpd.web11.35841.1608531361900059489 for ; Sun, 20 Dec 2020 22:16:02 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@linaro.org header.s=google header.b=qYKf24+3; spf=pass (domain: linaro.org, ip: 209.85.215.173, mailfrom: masahisa.kojima@linaro.org) Received: by mail-pg1-f173.google.com with SMTP id n7so5750183pgg.2 for ; Sun, 20 Dec 2020 22:16:01 -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:mime-version :content-transfer-encoding; bh=zzWMyTNVtsBDBPTAc7FywjK5/DM5Y40ftJPPI/1CKCc=; b=qYKf24+3TqCUw6xI4d7FxKD6a7dohgYEi/TlYgIBmKP/R1RyCFUD1jhEJS33R8uLxV aNUkB0F4iCEQiMgbWFvqmnNt2MfDP0rfJ/J29UYDb0swx5GvMjrbMewMgKMcewGJbDHf M9g1SdP1K5s69o7JG4TugnJX8i/k/jIzfcdcVDgfASaFkLZ4OHHUW/ACh/aax6fTqEKr 1wuQlqk77vxVs8uUCSC/VA9H/JPW9bHTqVxA+19O9IAT2a0VZiuSyzRlUT3bTQxjRT+T 8IvKLGV62RW668Sd3ekf7z/706/SjpiJTl5cNzvZJzQsyvpizJbuyXh3ZvTiYUgNXoTd L35g== 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:mime-version :content-transfer-encoding; bh=zzWMyTNVtsBDBPTAc7FywjK5/DM5Y40ftJPPI/1CKCc=; b=faBwhBKc8ezzz9dqNzXwNbxqpn3XByj1KSB08Ns/tT8tcozIU604u7nYpZDi6hLdOB 1C6DaZxasRJVTfmmP2eOG6JjmCaR4RXzKyiuw4zwx2D5bOqZpX0Kpdygm9BEgh2MgOmL YSMeFVDYv9Q5LZBD0PCqov7uybt5zXVfSEHZDliZlx5/WvOjt/Vyyn09ZV+DC1U83h8s slFxazb3t2viiqaxu1qQ5BoKU2GbNLSjkhu58En2BMSAPdhzn/o8HwtCcd1LtvEwZJpq FnUOh1y82+h0d1mxHbltsw34mvwDGa3Rf1k2XvkWkG1bcEZvl7i4wDvKljdkU0OUL7xe dp5w== X-Gm-Message-State: AOAM532tvyD5h628LmgZhrqlrkYdpfQz9dC5ixHDVScelz1sQcJEEBwa 7W6UpAEBzCxASmu7oqkwd741vcwC//f41w== X-Google-Smtp-Source: ABdhPJwrnwvCHvMKGwLpBfsMH61i0V27oDYQ9LHFtZ7kUD/pWdPHnO7sY2IWU2Tm4j8q7dzuUneW7Q== X-Received: by 2002:a63:643:: with SMTP id 64mr13960193pgg.422.1608531361047; Sun, 20 Dec 2020 22:16:01 -0800 (PST) Return-Path: Received: from localhost ([121.95.100.191]) by smtp.gmail.com with ESMTPSA id t19sm15821546pgk.86.2020.12.20.22.15.59 (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Sun, 20 Dec 2020 22:16:00 -0800 (PST) From: "Masahisa Kojima" To: devel@edk2.groups.io Cc: Masahisa Kojima , Jian J Wang , Hao A Wu , Liming Gao , Ard Biesheuvel , Sami Mujawar , Jiewen Yao , Supreeth Venkatesh , Bret Barkelew Subject: [PATCH v2 1/1] MdeModulePkg/VarCheckPolicyLib: implement standalone MM version Date: Mon, 21 Dec 2020 15:17:34 +0900 Message-Id: <20201221061734.18904-1-masahisa.kojima@linaro.org> X-Mailer: git-send-email 2.17.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit This commit adds the VarCheckPolicyLib that will be able to execute in the context of standalone MM. Signed-off-by: Masahisa Kojima Co-authored-by: Kun Qin Cc: Jian J Wang Cc: Hao A Wu Cc: Liming Gao Cc: Ard Biesheuvel Cc: Sami Mujawar Cc: Jiewen Yao Cc: Supreeth Venkatesh Cc: Bret Barkelew --- MdeModulePkg/MdeModulePkg.dsc | 1 + MdeModulePkg/Library/VarCheckPolicyLib/VarCheckPolicyLib.inf | 5 +- MdeModulePkg/Library/VarCheckPolicyLib/{VarCheckPolicyLib.inf => VarCheckPolicyLibStandaloneMm.inf} | 23 +++++---- MdeModulePkg/Library/VarCheckPolicyLib/VarCheckPolicyLib.h | 42 ++++++++++++++++ MdeModulePkg/Library/VarCheckPolicyLib/VarCheckPolicyLib.c | 14 +++--- MdeModulePkg/Library/VarCheckPolicyLib/VarCheckPolicyLibStandaloneMm.c | 50 ++++++++++++++++++++ MdeModulePkg/Library/VarCheckPolicyLib/VarCheckPolicyLibTraditional.c | 50 ++++++++++++++++++++ 7 files changed, 166 insertions(+), 19 deletions(-) diff --git a/MdeModulePkg/MdeModulePkg.dsc b/MdeModulePkg/MdeModulePkg.dsc index 90165ca443bf..6d4e361afd51 100644 --- a/MdeModulePkg/MdeModulePkg.dsc +++ b/MdeModulePkg/MdeModulePkg.dsc @@ -314,6 +314,7 @@ [Components] MdeModulePkg/Library/VariablePolicyLib/VariablePolicyLib.inf MdeModulePkg/Library/VariablePolicyLib/VariablePolicyLibRuntimeDxe.inf MdeModulePkg/Library/VarCheckPolicyLib/VarCheckPolicyLib.inf + MdeModulePkg/Library/VarCheckPolicyLib/VarCheckPolicyLibStandaloneMm.inf MdeModulePkg/Library/VarCheckLib/VarCheckLib.inf MdeModulePkg/Library/VarCheckHiiLib/VarCheckHiiLib.inf MdeModulePkg/Library/VarCheckPcdLib/VarCheckPcdLib.inf diff --git a/MdeModulePkg/Library/VarCheckPolicyLib/VarCheckPolicyLib.inf b/MdeModulePkg/Library/VarCheckPolicyLib/VarCheckPolicyLib.inf index 077bcc8990ca..9af436d25f81 100644 --- a/MdeModulePkg/Library/VarCheckPolicyLib/VarCheckPolicyLib.inf +++ b/MdeModulePkg/Library/VarCheckPolicyLib/VarCheckPolicyLib.inf @@ -13,11 +13,13 @@ [Defines] MODULE_TYPE = DXE_RUNTIME_DRIVER VERSION_STRING = 1.0 LIBRARY_CLASS = NULL|DXE_RUNTIME_DRIVER DXE_SMM_DRIVER - CONSTRUCTOR = VarCheckPolicyLibConstructor + CONSTRUCTOR = VarCheckPolicyLibTraditionalConstructor [Sources] VarCheckPolicyLib.c + VarCheckPolicyLibTraditional.c + VarCheckPolicyLib.h [Packages] @@ -29,7 +31,6 @@ [LibraryClasses] BaseLib DebugLib BaseMemoryLib - DxeServicesLib MemoryAllocationLib VarCheckLib VariablePolicyLib diff --git a/MdeModulePkg/Library/VarCheckPolicyLib/VarCheckPolicyLib.inf b/MdeModulePkg/Library/VarCheckPolicyLib/VarCheckPolicyLibStandaloneMm.inf similarity index 51% copy from MdeModulePkg/Library/VarCheckPolicyLib/VarCheckPolicyLib.inf copy to MdeModulePkg/Library/VarCheckPolicyLib/VarCheckPolicyLibStandaloneMm.inf index 077bcc8990ca..ab427f189a3d 100644 --- a/MdeModulePkg/Library/VarCheckPolicyLib/VarCheckPolicyLib.inf +++ b/MdeModulePkg/Library/VarCheckPolicyLib/VarCheckPolicyLibStandaloneMm.inf @@ -1,35 +1,41 @@ -## @file VarCheckPolicyLib.inf +## @file VarCheckPolicyLibStandaloneMm.inf # This is an instance of a VarCheck lib that leverages the business logic behind # the VariablePolicy code to make its decisions. # -# Copyright (c) Microsoft Corporation. +## +# Copyright (c) Microsoft Corporation. All rights reserved. # SPDX-License-Identifier: BSD-2-Clause-Patent +# ## [Defines] INF_VERSION = 0x00010005 - BASE_NAME = VarCheckPolicyLib - FILE_GUID = 9C28A48F-C884-4B1F-8B95-DEF125448023 - MODULE_TYPE = DXE_RUNTIME_DRIVER + BASE_NAME = VarCheckPolicyLibStandaloneMm + FILE_GUID = 44B09E3D-5EDA-4673-ABCF-C8AE4560C8EC + MODULE_TYPE = MM_STANDALONE + PI_SPECIFICATION_VERSION = 0x00010032 VERSION_STRING = 1.0 - LIBRARY_CLASS = NULL|DXE_RUNTIME_DRIVER DXE_SMM_DRIVER - CONSTRUCTOR = VarCheckPolicyLibConstructor + LIBRARY_CLASS = NULL|MM_STANDALONE + CONSTRUCTOR = VarCheckPolicyLibStandaloneConstructor [Sources] VarCheckPolicyLib.c + VarCheckPolicyLibStandaloneMm.c + VarCheckPolicyLib.h [Packages] MdePkg/MdePkg.dec MdeModulePkg/MdeModulePkg.dec + StandaloneMmPkg/StandaloneMmPkg.dec [LibraryClasses] BaseLib DebugLib BaseMemoryLib - DxeServicesLib + MemLib MemoryAllocationLib VarCheckLib VariablePolicyLib @@ -37,6 +43,5 @@ [LibraryClasses] SafeIntLib MmServicesTableLib - [Guids] gVarCheckPolicyLibMmiHandlerGuid ## CONSUME ## Used to register for MM Communication events. diff --git a/MdeModulePkg/Library/VarCheckPolicyLib/VarCheckPolicyLib.h b/MdeModulePkg/Library/VarCheckPolicyLib/VarCheckPolicyLib.h new file mode 100644 index 000000000000..2226c8a19fec --- /dev/null +++ b/MdeModulePkg/Library/VarCheckPolicyLib/VarCheckPolicyLib.h @@ -0,0 +1,42 @@ +/** @file -- VarCheckPolicyLib.h +This internal header file defines the common interface of constructor for +VarCheckPolicyLib. + +Copyright (c) Microsoft Corporation. All rights reserved. +SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _VAR_CHECK_POLICY_LIB_H_ +#define _VAR_CHECK_POLICY_LIB_H_ + +/** + Common constructor function of VarCheckPolicyLib to register VarCheck handler + and SW MMI handlers. + + @retval EFI_SUCCESS The constructor executed correctly. + +**/ +EFI_STATUS +EFIAPI +VarCheckPolicyLibCommonConstructor ( + VOID + ); + +/** + This function is wrapper function to validate the buffer. + + @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/MMRAM. + @retval FALSE This buffer is not valid per processor architecture or overlap with SMRAM/MMRAM. +**/ +BOOLEAN +EFIAPI +VarCheckPolicyIsBufferOutsideValid ( + IN EFI_PHYSICAL_ADDRESS Buffer, + IN UINT64 Length + ); + +#endif // _VAR_CHECK_POLICY_LIB_H_ diff --git a/MdeModulePkg/Library/VarCheckPolicyLib/VarCheckPolicyLib.c b/MdeModulePkg/Library/VarCheckPolicyLib/VarCheckPolicyLib.c index 257aa9591303..14e1904e96d3 100644 --- a/MdeModulePkg/Library/VarCheckPolicyLib/VarCheckPolicyLib.c +++ b/MdeModulePkg/Library/VarCheckPolicyLib/VarCheckPolicyLib.c @@ -12,7 +12,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include #include -#include #include #include @@ -23,6 +22,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include +#include "VarCheckPolicyLib.h" + //================================================ // As a VarCheck library, we're linked into the VariableServices // and may not be able to call them indirectly. To get around this, @@ -102,7 +103,8 @@ VarCheckPolicyLibMmiHandler ( // Make sure that the buffer does not overlap SMM. // This should be covered by the SmiManage infrastructure, but just to be safe... InternalCommBufferSize = *CommBufferSize; - if (InternalCommBufferSize > VAR_CHECK_POLICY_MM_COMM_BUFFER_SIZE || !SmmIsBufferOutsideSmmValid((UINTN)CommBuffer, (UINT64)InternalCommBufferSize)) { + if (InternalCommBufferSize > VAR_CHECK_POLICY_MM_COMM_BUFFER_SIZE || + !VarCheckPolicyIsBufferOutsideValid((UINTN)CommBuffer, (UINT64)InternalCommBufferSize)) { DEBUG ((DEBUG_ERROR, "%a - Invalid CommBuffer supplied! 0x%016lX[0x%016lX]\n", __FUNCTION__, CommBuffer, InternalCommBufferSize)); return EFI_INVALID_PARAMETER; } @@ -305,17 +307,13 @@ VarCheckPolicyLibMmiHandler ( Constructor function of VarCheckPolicyLib to register VarCheck handler and SW MMI handlers. - @param[in] ImageHandle The firmware allocated handle for the EFI image. - @param[in] SystemTable A pointer to the EFI System Table. - @retval EFI_SUCCESS The constructor executed correctly. **/ EFI_STATUS EFIAPI -VarCheckPolicyLibConstructor ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable +VarCheckPolicyLibCommonConstructor ( + VOID ) { EFI_STATUS Status; diff --git a/MdeModulePkg/Library/VarCheckPolicyLib/VarCheckPolicyLibStandaloneMm.c b/MdeModulePkg/Library/VarCheckPolicyLib/VarCheckPolicyLibStandaloneMm.c new file mode 100644 index 000000000000..b283ced9d4e3 --- /dev/null +++ b/MdeModulePkg/Library/VarCheckPolicyLib/VarCheckPolicyLibStandaloneMm.c @@ -0,0 +1,50 @@ +/** @file -- VarCheckPolicyLibStandaloneMm.c +This is an instance of a VarCheck lib constructor for Standalone MM. + +Copyright (c) Microsoft Corporation. All rights reserved. +SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include + +#include "VarCheckPolicyLib.h" + +/** + Standalone MM constructor function of VarCheckPolicyLib to invoke common + constructor routine. + + @param[in] ImageHandle The firmware allocated handle for the EFI image. + @param[in] SystemTable A pointer to the EFI System Table. + + @retval EFI_SUCCESS The constructor executed correctly. + +**/ +EFI_STATUS +EFIAPI +VarCheckPolicyLibStandaloneConstructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_MM_SYSTEM_TABLE *SystemTable + ) +{ + return VarCheckPolicyLibCommonConstructor (); +} + +/** + This function is wrapper function to validate the buffer. + + @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 architectureand not overlap with MMRAM. + @retval FALSE This buffer is not valid per processor architecture or overlap with MMRAM. +**/ +BOOLEAN +EFIAPI +VarCheckPolicyIsBufferOutsideValid ( + IN EFI_PHYSICAL_ADDRESS Buffer, + IN UINT64 Length + ) +{ + return MmIsBufferOutsideMmValid (Buffer, Length); +} diff --git a/MdeModulePkg/Library/VarCheckPolicyLib/VarCheckPolicyLibTraditional.c b/MdeModulePkg/Library/VarCheckPolicyLib/VarCheckPolicyLibTraditional.c new file mode 100644 index 000000000000..f404aaaa470c --- /dev/null +++ b/MdeModulePkg/Library/VarCheckPolicyLib/VarCheckPolicyLibTraditional.c @@ -0,0 +1,50 @@ +/** @file -- VarCheckPolicyLibTraditional.c +This is an instance of a VarCheck lib constructor for traditional SMM. + +Copyright (c) Microsoft Corporation. All rights reserved. +SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include + +#include "VarCheckPolicyLib.h" + +/** + Traditional constructor function of VarCheckPolicyLib to invoke common + constructor routine. + + @param[in] ImageHandle The firmware allocated handle for the EFI image. + @param[in] SystemTable A pointer to the EFI System Table. + + @retval EFI_SUCCESS The constructor executed correctly. + +**/ +EFI_STATUS +EFIAPI +VarCheckPolicyLibTraditionalConstructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return VarCheckPolicyLibCommonConstructor (); +} + +/** + This function is wrapper function to validate the buffer. + + @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 +EFIAPI +VarCheckPolicyIsBufferOutsideValid ( + IN EFI_PHYSICAL_ADDRESS Buffer, + IN UINT64 Length + ) +{ + return SmmIsBufferOutsideSmmValid (Buffer, Length); +} -- 2.17.1