From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail04.groups.io (mail04.groups.io [45.79.224.9]) by spool.mail.gandi.net (Postfix) with ESMTPS id 48135D811A4 for ; Mon, 15 Apr 2024 13:30:40 +0000 (UTC) DKIM-Signature: a=rsa-sha256; bh=s48tNY28r03o2zGsE98h+m6Rfl1QaaJBsyT2H3YC5KI=; c=relaxed/simple; d=groups.io; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References:Precedence:List-Subscribe:List-Help:Sender:List-Id:Mailing-List:Delivered-To:Resent-Date:Resent-From:Reply-To:List-Unsubscribe-Post:List-Unsubscribe; s=20240206; t=1713187839; v=1; b=OLmCRakj5t8rBVcu1BfN1eC7ajlnnBlznW23m0C0Qg9JwBKoo/kj/MFsCpGQ103SX0wew4CQ vRWovVJZJN4shVFj9eBf05Kv00CGRiAVZoRKKmpxCsr/jdHa7ChJBeOrlgXux6MgQGyJALn6ndo SRR8cexfUyl01fYuBkBH5UVz1yqFpVPUIHFQXbJ1ztQZAytu8dixKQj7FC3bmrfb0uyOW7wGPS2 QlKQx3xWLLOalFDgbnBbuu8FZuTdg2nZBsqP3VnV78r5w50AfQpSXHNzQ33s7hQ+G3zM08cJOHI h8RON9jqiJbeO9GhL2ru8HxHD8mfkd7znXP7Q7qPati+w== X-Received: by 127.0.0.2 with SMTP id cCR3YY7687511xGnWQ2iFiBO; Mon, 15 Apr 2024 06:30:39 -0700 X-Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.7]) by mx.groups.io with SMTP id smtpd.web10.21064.1713187828784399677 for ; Mon, 15 Apr 2024 06:30:38 -0700 X-CSE-ConnectionGUID: +wnBOEHHQOSFCrObtCjFwA== X-CSE-MsgGUID: rH8l/wVvTx+lcH3onGjv6Q== X-IronPort-AV: E=McAfee;i="6600,9927,11044"; a="33961807" X-IronPort-AV: E=Sophos;i="6.07,203,1708416000"; d="scan'208";a="33961807" X-Received: from fmviesa007.fm.intel.com ([10.60.135.147]) by fmvoesa101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Apr 2024 06:30:38 -0700 X-CSE-ConnectionGUID: lkaVsks8TReBumGyzRs3nw== X-CSE-MsgGUID: mW8RqYO8R+2emi0areDENA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.07,203,1708416000"; d="scan'208";a="22000557" X-Received: from sh1gapp1009.ccr.corp.intel.com ([10.239.189.219]) by fmviesa007.fm.intel.com with ESMTP; 15 Apr 2024 06:30:36 -0700 From: "Wu, Jiaxin" To: devel@edk2.groups.io Cc: Ard Biesheuvel , Jiewen Yao , Gerd Hoffmann , Ray Ni Subject: [edk2-devel] [PATCH v2 05/10] OvmfPkg/PlatformInitLib: Create gEfiSmmSmramMemoryGuid Date: Mon, 15 Apr 2024 21:30:16 +0800 Message-Id: <20240415133021.10516-6-jiaxin.wu@intel.com> In-Reply-To: <20240415133021.10516-1-jiaxin.wu@intel.com> References: <20240415133021.10516-1-jiaxin.wu@intel.com> Precedence: Bulk List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Resent-Date: Mon, 15 Apr 2024 06:30:38 -0700 Resent-From: jiaxin.wu@intel.com Reply-To: devel@edk2.groups.io,jiaxin.wu@intel.com List-Unsubscribe-Post: List-Unsubscribe=One-Click List-Unsubscribe: X-Gm-Message-State: ndVfRWJul3f0bdpINxd5qEasx7686176AA= X-GND-Status: LEGIT Authentication-Results: spool.mail.gandi.net; dkim=pass header.d=groups.io header.s=20240206 header.b=OLmCRakj; spf=pass (spool.mail.gandi.net: domain of bounce@groups.io designates 45.79.224.9 as permitted sender) smtp.mailfrom=bounce@groups.io; dmarc=fail reason="SPF not aligned (relaxed), DKIM not aligned (relaxed)" header.from=intel.com (policy=none) Background: In the PiSmmCpuDxeSmm driver, SMRAM allocation for SMI handlers and processor Save State areas was traditionally performed using the Smst->AllocatePages() function during the DXE phase. The introduction of SmmRelocationLib changes this process by moving the allocation to the PEI phase, where Smst->AllocatePages() is not accessible. Instead, the allocation is now handled by partitioning the SMRAM based on the information provided by a GUID HOB (identified by gEfiSmmSMramMemoryGuid). This patch is to ensure that OVMF produces the gEfiSmmSMramMemoryGuid HOB, allowing SmmRelocationLib to reserve the necessary memory for SMBASE relocation. Cc: Ard Biesheuvel Cc: Jiewen Yao Cc: Gerd Hoffmann Cc: Ray Ni Signed-off-by: Jiaxin Wu --- OvmfPkg/Library/PlatformInitLib/MemDetect.c | 97 +++++++++++++--------- .../Library/PlatformInitLib/PlatformInitLib.inf | 5 +- 2 files changed, 64 insertions(+), 38 deletions(-) diff --git a/OvmfPkg/Library/PlatformInitLib/MemDetect.c b/OvmfPkg/Library/PlatformInitLib/MemDetect.c index 7b6e5102ad..8b98256225 100644 --- a/OvmfPkg/Library/PlatformInitLib/MemDetect.c +++ b/OvmfPkg/Library/PlatformInitLib/MemDetect.c @@ -1,9 +1,9 @@ /**@file Memory Detection for Virtual Machines. - Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.
+ Copyright (c) 2006 - 2024, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent Module Name: MemDetect.c @@ -41,10 +41,12 @@ Module Name: #include #include #include +#include + #define MEGABYTE_SHIFT 20 VOID EFIAPI PlatformQemuUc32BaseInitialization ( @@ -1027,52 +1029,73 @@ PlatformQemuInitializeRam ( // // Determine total memory size available // PlatformGetSystemMemorySizeBelow4gb (PlatformInfoHob); - if (PlatformInfoHob->BootMode == BOOT_ON_S3_RESUME) { - // - // Create the following memory HOB as an exception on the S3 boot path. + // + // CpuMpPei saves the original contents of the borrowed area in permanent + // PEI RAM, in a backup buffer allocated with the normal PEI services. + // CpuMpPei restores the original contents ("returns" the borrowed area) at + // End-of-PEI. End-of-PEI in turn is emitted by S3Resume2Pei before + // transferring control to the OS's wakeup vector in the FACS. + // + // We expect any other PEIMs that "borrow" memory similarly to CpuMpPei to + // restore the original contents. Furthermore, we expect all such PEIMs + // (CpuMpPei included) to claim the borrowed areas by producing memory + // allocation HOBs, and to honor preexistent memory allocation HOBs when + // looking for an area to borrow. + // + QemuInitializeRamBelow1gb (PlatformInfoHob); + + if (PlatformInfoHob->SmmSmramRequire) { + UINT32 TsegSize; + UINTN BufferSize; + UINT8 SmramRanges; + EFI_PEI_HOB_POINTERS Hob; + EFI_SMRAM_HOB_DESCRIPTOR_BLOCK *SmramHobDescriptorBlock; + + TsegSize = PlatformInfoHob->Q35TsegMbytes * SIZE_1MB; + PlatformAddMemoryRangeHob (BASE_1MB, PlatformInfoHob->LowMemory - TsegSize); + PlatformAddReservedMemoryBaseSizeHob ( + PlatformInfoHob->LowMemory - TsegSize, + TsegSize, + TRUE + ); + + SmramRanges = 2; + BufferSize = sizeof (EFI_SMRAM_HOB_DESCRIPTOR_BLOCK) + (SmramRanges - 1) * sizeof (EFI_SMRAM_DESCRIPTOR); + + Hob.Raw = BuildGuidHob ( + &gEfiSmmSmramMemoryGuid, + BufferSize + ); + ASSERT (Hob.Raw); + + SmramHobDescriptorBlock = (EFI_SMRAM_HOB_DESCRIPTOR_BLOCK *)(Hob.Raw); + SmramHobDescriptorBlock->NumberOfSmmReservedRegions = SmramRanges; + // - // Normally we'd create memory HOBs only on the normal boot path. However, - // CpuMpPei specifically needs such a low-memory HOB on the S3 path as - // well, for "borrowing" a subset of it temporarily, for the AP startup - // vector. + // Create first SMRAM descriptor, which contains data structures used in S3 resume. + // One page is enough for the data structure // - // CpuMpPei saves the original contents of the borrowed area in permanent - // PEI RAM, in a backup buffer allocated with the normal PEI services. - // CpuMpPei restores the original contents ("returns" the borrowed area) at - // End-of-PEI. End-of-PEI in turn is emitted by S3Resume2Pei before - // transferring control to the OS's wakeup vector in the FACS. + SmramHobDescriptorBlock->Descriptor[0].PhysicalStart = PlatformInfoHob->LowMemory - TsegSize; + SmramHobDescriptorBlock->Descriptor[0].CpuStart = PlatformInfoHob->LowMemory - TsegSize; + SmramHobDescriptorBlock->Descriptor[0].PhysicalSize = EFI_PAGE_SIZE; + SmramHobDescriptorBlock->Descriptor[0].RegionState = EFI_SMRAM_CLOSED | EFI_CACHEABLE | EFI_ALLOCATED; + // - // We expect any other PEIMs that "borrow" memory similarly to CpuMpPei to - // restore the original contents. Furthermore, we expect all such PEIMs - // (CpuMpPei included) to claim the borrowed areas by producing memory - // allocation HOBs, and to honor preexistent memory allocation HOBs when - // looking for an area to borrow. + // Create second SMRAM descriptor, which is free and will be used by SMM foundation. // - QemuInitializeRamBelow1gb (PlatformInfoHob); + SmramHobDescriptorBlock->Descriptor[1].PhysicalStart = SmramHobDescriptorBlock->Descriptor[0].PhysicalStart + EFI_PAGE_SIZE; + SmramHobDescriptorBlock->Descriptor[1].CpuStart = SmramHobDescriptorBlock->Descriptor[0].CpuStart + EFI_PAGE_SIZE; + SmramHobDescriptorBlock->Descriptor[1].PhysicalSize = TsegSize - EFI_PAGE_SIZE; + SmramHobDescriptorBlock->Descriptor[1].RegionState = EFI_SMRAM_CLOSED | EFI_CACHEABLE; } else { - // - // Create memory HOBs - // - QemuInitializeRamBelow1gb (PlatformInfoHob); - - if (PlatformInfoHob->SmmSmramRequire) { - UINT32 TsegSize; - - TsegSize = PlatformInfoHob->Q35TsegMbytes * SIZE_1MB; - PlatformAddMemoryRangeHob (BASE_1MB, PlatformInfoHob->LowMemory - TsegSize); - PlatformAddReservedMemoryBaseSizeHob ( - PlatformInfoHob->LowMemory - TsegSize, - TsegSize, - TRUE - ); - } else { - PlatformAddMemoryRangeHob (BASE_1MB, PlatformInfoHob->LowMemory); - } + PlatformAddMemoryRangeHob (BASE_1MB, PlatformInfoHob->LowMemory); + } + if (PlatformInfoHob->BootMode != BOOT_ON_S3_RESUME) { // // If QEMU presents an E820 map, then create memory HOBs for the >=4GB RAM // entries. Otherwise, create a single memory HOB with the flat >=4GB // memory size read from the CMOS. // diff --git a/OvmfPkg/Library/PlatformInitLib/PlatformInitLib.inf b/OvmfPkg/Library/PlatformInitLib/PlatformInitLib.inf index 5a79d95b68..2bb1c0296f 100644 --- a/OvmfPkg/Library/PlatformInitLib/PlatformInitLib.inf +++ b/OvmfPkg/Library/PlatformInitLib/PlatformInitLib.inf @@ -1,10 +1,10 @@ ## @file # Platform Initialization Lib # # This module provides platform specific function to detect boot mode. -# Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.
+# Copyright (c) 2006 - 2024, Intel Corporation. All rights reserved.
# # SPDX-License-Identifier: BSD-2-Clause-Patent # ## @@ -54,10 +54,13 @@ PeiHardwareInfoLib [LibraryClasses.X64] TdxLib +[Guids] + gEfiSmmSmramMemoryGuid + [Pcd] gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable [FixedPcd] -- 2.16.2.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#117780): https://edk2.groups.io/g/devel/message/117780 Mute This Topic: https://groups.io/mt/105535809/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=-