From nobody Fri Dec 19 20:42:14 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+81121+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+81121+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1632611151; cv=none; d=zohomail.com; s=zohoarc; b=VlhKmjqlmdWfoH9BG7eyFfiBwKC5FHLrsiRu8rRL9vKohDoNCmks8XPGxbdhTFe/nalqgEcBzXhV3WPc9QdC2l8Sj4RPx5rvGIGAK3iY6Y0dm23gHYbqwO9jYnaxy5lc6NzM7SNc8vlAK/hpDiFEFUu0klhM2rVCZIHHxMijraM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1632611151; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=gYrQW+In0BPereti5yy/thlvYUzsxvWtCKgr6Ws6rdQ=; b=c/2zJiH2mHJbFmvl8r/lwRQPN4vh9yQ1KCmuZ597qSIQPwCDzPPdBA1mIHaAgxiyYvMzFB197VStZzcRg8cMV5BdUiagsWpQadIp3K7mdIPvGfKAbdYREg3+U0V/cdnmUNHoGpKcSZLy47Rc4Mr7npm6QSHBnpB74JMuTVhwOts= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+81121+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1632611151896358.87587915814936; Sat, 25 Sep 2021 16:05:51 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id uHgFYY1788612xWzNBwSjW4U; Sat, 25 Sep 2021 16:05:51 -0700 X-Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by mx.groups.io with SMTP id smtpd.web08.12716.1632611149834054906 for ; Sat, 25 Sep 2021 16:05:51 -0700 X-IronPort-AV: E=McAfee;i="6200,9189,10118"; a="285311471" X-IronPort-AV: E=Sophos;i="5.85,322,1624345200"; d="scan'208";a="285311471" X-Received: from orsmga004.jf.intel.com ([10.7.209.38]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Sep 2021 16:05:49 -0700 X-IronPort-AV: E=Sophos;i="5.85,322,1624345200"; d="scan'208";a="586418273" X-Received: from gdong1-mobl1.amr.corp.intel.com ([10.255.67.241]) by orsmga004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Sep 2021 16:05:49 -0700 From: "Guo Dong" To: devel@edk2.groups.io Cc: ray.ni@intel.com, maurice.ma@intel.com, benjamin.you@intel.com, Guo Dong Subject: [edk2-devel] [`edk2-devel][PATCH 1/8] UefiPayloadPkg: Add a common SmmAccessDxe module Date: Sat, 25 Sep 2021 16:05:23 -0700 Message-Id: <20210925230530.861-2-guo.dong@intel.com> In-Reply-To: <20210925230530.861-1-guo.dong@intel.com> References: <20210925230530.861-1-guo.dong@intel.com> MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,guo.dong@intel.com X-Gm-Message-State: hFR9SCmJcr2C1e2sHNuCcORSx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1632611151; bh=kEV9qWaUuIfsu6N8ZpvYnzkuOdB/NufhOwzGJ89fX/w=; h=Cc:Date:From:Reply-To:Subject:To; b=SCZAroQDOZj7IILM15W3IsqVW+S9h126xvQ0HvK8GSLTtuXv9nakQ7wsZM+3wpPe4qq WQK67nuPEE9NpxnyPDmZaTxQHQorik0pJjX9w3KOj7mgmwAgD0ESc0OUQjX2Jv1IhcOQE U8hsWT1bvIL+K0+HyANvELX/UGB8UWqDumI= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1632611152461100003 Content-Type: text/plain; charset="utf-8" From: Guo Dong SmmAccessDxe module would consume EFI_SMRAM_HOB_DESCRIPTOR_BLOCK HOB to produce SMM access protocol gEfiSmmAccess2ProtocolGuid (open, close, lock, and GetCapabilities.) Signed-off-by: Guo Dong --- UefiPayloadPkg/SmmAccessDxe/SmmAccessDxe.c | 254 +++++++++++++++++++ UefiPayloadPkg/SmmAccessDxe/SmmAccessDxe.h | 38 +++ UefiPayloadPkg/SmmAccessDxe/SmmAccessDxe.inf | 51 ++++ 3 files changed, 343 insertions(+) create mode 100644 UefiPayloadPkg/SmmAccessDxe/SmmAccessDxe.c create mode 100644 UefiPayloadPkg/SmmAccessDxe/SmmAccessDxe.h create mode 100644 UefiPayloadPkg/SmmAccessDxe/SmmAccessDxe.inf diff --git a/UefiPayloadPkg/SmmAccessDxe/SmmAccessDxe.c b/UefiPayloadPkg/Sm= mAccessDxe/SmmAccessDxe.c new file mode 100644 index 0000000000..ad75c6a2d9 --- /dev/null +++ b/UefiPayloadPkg/SmmAccessDxe/SmmAccessDxe.c @@ -0,0 +1,254 @@ +/** @file + This driver publishes the SMM Access 2 Protocol. + + Copyright (c) 2021, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "SmmAccessDxe.h" + +SMM_ACCESS_PRIVATE_DATA mSmmAccess; + +/** + Update region state from SMRAM description + + @param[in] OrLogic Indicate to use OR if ture or AND if false. + @param[in] Value The value to set to region state based on OrLogi= c. + +**/ +VOID +SyncRegionState2SmramDesc( + IN BOOLEAN OrLogic, + IN UINT64 Value + ) +{ + UINT32 Index; + + for (Index =3D 0; Index < mSmmAccess.NumberRegions; Index++) { + if (OrLogic) { + mSmmAccess.SmramDesc[Index].RegionState |=3D Value; + } else { + mSmmAccess.SmramDesc[Index].RegionState &=3D Value; + } + } +} + +/** + This routine accepts a request to "open" a region of SMRAM. The + region could be legacy ABSEG, HSEG, or TSEG near top of physical memory. + The use of "open" means that the memory is visible from all boot-service + and SMM agents. + + @param This Pointer to the SMM Access Interface. + + @retval EFI_SUCCESS The region was successfully opened. + @retval EFI_DEVICE_ERROR The region could not be opened because l= ocked by chipset. + @retval EFI_INVALID_PARAMETER The descriptor index was out of bounds. + +**/ +EFI_STATUS +EFIAPI +Open ( + IN EFI_SMM_ACCESS2_PROTOCOL *This + ) +{ + if ((mSmmAccess.SmmRegionState & EFI_SMRAM_LOCKED) !=3D 0) { + // + // Cannot open a "locked" region + // + DEBUG ((DEBUG_INFO, "Cannot open the locked SMRAM Region\n")); + return EFI_DEVICE_ERROR; + } + + mSmmAccess.SmmRegionState &=3D ~(EFI_SMRAM_CLOSED | EFI_ALLOCATED); + SyncRegionState2SmramDesc(FALSE, (UINT64)(UINTN)(~(EFI_SMRAM_CLOSED | EF= I_ALLOCATED))); + + mSmmAccess.SmmRegionState |=3D EFI_SMRAM_OPEN; + SyncRegionState2SmramDesc(TRUE, EFI_SMRAM_OPEN); + mSmmAccess.SmmAccess.OpenState =3D TRUE; + + return EFI_SUCCESS; +} + +/** + This routine accepts a request to "close" a region of SMRAM. The region + could be legacy AB or TSEG near top of physical memory. + The use of "close" means that the memory is only visible from SMM agent= s, + not from BS or RT code. + + @param This Pointer to the SMM Access Interface. + + @retval EFI_SUCCESS The region was successfully closed. + @retval EFI_DEVICE_ERROR The region could not be closed because= locked by + chipset. + @retval EFI_INVALID_PARAMETER The descriptor index was out of bounds. + +**/ +EFI_STATUS +EFIAPI +Close ( + IN EFI_SMM_ACCESS2_PROTOCOL *This + ) +{ + if ((mSmmAccess.SmmRegionState & EFI_SMRAM_LOCKED) !=3D 0) { + // + // Cannot close a "locked" region + // + DEBUG ((DEBUG_INFO, "Cannot close the locked SMRAM Region\n")); + return EFI_DEVICE_ERROR; + } + + if ((mSmmAccess.SmmRegionState & EFI_SMRAM_CLOSED) !=3D 0) { + return EFI_DEVICE_ERROR; + } + + mSmmAccess.SmmRegionState &=3D ~EFI_SMRAM_OPEN; + SyncRegionState2SmramDesc(FALSE, (UINT64)(UINTN)(~EFI_SMRAM_OPEN)); + + mSmmAccess.SmmRegionState |=3D (EFI_SMRAM_CLOSED | EFI_ALLOCATED); + SyncRegionState2SmramDesc(TRUE, EFI_SMRAM_CLOSED | EFI_ALLOCATED); + + mSmmAccess.SmmAccess.OpenState =3D FALSE; + + return EFI_SUCCESS; +} + +/** + This routine accepts a request to "lock" SMRAM. The + region could be legacy AB or TSEG near top of physical memory. + The use of "lock" means that the memory can no longer be opened + to BS state. + + @param This Pointer to the SMM Access Interface. + + @retval EFI_SUCCESS The region was successfully locked. + @retval EFI_DEVICE_ERROR The region could not be locked because = at least + one range is still open. + @retval EFI_INVALID_PARAMETER The descriptor index was out of bounds. + +**/ +EFI_STATUS +EFIAPI +Lock ( + IN EFI_SMM_ACCESS2_PROTOCOL *This + ) +{ + if (mSmmAccess.SmmAccess.OpenState) { + DEBUG ((DEBUG_INFO, "Cannot lock SMRAM when it is still open\n")); + return EFI_DEVICE_ERROR; + } + + mSmmAccess.SmmRegionState |=3D EFI_SMRAM_LOCKED; + SyncRegionState2SmramDesc(TRUE, EFI_SMRAM_LOCKED); + mSmmAccess.SmmAccess.LockState =3D TRUE; + return EFI_SUCCESS; +} + +/** + This routine services a user request to discover the SMRAM + capabilities of this platform. This will report the possible + ranges that are possible for SMRAM access, based upon the + memory controller capabilities. + + @param This Pointer to the SMRAM Access Interface. + @param SmramMapSize Pointer to the variable containing size of the + buffer to contain the description information. + @param SmramMap Buffer containing the data describing the Smram + region descriptors. + + @retval EFI_BUFFER_TOO_SMALL The user did not provide a sufficient buf= fer. + @retval EFI_SUCCESS The user provided a sufficiently-sized bu= ffer. + +**/ +EFI_STATUS +EFIAPI +GetCapabilities ( + IN CONST EFI_SMM_ACCESS2_PROTOCOL *This, + IN OUT UINTN *SmramMapSize, + IN OUT EFI_SMRAM_DESCRIPTOR *SmramMap + ) +{ + EFI_STATUS Status; + UINTN NecessaryBufferSize; + + NecessaryBufferSize =3D mSmmAccess.NumberRegions * sizeof(EFI_SMRAM_DESC= RIPTOR); + if (*SmramMapSize < NecessaryBufferSize) { + Status =3D EFI_BUFFER_TOO_SMALL; + } else { + CopyMem(SmramMap, mSmmAccess.SmramDesc, NecessaryBufferSize); + Status =3D EFI_SUCCESS; + } + + *SmramMapSize =3D NecessaryBufferSize; + return Status; +} + +/** + This function installs EFI_SMM_ACCESS_PROTOCOL. + + @param ImageHandle Handle for the image of this driver + @param SystemTable Pointer to the EFI System Table + + @retval EFI_UNSUPPORTED There's no Intel ICH on this platform + @return The status returned from InstallProtocolInterface(). + +**/ +EFI_STATUS +EFIAPI +SmmAccessEntryPoint ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + EFI_HOB_GUID_TYPE *GuidHob; + UINT32 SmmRegionNum; + EFI_SMRAM_HOB_DESCRIPTOR_BLOCK *SmramHob; + UINT32 Index; + + // + // Get SMRAM info HOB + // + GuidHob =3D GetFirstGuidHob (&gEfiSmmSmramMemoryGuid); + if (GuidHob =3D=3D NULL) { + DEBUG ((DEBUG_INFO, "SMRAM HOB NOT found\n")); + return EFI_NOT_FOUND; + } + SmramHob =3D (EFI_SMRAM_HOB_DESCRIPTOR_BLOCK *) GET_GUID_HOB_DATA(Gu= idHob); + SmmRegionNum =3D SmramHob->NumberOfSmmReservedRegions; + mSmmAccess.SmramDesc =3D AllocateZeroPool (sizeof (EFI_SMRAM_DESCRIPTOR)= * SmmRegionNum); + if (mSmmAccess.SmramDesc =3D=3D NULL) { + return EFI_OUT_OF_RESOURCES; + } + CopyMem (mSmmAccess.SmramDesc, &SmramHob->Descriptor, sizeof (EFI_SMRAM_= DESCRIPTOR) * SmmRegionNum); + + DEBUG ((DEBUG_INFO, "NumberOfSmmReservedRegions =3D 0x%x\n", SmmRegionNu= m)); + for (Index =3D 0; Index < SmmRegionNum; Index++) { + DEBUG ((DEBUG_INFO, "%d: base=3D0x%x, size =3D 0x%x, State=3D0x%x\n",I= ndex, + SmramHob->Descriptor[Index].PhysicalStart, + SmramHob->Descriptor[Index].PhysicalSize, + SmramHob->Descriptor[Index].RegionState)); + mSmmAccess.SmramDesc[Index].RegionState &=3D EFI_ALLOCATED; + mSmmAccess.SmramDesc[Index].RegionState |=3D EFI_SMRAM_CLOSED | EFI_C= ACHEABLE; + } + + mSmmAccess.Signature =3D SMM_ACCESS_PRIVATE_DATA_SIGN= ATURE; + mSmmAccess.NumberRegions =3D SmmRegionNum; + mSmmAccess.SmmAccess.Open =3D Open; + mSmmAccess.SmmAccess.Close =3D Close; + mSmmAccess.SmmAccess.Lock =3D Lock; + mSmmAccess.SmmAccess.GetCapabilities =3D GetCapabilities; + mSmmAccess.SmmAccess.LockState =3D FALSE; + mSmmAccess.SmmAccess.OpenState =3D FALSE; + mSmmAccess.SmmRegionState =3D EFI_SMRAM_CLOSED; + + Status =3D gBS->InstallMultipleProtocolInterfaces ( + &mSmmAccess.Handle, + &gEfiSmmAccess2ProtocolGuid, + &mSmmAccess.SmmAccess, + NULL + ); + + return Status; +} diff --git a/UefiPayloadPkg/SmmAccessDxe/SmmAccessDxe.h b/UefiPayloadPkg/Sm= mAccessDxe/SmmAccessDxe.h new file mode 100644 index 0000000000..7b64c0afcb --- /dev/null +++ b/UefiPayloadPkg/SmmAccessDxe/SmmAccessDxe.h @@ -0,0 +1,38 @@ +/** @file + The header file of SMM access DXE. + +Copyright (c) 2014 - 2021, Intel Corporation. All rights reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _SMM_ACCESS_DRIVER_H +#define _SMM_ACCESS_DRIVER_H + +#include +#include +//#include +#include +#include +#include +#include +#include +#include +#include + + +#define SMM_ACCESS_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('S', 'M', 'M', '= A') + +typedef struct { + UINTN Signature; + EFI_HANDLE Handle; + EFI_SMM_ACCESS2_PROTOCOL SmmAccess; + // + // Local Data for SMM Access interface goes here + // + UINT32 SmmRegionState; + UINT32 NumberRegions; + EFI_SMRAM_DESCRIPTOR *SmramDesc; +} SMM_ACCESS_PRIVATE_DATA; + +#endif diff --git a/UefiPayloadPkg/SmmAccessDxe/SmmAccessDxe.inf b/UefiPayloadPkg/= SmmAccessDxe/SmmAccessDxe.inf new file mode 100644 index 0000000000..aac5ee8f28 --- /dev/null +++ b/UefiPayloadPkg/SmmAccessDxe/SmmAccessDxe.inf @@ -0,0 +1,51 @@ +## @file +# SMM Access 2 Protocol Dxe Driver +# +# This module produces the SMM Access 2 Protocol. +# +# Copyright (c) 2021, Intel Corporation. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION =3D 0x00010005 + BASE_NAME =3D SmmAccessDxe + FILE_GUID =3D 47579CF5-1E4F-4b41-99BB-A5C334846D3B + MODULE_TYPE =3D DXE_DRIVER + VERSION_STRING =3D 1.0 + ENTRY_POINT =3D SmmAccessEntryPoint + +# +# The following information is for reference only and not required by the = build tools. +# +# VALID_ARCHITECTURES =3D IA32 X64 +# + +[Sources] + SmmAccessDxe.c + SmmAccessDxe.h + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + UefiPayloadPkg/UefiPayloadPkg.dec + +[LibraryClasses] + UefiDriverEntryPoint + UefiBootServicesTableLib + DebugLib + BaseLib + BaseMemoryLib + MemoryAllocationLib + HobLib + +[Guids] + gEfiSmmSmramMemoryGuid + +[Protocols] + gEfiSmmAccess2ProtocolGuid ## PRODUCES + +[Depex] + TRUE --=20 2.32.0.windows.2 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#81121): https://edk2.groups.io/g/devel/message/81121 Mute This Topic: https://groups.io/mt/85870023/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-