From nobody Fri Dec 19 20:52:54 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+82289+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+82289+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1634624434; cv=none; d=zohomail.com; s=zohoarc; b=oE3OpEqDo/L1g0bHX8HkDGeBX2Q58CpVuKsHgk5FmVDCZNQrYWQZYMyMGKJFF6hCjSYof0Uw4kwna851T7Vwr5Uv4OVmp1TFUAjjLx5OGxqYCHTt7CSxRgA6xfcpNaNCFG692tn9vkMEDZ2JfbzbUlybMfQzfD2Bk62w+VJACkE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1634624434; 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=DRLGMW2E3s0UODI02d976dyvWd7FUhnhdYmAFU3avoQ=; b=j5p1jT8wvYrbtvvftD9UJG7vsGIwLERj90NLgYS3HJEIZ7EgihQwYq75J9A+BdsmPunQobVd9WiwOIP3+yhCa9H5eGtmmA8hlks4Wa3rtoHUP8nkU95N7qQ5lm6LlxEInVDDs9DNumwh5N9Z24wMeZ4xX5vrNlJORfBI3exS5Yk= 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+82289+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 1634624434369343.61472107297334; Mon, 18 Oct 2021 23:20:34 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id XY6TYY1788612xGchJuljYvG; Mon, 18 Oct 2021 23:20:33 -0700 X-Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by mx.groups.io with SMTP id smtpd.web10.6133.1634624433123803422 for ; Mon, 18 Oct 2021 23:20:33 -0700 X-IronPort-AV: E=McAfee;i="6200,9189,10141"; a="314632445" X-IronPort-AV: E=Sophos;i="5.85,383,1624345200"; d="scan'208";a="314632445" X-Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Oct 2021 23:20:32 -0700 X-IronPort-AV: E=Sophos;i="5.85,383,1624345200"; d="scan'208";a="566783103" X-Received: from gdong1-mobl1.amr.corp.intel.com ([10.213.170.103]) by fmsmga003-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Oct 2021 23:20:31 -0700 From: "Guo Dong" To: devel@edk2.groups.io Cc: Guo Dong , Ray Ni , Maurice Ma , Benjamin You Subject: [edk2-devel] [`edk2-devel][PATCH V2 1/8] UefiPayloadPkg: Add a common SmmAccessDxe module Date: Mon, 18 Oct 2021 23:20:08 -0700 Message-Id: <20211019062015.1092-2-guo.dong@intel.com> In-Reply-To: <20211019062015.1092-1-guo.dong@intel.com> References: <20211019062015.1092-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: NtXBjMvFwX3k4rdeCsd9thMJx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1634624433; bh=HFRWq7Fm50KE1l9ULq0WAoVA0y9z/Zedfqg1sjXkSnc=; h=Cc:Date:From:Reply-To:Subject:To; b=tJXlRvwfWH58fpndi+EyVK84hprBjM8rqTRu7ZIO4u49XhoM15f4bVWs8QBPQjODjZo IMHLMXWMYTIrSLrllrgxuQhB17tWrWxsM7piDUVZvhN2r+crJmfpWKmsAD0qZ4FSKUDn3 kiSA+fPJIoY+OQMRPoT6DHwjbxtkRlcABJ0= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1634624435051100001 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 Cc: Ray Ni Cc: Maurice Ma Cc: Benjamin You Reviewed-by: Ray Ni Reviewed-by: Benjamin You --- UefiPayloadPkg/SmmAccessDxe/SmmAccessDxe.c | 254 +++++++++++++++++++ UefiPayloadPkg/SmmAccessDxe/SmmAccessDxe.h | 37 +++ UefiPayloadPkg/SmmAccessDxe/SmmAccessDxe.inf | 51 ++++ 3 files changed, 342 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..ce7026dc9a --- /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 true 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..b6d76daef3 --- /dev/null +++ b/UefiPayloadPkg/SmmAccessDxe/SmmAccessDxe.h @@ -0,0 +1,37 @@ +/** @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 + + +#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 (#82289): https://edk2.groups.io/g/devel/message/82289 Mute This Topic: https://groups.io/mt/86433932/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-