From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by spool.mail.gandi.net (Postfix) with ESMTPS id 7702F94126D for ; Thu, 7 Dec 2023 07:33:14 +0000 (UTC) DKIM-Signature: a=rsa-sha256; bh=N469uoeEQT6aBsHPWnFeai4yVzHLV+Dn7KUHoJgqwjo=; c=relaxed/simple; d=groups.io; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References:MIME-Version:Precedence:List-Subscribe:List-Help:Sender:List-Id:Mailing-List:Delivered-To:Reply-To:List-Unsubscribe-Post:List-Unsubscribe:Content-Transfer-Encoding; s=20140610; t=1701934393; v=1; b=WMRcF8QI5y1sD0QE2LdPja3oA/px7fzj78Mg0OrLrRBjxUTys26wNomninfB7AxDzy052qLe tIbVueKxP9YUTK6hcPe66fN90nweGgAu5mvk4RE4KXX3BlMiIe6x+torLvsCIn3kJcYm7VdVUai 8z1KETDnZRZhG6jd0rBgoTxY= X-Received: by 127.0.0.2 with SMTP id iDsqYY7687511xSUeagNd2vQ; Wed, 06 Dec 2023 23:33:13 -0800 X-Received: from mgamail.intel.com (mgamail.intel.com [192.55.52.120]) by mx.groups.io with SMTP id smtpd.web10.78844.1701934386136088650 for ; Wed, 06 Dec 2023 23:33:12 -0800 X-IronPort-AV: E=McAfee;i="6600,9927,10916"; a="393061677" X-IronPort-AV: E=Sophos;i="6.04,256,1695711600"; d="scan'208";a="393061677" X-Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Dec 2023 23:32:54 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10916"; a="800643989" X-IronPort-AV: E=Sophos;i="6.04,256,1695711600"; d="scan'208";a="800643989" X-Received: from shwdeopenlab702.ccr.corp.intel.com ([10.239.55.43]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Dec 2023 23:32:52 -0800 From: "duntan" To: devel@edk2.groups.io Cc: Eric Dong , Ray Ni , Rahul Kumar , Gerd Hoffmann Subject: [edk2-devel] [Patch V2 3/6] UefiCpuPkg: Consume MpInfo2Hob in PiSmmCpuDxe Date: Thu, 7 Dec 2023 15:32:28 +0800 Message-Id: <20231207073230.264-4-dun.tan@intel.com> In-Reply-To: <20231207073230.264-1-dun.tan@intel.com> References: <20231207073230.264-1-dun.tan@intel.com> MIME-Version: 1.0 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 Reply-To: devel@edk2.groups.io,dun.tan@intel.com List-Unsubscribe-Post: List-Unsubscribe=One-Click List-Unsubscribe: X-Gm-Message-State: dntEwus772ViMblMyUkF4O3vx7686176AA= Content-Transfer-Encoding: 8bit X-GND-Status: LEGIT Authentication-Results: spool.mail.gandi.net; dkim=pass header.d=groups.io header.s=20140610 header.b=WMRcF8QI; dmarc=fail reason="SPF not aligned (relaxed), DKIM not aligned (relaxed)" header.from=intel.com (policy=none); spf=pass (spool.mail.gandi.net: domain of bounce@groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce@groups.io Consume MpInfo2Hob in PiSmmCpuDxe driver to get NumberOfProcessors, MaxNumberOfCpus and EFI_PROCESSOR_INFORMATION for all CPU from the MpInformation2 HOB. This can avoid calling MP service. Signed-off-by: Dun Tan Cc: Eric Dong Cc: Ray Ni Cc: Rahul Kumar Cc: Gerd Hoffmann --- UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c | 210 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------------------------- UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h | 2 +- UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf | 8 ++++---- 3 files changed, 169 insertions(+), 51 deletions(-) diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c index 1d022a7051..b729f8ee63 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c @@ -99,8 +99,8 @@ UINTN mSmmStackSize; UINTN mSmmShadowStackSize; BOOLEAN mCetSupported = TRUE; -UINTN mMaxNumberOfCpus = 1; -UINTN mNumberOfCpus = 1; +UINTN mMaxNumberOfCpus = 0; +UINTN mNumberOfCpus = 0; // // SMM ready to lock flag @@ -586,6 +586,147 @@ SmmReadyToLockEventNotify ( return EFI_SUCCESS; } +/** + Function to compare 2 MP_INFORMATION2_HOB_DATA pointer based on ProcessorIndex. + + @param[in] Buffer1 pointer to MP_INFORMATION2_HOB_DATA poiner to compare + @param[in] Buffer2 pointer to second MP_INFORMATION2_HOB_DATA pointer to compare + + @retval 0 Buffer1 equal to Buffer2 + @retval <0 Buffer1 is less than Buffer2 + @retval >0 Buffer1 is greater than Buffer2 +**/ +INTN +EFIAPI +MpInformation2HobCompare ( + IN CONST VOID *Buffer1, + IN CONST VOID *Buffer2 + ) +{ + if ((*(MP_INFORMATION2_HOB_DATA **)Buffer1)->ProcessorIndex > (*(MP_INFORMATION2_HOB_DATA **)Buffer2)->ProcessorIndex) { + return 1; + } else if ((*(MP_INFORMATION2_HOB_DATA **)Buffer1)->ProcessorIndex < (*(MP_INFORMATION2_HOB_DATA **)Buffer2)->ProcessorIndex) { + return -1; + } + + return 0; +} + +/** + Extract NumberOfCpus, MaxNumberOfCpus and EFI_PROCESSOR_INFORMATION for all CPU from MpInformation2 HOB. + + @param[out] NumberOfCpus Pointer to NumberOfCpus. + @param[out] MaxNumberOfCpus Pointer to MaxNumberOfCpus. + + @retval ProcessorInfo Pointer to EFI_PROCESSOR_INFORMATION buffer. +**/ +EFI_PROCESSOR_INFORMATION * +GetMpInformation ( + OUT UINTN *NumberOfCpus, + OUT UINTN *MaxNumberOfCpus + ) +{ + EFI_HOB_GUID_TYPE *GuidHob; + EFI_HOB_GUID_TYPE *FirstMpInfo2Hob; + MP_INFORMATION2_HOB_DATA *MpInformation2HobData; + UINTN HobCount; + UINTN HobIndex; + MP_INFORMATION2_HOB_DATA **MpInfo2Hobs; + UINTN SortBuffer; + UINTN ProcessorIndex; + UINT64 PrevProcessorIndex; + MP_INFORMATION2_ENTRY *MpInformation2Entry; + EFI_PROCESSOR_INFORMATION *ProcessorInfo; + + GuidHob = NULL; + MpInformation2HobData = NULL; + FirstMpInfo2Hob = NULL; + MpInfo2Hobs = NULL; + HobIndex = 0; + HobCount = 0; + + FirstMpInfo2Hob = GetFirstGuidHob (&gMpInformationHobGuid2); + ASSERT (FirstMpInfo2Hob != NULL); + GuidHob = FirstMpInfo2Hob; + while (GuidHob != NULL) { + MpInformation2HobData = GET_GUID_HOB_DATA (GuidHob); + + // + // This is the last MpInformationHob in the HOB list. + // + if (MpInformation2HobData->NumberOfProcessors == 0) { + ASSERT (HobCount != 0); + break; + } + + HobCount++; + *NumberOfCpus += MpInformation2HobData->NumberOfProcessors; + GuidHob = GetNextGuidHob (&gMpInformationHobGuid2, GET_NEXT_HOB (GuidHob)); + } + + ASSERT (*NumberOfCpus <= PcdGet32 (PcdCpuMaxLogicalProcessorNumber)); + + // + // If support CPU hot plug, we need to allocate resources for possibly hot-added processors + // + if (FeaturePcdGet (PcdCpuHotPlugSupport)) { + *MaxNumberOfCpus = PcdGet32 (PcdCpuMaxLogicalProcessorNumber); + } else { + *MaxNumberOfCpus = *NumberOfCpus; + } + + MpInfo2Hobs = AllocatePool (sizeof (MP_INFORMATION2_HOB_DATA *) * HobCount); + ASSERT (MpInfo2Hobs != NULL); + if (MpInfo2Hobs == NULL) { + return NULL; + } + + // + // Record each MpInformation2Hob pointer in the MpInfo2Hobs. + // The FirstMpInfo2Hob is to speed up this while-loop without + // needing to look for MpInfo2Hob from beginning. + // + GuidHob = FirstMpInfo2Hob; + ASSERT (GuidHob != NULL); + while (HobIndex < HobCount) { + MpInfo2Hobs[HobIndex++] = GET_GUID_HOB_DATA (GuidHob); + GuidHob = GetNextGuidHob (&gMpInformationHobGuid2, GET_NEXT_HOB (GuidHob)); + } + + ProcessorInfo = (EFI_PROCESSOR_INFORMATION *)AllocatePool (sizeof (EFI_PROCESSOR_INFORMATION) * (*MaxNumberOfCpus)); + ASSERT (ProcessorInfo != NULL); + if (ProcessorInfo == NULL) { + FreePool (MpInfo2Hobs); + return NULL; + } + + QuickSort (MpInfo2Hobs, HobCount, sizeof (MP_INFORMATION2_HOB_DATA *), (BASE_SORT_COMPARE)MpInformation2HobCompare, &SortBuffer); + PrevProcessorIndex = 0; + for (HobIndex = 0; HobIndex < HobCount; HobIndex++) { + // + // Make sure no overlap and no gap in the CPU range covered by each HOB + // + ASSERT (MpInfo2Hobs[HobIndex]->ProcessorIndex == PrevProcessorIndex); + + // + // Cache each EFI_PROCESSOR_INFORMATION in order. + // + for (ProcessorIndex = 0; ProcessorIndex < MpInfo2Hobs[HobIndex]->NumberOfProcessors; ProcessorIndex++) { + MpInformation2Entry = GET_MP_INFORMATION_ENTRY (MpInfo2Hobs[HobIndex], ProcessorIndex); + CopyMem ( + &ProcessorInfo[PrevProcessorIndex + ProcessorIndex], + &MpInformation2Entry->ProcessorInfo, + sizeof (EFI_PROCESSOR_INFORMATION) + ); + } + + PrevProcessorIndex += MpInfo2Hobs[HobIndex]->NumberOfProcessors; + } + + FreePool (MpInfo2Hobs); + return ProcessorInfo; +} + /** The module Entry Point of the CPU SMM driver. @@ -603,26 +744,24 @@ PiCpuSmmEntry ( IN EFI_SYSTEM_TABLE *SystemTable ) { - EFI_STATUS Status; - EFI_MP_SERVICES_PROTOCOL *MpServices; - UINTN NumberOfEnabledProcessors; - UINTN Index; - VOID *Buffer; - UINTN BufferPages; - UINTN TileCodeSize; - UINTN TileDataSize; - UINTN TileSize; - UINT8 *Stacks; - VOID *Registration; - UINT32 RegEax; - UINT32 RegEbx; - UINT32 RegEcx; - UINT32 RegEdx; - UINTN FamilyId; - UINTN ModelId; - UINT32 Cr3; - EFI_HOB_GUID_TYPE *GuidHob; - SMM_BASE_HOB_DATA *SmmBaseHobData; + EFI_STATUS Status; + UINTN Index; + VOID *Buffer; + UINTN BufferPages; + UINTN TileCodeSize; + UINTN TileDataSize; + UINTN TileSize; + UINT8 *Stacks; + VOID *Registration; + UINT32 RegEax; + UINT32 RegEbx; + UINT32 RegEcx; + UINT32 RegEdx; + UINTN FamilyId; + UINTN ModelId; + UINT32 Cr3; + EFI_HOB_GUID_TYPE *GuidHob; + SMM_BASE_HOB_DATA *SmmBaseHobData; GuidHob = NULL; SmmBaseHobData = NULL; @@ -654,17 +793,10 @@ PiCpuSmmEntry ( FindSmramInfo (&mCpuHotPlugData.SmrrBase, &mCpuHotPlugData.SmrrSize); // - // Get MP Services Protocol - // - Status = SystemTable->BootServices->LocateProtocol (&gEfiMpServiceProtocolGuid, NULL, (VOID **)&MpServices); - ASSERT_EFI_ERROR (Status); - - // - // Use MP Services Protocol to retrieve the number of processors and number of enabled processors + // Retrive NumberOfProcessors, MaxNumberOfCpus and EFI_PROCESSOR_INFORMATION for all CPU from MpInformation2 HOB. // - Status = MpServices->GetNumberOfProcessors (MpServices, &mNumberOfCpus, &NumberOfEnabledProcessors); - ASSERT_EFI_ERROR (Status); - ASSERT (mNumberOfCpus <= PcdGet32 (PcdCpuMaxLogicalProcessorNumber)); + gSmmCpuPrivate->ProcessorInfo = GetMpInformation (&mNumberOfCpus, &mMaxNumberOfCpus); + ASSERT (gSmmCpuPrivate->ProcessorInfo != NULL); // // If support CPU hot plug, PcdCpuSmmEnableBspElection should be set to TRUE. @@ -690,15 +822,6 @@ PiCpuSmmEntry ( mAddressEncMask = PcdGet64 (PcdPteMemoryEncryptionAddressOrMask) & PAGING_1G_ADDRESS_MASK_64; DEBUG ((DEBUG_INFO, "mAddressEncMask = 0x%lx\n", mAddressEncMask)); - // - // If support CPU hot plug, we need to allocate resources for possibly hot-added processors - // - if (FeaturePcdGet (PcdCpuHotPlugSupport)) { - mMaxNumberOfCpus = PcdGet32 (PcdCpuMaxLogicalProcessorNumber); - } else { - mMaxNumberOfCpus = mNumberOfCpus; - } - gSmmCpuPrivate->SmmCoreEntryContext.NumberOfCpus = mMaxNumberOfCpus; PERF_CODE ( @@ -908,9 +1031,6 @@ PiCpuSmmEntry ( // // Allocate buffer for pointers to array in SMM_CPU_PRIVATE_DATA. // - gSmmCpuPrivate->ProcessorInfo = (EFI_PROCESSOR_INFORMATION *)AllocatePool (sizeof (EFI_PROCESSOR_INFORMATION) * mMaxNumberOfCpus); - ASSERT (gSmmCpuPrivate->ProcessorInfo != NULL); - gSmmCpuPrivate->Operation = (SMM_CPU_OPERATION *)AllocatePool (sizeof (SMM_CPU_OPERATION) * mMaxNumberOfCpus); ASSERT (gSmmCpuPrivate->Operation != NULL); @@ -945,8 +1065,6 @@ PiCpuSmmEntry ( gSmmCpuPrivate->Operation[Index] = SmmCpuNone; if (Index < mNumberOfCpus) { - Status = MpServices->GetProcessorInfo (MpServices, Index | CPU_V2_EXTENDED_TOPOLOGY, &gSmmCpuPrivate->ProcessorInfo[Index]); - ASSERT_EFI_ERROR (Status); mCpuHotPlugData.ApicId[Index] = gSmmCpuPrivate->ProcessorInfo[Index].ProcessorId; DEBUG (( diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h index 20ada465c2..f18345881b 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h @@ -14,7 +14,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include -#include #include #include #include @@ -27,6 +26,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include #include +#include #include #include diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf index 5d52ed7d13..372596f24c 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf @@ -106,7 +106,6 @@ [Protocols] gEfiSmmAccess2ProtocolGuid ## CONSUMES - gEfiMpServiceProtocolGuid ## CONSUMES gEfiSmmConfigurationProtocolGuid ## PRODUCES gEfiSmmCpuProtocolGuid ## PRODUCES gEfiSmmReadyToLockProtocolGuid ## NOTIFY @@ -120,6 +119,7 @@ gEdkiiPiSmmMemoryAttributesTableGuid ## CONSUMES ## SystemTable gEfiMemoryAttributesTableGuid ## CONSUMES ## SystemTable gSmmBaseHobGuid ## CONSUMES + gMpInformationHobGuid2 ## CONSUMES # Assume the HOB must has been created [FeaturePcd] gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmDebug ## CONSUMES @@ -153,11 +153,11 @@ [FixedPcd] gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmMpTokenCountPerChunk ## CONSUMES +[Depex] + TRUE + [Pcd.X64] gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmRestrictedMemoryAccess ## CONSUMES -[Depex] - gEfiMpServiceProtocolGuid - [UserExtensions.TianoCore."ExtraFiles"] PiSmmCpuDxeSmmExtra.uni -- 2.31.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#112162): https://edk2.groups.io/g/devel/message/112162 Mute This Topic: https://groups.io/mt/103030294/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=-