From nobody Thu May 16 04:06:56 2024 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+106015+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+106015+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1686577107; cv=none; d=zohomail.com; s=zohoarc; b=fVSrvGCYsThtaL85r3FeG5VVyLkkozuGKL1OElhMQBiqBwXa6IJ7UAXr7LmhwEmf8RkYf8opCwvCKyTAIQVqciOYaQQI/p9LL4yC6xoD41RhY5zDOO+F0bYDDHk4XVs/NRug6SYdqkoKQ93sO17AJ7AMbalcR9ok9DF+Vz4gkMg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1686577107; 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=PtL0Tv822YjdkonlMTFYVw4vS3wXY1gWntzGcWL1nPc=; b=QmhCfnoGcptNnoyWcJND6RXJfI6q6LOnJ3l4l1Kk9BuiiH0+jL44CtLfKPYXDzqod90rdik759dC64Wpl2ukqs05w0pphvk5QoB7F6XMgGe36cZGM23vBmO6Izm2VU+fDVuMOKQd1b3ozzTwJNLbtTpDGSTacWYeq1G+A93NzKo= 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+106015+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 1686577107436797.6201063712324; Mon, 12 Jun 2023 06:38:27 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id 0K8tYY1788612xx17hseYha1; Mon, 12 Jun 2023 06:38:27 -0700 X-Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by mx.groups.io with SMTP id smtpd.web11.58868.1686577106058478801 for ; Mon, 12 Jun 2023 06:38:26 -0700 X-IronPort-AV: E=McAfee;i="6600,9927,10739"; a="338400621" X-IronPort-AV: E=Sophos;i="6.00,236,1681196400"; d="scan'208";a="338400621" X-Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jun 2023 06:37:47 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10739"; a="958032992" X-IronPort-AV: E=Sophos;i="6.00,236,1681196400"; d="scan'208";a="958032992" X-Received: from shwdeopenlab705.ccr.corp.intel.com ([10.239.55.55]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jun 2023 06:37:45 -0700 From: "Yuanhao Xie" To: devel@edk2.groups.io Cc: Gerd Hoffmann , Eric Dong , Ray Ni , Rahul Kumar , Tom Lendacky , Yuanhao Xie Subject: [edk2-devel] [PATCH 1/5] UefiCpuPkg: Create MpHandOff to transfer info from PEI to DXE. Date: Mon, 12 Jun 2023 21:37:16 +0800 Message-Id: <20230612133720.15501-2-yuanhao.xie@intel.com> In-Reply-To: <20230612133720.15501-1-yuanhao.xie@intel.com> References: <20230612133720.15501-1-yuanhao.xie@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,yuanhao.xie@intel.com X-Gm-Message-State: KvdouDkvzURSMTb7ORRvbyCfx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1686577107; bh=VtCsHEjXaK8javo9Fg+HFANQjMFxLyKZxSnkUxMsMx4=; h=Cc:Date:From:Reply-To:Subject:To; b=GygOtmhv+kOsOrLL4alucTKqmu3XGqEok5U35XPjI8z8+/pMnovcywnIkqolxQBsz6N KQixw5/0jbuKUCz+jbzZ5M7l0M1FLXZ/Uvmr8br6SDwqT/VwgVV2TFAY49P+04s8SssXO 36DJzgZ2/bjrxNhqfpNWVVH4RQaj/g8N0SM= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1686577109658100002 Content-Type: text/plain; charset="utf-8" The purpose of the Hob characterized by mCpuInitMpLibHobGuid was twofold: To transfer information from PEI to DXE and acted as a global variable for PEI. However, during the DXE phase,only a few fields from the CPU_MP_DATA which collected in PEI phase were needed. To enhance this process, a new Hob was specifically created to transfer information to the DXE phase. This new Hob contained only the essential fields required for reuse in DXE. Instead of directly including the BspNumber in MpHandOff, the DXE phase introduced the use of GetBspNumber() to collect the BspNumber from ApicID and CpuCount. The addition of MP_HAND_OFF_SIGNAL serves the sole purpose of awakening the APs and transitioning their context from PEI to DXE. The WaitLoopExecutionMode field indicates whether the bit mode of PEI matches that of DXE. Both of these fields are filled only when the ApLoopMode is not ApInHltLoop. In the case of ApLoopMode, it remains necessary to wake up the APs using the init-sipi-sipi sequence. The function GetMpHandOffHob() was added to the collected MpHandOff in the DXE phase. The CpuMpData in the DXE phase was updated by gathering information from MpHandOff. Cc: Gerd Hoffmann Cc: Eric Dong Cc: Ray Ni Cc: Rahul Kumar Cc: Tom Lendacky Signed-off-by: Yuanhao Xie --- UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf | 1 + UefiCpuPkg/Library/MpInitLib/MpHandOff.h | 64 ++++++++++++++++++++++= ++++++++++++++++++++++++++++++++++++++++++ UefiCpuPkg/Library/MpInitLib/MpLib.c | 100 ++++++++++++++++++++++= +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------= --- UefiCpuPkg/Library/MpInitLib/MpLib.h | 2 ++ UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf | 1 + UefiCpuPkg/Library/MpInitLib/PeiMpLib.c | 32 ++++++++++++++++++++++= +++++++++- 6 files changed, 186 insertions(+), 14 deletions(-) diff --git a/UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf b/UefiCpuPkg/Lib= rary/MpInitLib/DxeMpInitLib.inf index 67ebf7254c..7d45d3ad4d 100644 --- a/UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf +++ b/UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf @@ -38,6 +38,7 @@ MpLib.c MpLib.h Microcode.c + MpHandOff.h =20 [Packages] MdePkg/MdePkg.dec diff --git a/UefiCpuPkg/Library/MpInitLib/MpHandOff.h b/UefiCpuPkg/Library/= MpInitLib/MpHandOff.h new file mode 100644 index 0000000000..65c97d865c --- /dev/null +++ b/UefiCpuPkg/Library/MpInitLib/MpHandOff.h @@ -0,0 +1,64 @@ +/** @file + Defines the HOB GUID used to describe the MSEG memory region allocated i= n PEI. + Copyright (c) 2015 - 2023, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef MP_HANDOFF_H_ +#define MP_HANDOFF_H_ +// +// To trigger the start-up signal, BSP writes the specified +// StartupSignalValue to the StartupSignalAddress of each processor. +// This address is monitored by the APs, and as soon as they receive +// the value that matches the MP_HAND_OFF_SIGNAL, they will wake up +// and switch the context from PEI to DXE phase. +// +#define MP_HAND_OFF_SIGNAL SIGNATURE_32 ('M', 'P', 'H', 'O') + +#define MP_HANDOFF_GUID \ + { \ + 0x11e2bd88, 0xed38, 0x4abd, {0xa3, 0x99, 0x21, 0xf2, 0x5f, 0xd0, 0x7a,= 0x60 } \ + } +extern EFI_GUID mMpHandOffGuid; +// +// The information required to transfer from the PEI phase to the +// DXE phase is contained within the MP_HAND_OFF and PROCESSOR_HAND_OFF. +// If the SizeOfPointer (WaitLoopExecutionMode) of both phases are equal, +// and the APs is not in halt mode, +// then the APs can be awakened by triggering the start-up +// signal, rather than using INIT-SIPI-SIPI. +// To trigger the start-up signal, BSP writes the specified +// StartupSignalValue to the StartupSignalAddress of each processor. +// This address is monitored by the APs. +// +typedef struct { + UINT32 ApicId; + UINT32 Health; + UINT64 StartupSignalAddress; + UINT64 StartupProcedureAddress; +} PROCESSOR_HAND_OFF; + +typedef struct { + // + // The ProcessorIndex indicates the range of processors. If it is set to= 0, it signifies + // processors from 0 to CpuCount - 1. Multiple instances in the HOB list= describe + // processors from ProcessorIndex to ProcessorIndex + CpuCount - 1. + // + UINT32 ProcessorIndex; + UINT32 CpuCount; + UINT32 WaitLoopExecutionMode; + UINT32 StartupSignalValue; + PROCESSOR_HAND_OFF Info[]; +} MP_HAND_OFF; + +/** + Get pointer to MP_HAND_OFF GUIDed HOB. + + @return The pointer to MP_HAND_OFF structure. +**/ +MP_HAND_OFF * +GetMpHandOffHob ( + VOID + ); + +#endif diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpIn= itLib/MpLib.c index f1f2840714..c55150e7b6 100644 --- a/UefiCpuPkg/Library/MpInitLib/MpLib.c +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c @@ -14,6 +14,7 @@ #include =20 EFI_GUID mCpuInitMpLibHobGuid =3D CPU_INIT_MP_LIB_HOB_GUID; +EFI_GUID mMpHandOffGuid =3D MP_HANDOFF_GUID; =20 /** Save the volatile registers required to be restored following INIT IPI. @@ -1784,6 +1785,54 @@ CheckAllAPs ( return EFI_NOT_READY; } =20 +/** + This function Get BspNumber. + + @param[in] MpHandOff Pointer to MpHandOff + @return BspNumber +**/ +UINT32 +GetBspNumber ( + IN CONST MP_HAND_OFF *MpHandOff + ) +{ + UINT32 ApicId; + UINT32 BspNumber; + UINT32 Index; + + // + // Get the processor number for the BSP + // + BspNumber =3D MAX_UINT32; + ApicId =3D GetInitialApicId (); + for (Index =3D 0; Index < MpHandOff->CpuCount; Index++) { + if (MpHandOff->Info[Index].ApicId =3D=3D ApicId) { + BspNumber =3D Index; + } + } + + ASSERT (BspNumber !=3D MAX_UINT32); + + return BspNumber; +} + +/** + Get pointer to CPU MP Data structure from GUIDed HOB. + + @param[in] CpuMpData The pointer to CPU MP Data structure. +**/ +VOID +AmdSevUpdateCpuMpData ( + IN CPU_MP_DATA *CpuMpData + ) +{ + CPU_MP_DATA *OldCpuMpData; + + OldCpuMpData =3D GetCpuMpDataFromGuidedHob (); + + OldCpuMpData->NewCpuMpData =3D CpuMpData; +} + /** MP Initialize Library initialization. =20 @@ -1803,7 +1852,7 @@ MpInitLibInitialize ( VOID ) { - CPU_MP_DATA *OldCpuMpData; + MP_HAND_OFF *MpHandOff; CPU_INFO_IN_HOB *CpuInfoInHob; UINT32 MaxLogicalProcessorNumber; UINT32 ApStackSize; @@ -1822,11 +1871,11 @@ MpInitLibInitialize ( UINTN BackupBufferAddr; UINTN ApIdtBase; =20 - OldCpuMpData =3D GetCpuMpDataFromGuidedHob (); - if (OldCpuMpData =3D=3D NULL) { + MpHandOff =3D GetMpHandOffHob (); + if (MpHandOff =3D=3D NULL) { MaxLogicalProcessorNumber =3D PcdGet32 (PcdCpuMaxLogicalProcessorNumbe= r); } else { - MaxLogicalProcessorNumber =3D OldCpuMpData->CpuCount; + MaxLogicalProcessorNumber =3D MpHandOff->CpuCount; } =20 ASSERT (MaxLogicalProcessorNumber !=3D 0); @@ -1970,7 +2019,7 @@ MpInitLibInitialize ( // ProgramVirtualWireMode (); =20 - if (OldCpuMpData =3D=3D NULL) { + if (MpHandOff =3D=3D NULL) { if (MaxLogicalProcessorNumber > 1) { // // Wakeup all APs and calculate the processor count in system @@ -1982,15 +2031,18 @@ MpInitLibInitialize ( // APs have been wakeup before, just get the CPU Information // from HOB // - OldCpuMpData->NewCpuMpData =3D CpuMpData; - CpuMpData->CpuCount =3D OldCpuMpData->CpuCount; - CpuMpData->BspNumber =3D OldCpuMpData->BspNumber; - CpuMpData->CpuInfoInHob =3D OldCpuMpData->CpuInfoInHob; - CpuInfoInHob =3D (CPU_INFO_IN_HOB *)(UINTN)CpuMpData->Cp= uInfoInHob; + AmdSevUpdateCpuMpData (CpuMpData); + CpuMpData->CpuCount =3D MpHandOff->CpuCount; + CpuMpData->BspNumber =3D GetBspNumber (MpHandOff); + CpuInfoInHob =3D (CPU_INFO_IN_HOB *)(UINTN)CpuMpData->CpuInfoI= nHob; for (Index =3D 0; Index < CpuMpData->CpuCount; Index++) { InitializeSpinLock (&CpuMpData->CpuData[Index].ApLock); - CpuMpData->CpuData[Index].CpuHealthy =3D (CpuInfoInHob[Index].Health= =3D=3D 0) ? TRUE : FALSE; + CpuMpData->CpuData[Index].CpuHealthy =3D (MpHandOff->Info[Index].Hea= lth =3D=3D 0) ? TRUE : FALSE; CpuMpData->CpuData[Index].ApFunction =3D 0; + CpuInfoInHob[Index].InitialApicId =3D MpHandOff->Info[Index].Apic= Id; + CpuInfoInHob[Index].ApTopOfStack =3D CpuMpData->Buffer + (Index = + 1) * CpuMpData->CpuApStackSize; + CpuInfoInHob[Index].ApicId =3D MpHandOff->Info[Index].Apic= Id; + CpuInfoInHob[Index].Health =3D MpHandOff->Info[Index].Heal= th; } } =20 @@ -2019,7 +2071,7 @@ MpInitLibInitialize ( // Wakeup APs to do some AP initialize sync (Microcode & MTRR) // if (CpuMpData->CpuCount > 1) { - if (OldCpuMpData !=3D NULL) { + if (MpHandOff !=3D NULL) { // // Only needs to use this flag for DXE phase to update the wake up // buffer. Wakeup buffer allocated in PEI phase is no longer valid @@ -2036,7 +2088,7 @@ MpInitLibInitialize ( CpuPause (); } =20 - if (OldCpuMpData !=3D NULL) { + if (MpHandOff !=3D NULL) { CpuMpData->InitFlag =3D ApInitDone; } =20 @@ -2763,6 +2815,28 @@ StartupThisAPWorker ( return Status; } =20 +/** + Get pointer to MP_HAND_OFF GUIDed HOB. + + @return The pointer to MP_HAND_OFF structure. +**/ +MP_HAND_OFF * +GetMpHandOffHob ( + VOID + ) +{ + EFI_HOB_GUID_TYPE *GuidHob; + MP_HAND_OFF *MpHandOff; + + MpHandOff =3D NULL; + GuidHob =3D GetFirstGuidHob (&mMpHandOffGuid); + if (GuidHob !=3D NULL) { + MpHandOff =3D (MP_HAND_OFF *)GET_GUID_HOB_DATA (GuidHob); + } + + return MpHandOff; +} + /** Get pointer to CPU MP Data structure from GUIDed HOB. =20 diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.h b/UefiCpuPkg/Library/MpIn= itLib/MpLib.h index b694c7b40f..9bb70415f3 100644 --- a/UefiCpuPkg/Library/MpInitLib/MpLib.h +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.h @@ -40,6 +40,8 @@ =20 #include =20 +#include "MpHandOff.h" + #define WAKEUP_AP_SIGNAL SIGNATURE_32 ('S', 'T', 'A', 'P') =20 #define CPU_INIT_MP_LIB_HOB_GUID \ diff --git a/UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf b/UefiCpuPkg/Lib= rary/MpInitLib/PeiMpInitLib.inf index 78eded96bf..1aacb9b4cf 100644 --- a/UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf +++ b/UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf @@ -36,6 +36,7 @@ MpLib.c MpLib.h Microcode.c + MpHandOff.h =20 [Packages] MdePkg/MdePkg.dec diff --git a/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c b/UefiCpuPkg/Library/M= pInitLib/PeiMpLib.c index 013f89b197..f80e00edcf 100644 --- a/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c +++ b/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c @@ -126,7 +126,37 @@ SaveCpuMpData ( IN CPU_MP_DATA *CpuMpData ) { - UINT64 Data64; + UINT64 Data64; + UINTN Index; + CPU_INFO_IN_HOB *CpuInfoInHob; + MP_HAND_OFF *MpHandOff; + UINTN MpHandOffSize; + + // + // When APs are in a state that can be waken up by a store operation to = a memory address, + // report the MP_HAND_OFF data for DXE to use. + // + CpuInfoInHob =3D (CPU_INFO_IN_HOB *)(UINTN)CpuMpData->CpuInfoInHob; + MpHandOffSize =3D sizeof (MP_HAND_OFF) + sizeof (PROCESSOR_HAND_OFF) * C= puMpData->CpuCount; + MpHandOff =3D (MP_HAND_OFF *)BuildGuidHob (&mMpHandOffGuid, MpHandOf= fSize); + ASSERT (MpHandOff !=3D NULL); + ZeroMem (MpHandOff, MpHandOffSize); + MpHandOff->ProcessorIndex =3D 0; + + MpHandOff->CpuCount =3D CpuMpData->CpuCount; + if (CpuMpData->ApLoopMode !=3D ApInHltLoop) { + MpHandOff->StartupSignalValue =3D MP_HAND_OFF_SIGNAL; + MpHandOff->WaitLoopExecutionMode =3D sizeof (VOID *); + } + + for (Index =3D 0; Index < MpHandOff->CpuCount; Index++) { + MpHandOff->Info[Index].ApicId =3D CpuInfoInHob[Index].ApicId; + MpHandOff->Info[Index].Health =3D CpuInfoInHob[Index].Health; + if (CpuMpData->ApLoopMode !=3D ApInHltLoop) { + MpHandOff->Info[Index].StartupSignalAddress =3D (UINT64)(UINTN)Cp= uMpData->CpuData[Index].StartupApSignal; + MpHandOff->Info[Index].StartupProcedureAddress =3D (UINT64)(UINTN)&C= puMpData->CpuData[Index].ApFunction; + } + } =20 // // Build location of CPU MP DATA buffer in HOB --=20 2.36.1.windows.1 -=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 (#106015): https://edk2.groups.io/g/devel/message/106015 Mute This Topic: https://groups.io/mt/99483093/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- From nobody Thu May 16 04:06:56 2024 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+106016+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+106016+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1686577141; cv=none; d=zohomail.com; s=zohoarc; b=ceNQGRjv2Ky+1unkBDQPAICaWkUUWb8h4BGPFrqK7/TlARQ5jEVSrfCm0OrFuosePw7WfByQUE3r+NhTyQCByV2K9is/WGRaAsTvrRHySojZ1l+/sL1KV0CIrsa51UUfQcRdmY65eCSGUUnljtsQJ4sAVPFbc/f8CF9yA7LFofE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1686577141; 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=xwoVnCRcJ2gGuat89Mgw/3hCOUGpEakbFP7gomd17hM=; b=Pco4zx8CCqSy0KrEEoHvXztptrMV5xnfzlwVR0YSGLbjkeYH6n60HJe/UeKjtV6/R8yupoL5ppLni++s47Chh3wQRAVtErZqZK/ZrGMvkR7Hos4EM4aE0tPZPSx2mIUO5bHNxysDWAHhJjbiapaM4OqDN1/F33RJmEmuNUbO4Fs= 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+106016+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 1686577141296116.4890901836585; Mon, 12 Jun 2023 06:39:01 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id 0e2CYY1788612xAXtGnlYD4N; Mon, 12 Jun 2023 06:39:01 -0700 X-Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by mx.groups.io with SMTP id smtpd.web11.58885.1686577140495656780 for ; Mon, 12 Jun 2023 06:39:00 -0700 X-IronPort-AV: E=McAfee;i="6600,9927,10739"; a="338400657" X-IronPort-AV: E=Sophos;i="6.00,236,1681196400"; d="scan'208";a="338400657" X-Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jun 2023 06:37:50 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10739"; a="958033001" X-IronPort-AV: E=Sophos;i="6.00,236,1681196400"; d="scan'208";a="958033001" X-Received: from shwdeopenlab705.ccr.corp.intel.com ([10.239.55.55]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jun 2023 06:37:48 -0700 From: "Yuanhao Xie" To: devel@edk2.groups.io Cc: Eric Dong , Ray Ni , Rahul Kumar , Yuanhao Xie Subject: [edk2-devel] [PATCH 2/5] UefiCpuPkg: Refactor the logic for placing APs in HltLoop. Date: Mon, 12 Jun 2023 21:37:17 +0800 Message-Id: <20230612133720.15501-3-yuanhao.xie@intel.com> In-Reply-To: <20230612133720.15501-1-yuanhao.xie@intel.com> References: <20230612133720.15501-1-yuanhao.xie@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,yuanhao.xie@intel.com X-Gm-Message-State: ddLE2XzzGGj10A0PaEvkRHqYx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1686577141; bh=AI4IjcRHgaHUcNsIr6E3hFphZfrkWhl0ABl7pnle+GA=; h=Cc:Date:From:Reply-To:Subject:To; b=leCsXchMNZ6dEHTqf+L1hhCdbibfAb5y/sX4p2GWzWeQqL1eEB01bQ6jydQDH6fcXF9 QNIecM3pZfkfau1AfwDFcXTqGHalcg7tSTNg7sB5pVWmTC0RdOUVeWenqEZllmc3rI1bp 0Sp5NoyawcqHORKLn85l2K2kGP7fuuoAl1E= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1686577142135100001 Content-Type: text/plain; charset="utf-8" Refactor the logic for placing APs in HltLoop into a separate function. Cc: Eric Dong Cc: Ray Ni Cc: Rahul Kumar Signed-off-by: Yuanhao Xie --- UefiCpuPkg/Library/MpInitLib/MpLib.c | 35 ++++++++++++++++++++++++--------= --- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpIn= itLib/MpLib.c index c55150e7b6..4e517a9b19 100644 --- a/UefiCpuPkg/Library/MpInitLib/MpLib.c +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c @@ -637,6 +637,28 @@ InitializeApData ( SetApState (&CpuMpData->CpuData[ProcessorNumber], CpuStateIdle); } =20 +/** + This function place APs in Halt loop. + + @param[in] CpuMpData Pointer to CPU MP Data +**/ +VOID +PlaceAPInHltLoop ( + IN CPU_MP_DATA *CpuMpData + ) +{ + while (TRUE) { + DisableInterrupts (); + if (CpuMpData->UseSevEsAPMethod) { + SevEsPlaceApHlt (CpuMpData); + } else { + CpuSleep (); + } + + CpuPause (); + } +} + /** This function will be called from AP reset code if BSP uses WakeUpAP. =20 @@ -813,19 +835,10 @@ ApWakeupFunction ( // Place AP is specified loop mode // if (CpuMpData->ApLoopMode =3D=3D ApInHltLoop) { + PlaceAPInHltLoop (CpuMpData); // - // Place AP in HLT-loop + // Never run here // - while (TRUE) { - DisableInterrupts (); - if (CpuMpData->UseSevEsAPMethod) { - SevEsPlaceApHlt (CpuMpData); - } else { - CpuSleep (); - } - - CpuPause (); - } } =20 while (TRUE) { --=20 2.36.1.windows.1 -=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 (#106016): https://edk2.groups.io/g/devel/message/106016 Mute This Topic: https://groups.io/mt/99483116/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- From nobody Thu May 16 04:06:56 2024 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+106017+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+106017+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1686577141; cv=none; d=zohomail.com; s=zohoarc; b=lAo044aQAZ1DIlpV/oHZvGCT/7hXqwIsK7ly4a3mJa+Ec9kBrzqo+cGYwhNL5AHdSOcD/I7SgKXTBehJd1zzabTiwcZoG96R1ssTun7uLs8YsxYkoJpj1xO7wf4rwHTXlU66Y4ojW42Q8CVBsw2XhE7+YJUvRvOtqHamxyxCGCw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1686577141; 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=CKmVOUpI7gk7wIKJmrO7Pi0YQNxidegYm31vjFNUZME=; b=IZTOZ6Ai2SZSmUvDYSd73yZVT2S0OlkryntctVwaf0iHeUNr39JPtnGXxjh6ZTIE9TJFkzqNjXrzx0DXD4ipoVUYxq0B26b12G2ym6YgKHVDxpFAlV+QRYMhDMJNkTO/6s8GuAY3E9YDE0C/+4ToWJo2ZXsrYWiHOjHWe40Z8cI= 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+106017+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 1686577141931670.9648090456537; Mon, 12 Jun 2023 06:39:01 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id 8ZsXYY1788612xSYBPSy79j6; Mon, 12 Jun 2023 06:39:01 -0700 X-Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by mx.groups.io with SMTP id smtpd.web11.58885.1686577140495656780 for ; Mon, 12 Jun 2023 06:39:00 -0700 X-IronPort-AV: E=McAfee;i="6600,9927,10739"; a="338400664" X-IronPort-AV: E=Sophos;i="6.00,236,1681196400"; d="scan'208";a="338400664" X-Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jun 2023 06:37:52 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10739"; a="958033011" X-IronPort-AV: E=Sophos;i="6.00,236,1681196400"; d="scan'208";a="958033011" X-Received: from shwdeopenlab705.ccr.corp.intel.com ([10.239.55.55]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jun 2023 06:37:51 -0700 From: "Yuanhao Xie" To: devel@edk2.groups.io Cc: Eric Dong , Ray Ni , Rahul Kumar , Yuanhao Xie Subject: [edk2-devel] [PATCH 3/5] UefiCpuPkg: Refactor the logic for placing APs in Mwait/Runloop. Date: Mon, 12 Jun 2023 21:37:18 +0800 Message-Id: <20230612133720.15501-4-yuanhao.xie@intel.com> In-Reply-To: <20230612133720.15501-1-yuanhao.xie@intel.com> References: <20230612133720.15501-1-yuanhao.xie@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,yuanhao.xie@intel.com X-Gm-Message-State: NrX9hQCBsf1Bt2l0U66bp3a6x1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1686577141; bh=OINWyCSxZcuQWEcA4qwAvcLdMdWgRiBHfmdL2WEI5N4=; h=Cc:Date:From:Reply-To:Subject:To; b=qvfn/BpSWfDCIMwdhtQ+xz1mgUVirLhTSXq6PkSG3uDOz6NzEf9FsH1cwzvRG25f+WY szSsUpHv+AklEdD7dC6Dbb0tPmEVbYJld5RA50+g+KQOFYZMnYAp/9P1wiPEG6u7jDOKP 69tLoxFFLaoS5hlIlWH7/R/OZG6ujqaWNWs= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1686577143931100011 Content-Type: text/plain; charset="utf-8" Refactor the logic for placing APs in Mwait/Runloop into a separate function. Cc: Eric Dong Cc: Ray Ni Cc: Rahul Kumar Signed-off-by: Yuanhao Xie --- UefiCpuPkg/Library/MpInitLib/MpLib.c | 83 ++++++++++++++++++++++++++++++++= ++++++++++++++++++--------------------------------- 1 file changed, 50 insertions(+), 33 deletions(-) diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpIn= itLib/MpLib.c index 4e517a9b19..8aecd29a94 100644 --- a/UefiCpuPkg/Library/MpInitLib/MpLib.c +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c @@ -659,6 +659,54 @@ PlaceAPInHltLoop ( } } =20 +/** + This function place APs in Mwait or Run loop. + + @param[in] ApLoopMode Ap Loop Mode + @param[in] ApStartupSignalBuffer Pointer to Ap Startup Signal Buf= fer + @param[in] ApTargetCState Ap Target CState +**/ +VOID +PlaceAPInMwaitLoopOrRunLoop ( + IN UINT8 ApLoopMode, + IN volatile UINT32 *ApStartupSignalBuffer, + IN UINT8 ApTargetCState + ) +{ + while (TRUE) { + DisableInterrupts (); + if (ApLoopMode =3D=3D ApInMwaitLoop) { + // + // Place AP in MWAIT-loop + // + AsmMonitor ((UINTN)ApStartupSignalBuffer, 0, 0); + if ((*ApStartupSignalBuffer !=3D WAKEUP_AP_SIGNAL) && (*ApStartupSig= nalBuffer !=3D MP_HAND_OFF_SIGNAL)) { + // + // Check AP start-up signal again. + // If AP start-up signal is not set, place AP into + // the specified C-state + // + AsmMwait (ApTargetCState << 4, 0); + } + } else if (ApLoopMode =3D=3D ApInRunLoop) { + // + // Place AP in Run-loop + // + CpuPause (); + } else { + ASSERT (FALSE); + } + + // + // If AP start-up signal is written, AP is waken up + // otherwise place AP in loop again + // + if ((*ApStartupSignalBuffer =3D=3D WAKEUP_AP_SIGNAL) || (*ApStartupSig= nalBuffer =3D=3D MP_HAND_OFF_SIGNAL)) { + break; + } + } +} + /** This function will be called from AP reset code if BSP uses WakeUpAP. =20 @@ -839,39 +887,8 @@ ApWakeupFunction ( // // Never run here // - } - - while (TRUE) { - DisableInterrupts (); - if (CpuMpData->ApLoopMode =3D=3D ApInMwaitLoop) { - // - // Place AP in MWAIT-loop - // - AsmMonitor ((UINTN)ApStartupSignalBuffer, 0, 0); - if (*ApStartupSignalBuffer !=3D WAKEUP_AP_SIGNAL) { - // - // Check AP start-up signal again. - // If AP start-up signal is not set, place AP into - // the specified C-state - // - AsmMwait (CpuMpData->ApTargetCState << 4, 0); - } - } else if (CpuMpData->ApLoopMode =3D=3D ApInRunLoop) { - // - // Place AP in Run-loop - // - CpuPause (); - } else { - ASSERT (FALSE); - } - - // - // If AP start-up signal is written, AP is waken up - // otherwise place AP in loop again - // - if (*ApStartupSignalBuffer =3D=3D WAKEUP_AP_SIGNAL) { - break; - } + } else { + PlaceAPInMwaitLoopOrRunLoop (CpuMpData->ApLoopMode, ApStartupSignalB= uffer, CpuMpData->ApTargetCState); } } } --=20 2.36.1.windows.1 -=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 (#106017): https://edk2.groups.io/g/devel/message/106017 Mute This Topic: https://groups.io/mt/99483117/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- From nobody Thu May 16 04:06:56 2024 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+106018+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+106018+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1686577142; cv=none; d=zohomail.com; s=zohoarc; b=Zd0V1fXi6/80LU+17sJHqEcXtTouSjc7QG5DTDqBCcaJ0UbM+3MxNq3lmnJbqaU0zH5KU8mfYaxmoIvYUjApFS6EKnP9TRNWTA3S3KnSKsShQb1m6y3i2SvT81Omnx1FsuceBOjsgEiCfz2mjq/QG++/d5JJuOOgFZyxr4jigfE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1686577142; 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=cwLSWmpsbnCfO+HLtS7HJB1OormjQhQklnvxnp9LqcM=; b=OCKlKFDt7vTXXX+MjIkdTLlraIVkSDrRCI3N71H4Dussw/Mf4PTqtqulz557M4Tm3dvRHF57YjT5HeU90o1dffN2/3I4NRZLTA9VXMG8/R9kh6Vs0RFICo3Bmx7y77uafW/N3C+a4LOkBcjNwa3Wovzz3r+9JLgXAqiYeVrVvtM= 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+106018+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 1686577142528346.0517796881619; Mon, 12 Jun 2023 06:39:02 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id YJBuYY1788612xFbyeo3Oom0; Mon, 12 Jun 2023 06:39:02 -0700 X-Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by mx.groups.io with SMTP id smtpd.web11.58885.1686577140495656780 for ; Mon, 12 Jun 2023 06:39:01 -0700 X-IronPort-AV: E=McAfee;i="6600,9927,10739"; a="338400670" X-IronPort-AV: E=Sophos;i="6.00,236,1681196400"; d="scan'208";a="338400670" X-Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jun 2023 06:37:56 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10739"; a="958033017" X-IronPort-AV: E=Sophos;i="6.00,236,1681196400"; d="scan'208";a="958033017" X-Received: from shwdeopenlab705.ccr.corp.intel.com ([10.239.55.55]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jun 2023 06:37:53 -0700 From: "Yuanhao Xie" To: devel@edk2.groups.io Cc: Gerd Hoffmann , Eric Dong , Ray Ni , Rahul Kumar , Tom Lendacky , Yuanhao Xie Subject: [edk2-devel] [PATCH 4/5] UefiCpuPkg: ApWakeupFunction directly use CpuMpData. Date: Mon, 12 Jun 2023 21:37:19 +0800 Message-Id: <20230612133720.15501-5-yuanhao.xie@intel.com> In-Reply-To: <20230612133720.15501-1-yuanhao.xie@intel.com> References: <20230612133720.15501-1-yuanhao.xie@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,yuanhao.xie@intel.com X-Gm-Message-State: ujWljZJ4naoWMaJwFOeOBsASx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1686577142; bh=0cY3Vth7LiNGb0NY/DbW52pxp8H0jexXUaJcl2EnCBg=; h=Cc:Date:From:Reply-To:Subject:To; b=UppjAaWUpZQz+WMp9OOV9U2VZlDexYhJD5Eq2G5iJFIQlpJhZCxRo6rJCd7Iu2iBIb4 3apHhI6n5j6aJuO/W0o+9zy3AIIRXLYgx9x8x5h0B0X4FiLBtW8PtSUJaBdCgGqcItx21 SEVh/bpG1T3AZZGwo3AtfXcVkWsGZ6XDqr4= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1686577143747100007 Content-Type: text/plain; charset="utf-8" CpuMpData can be passed directly to the ApWakeUpFunction instead of through MP_CPU_EXCHANGE_INFO. This modification is made in preparation for eliminating the requirement of a second INIT-SIPI-SIPI sequence in the DXE phase. Cc: Gerd Hoffmann Cc: Eric Dong Cc: Ray Ni Cc: Rahul Kumar Cc: Tom Lendacky Signed-off-by: Yuanhao Xie --- UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm | 4 ++-- UefiCpuPkg/Library/MpInitLib/MpLib.c | 12 +++--------- UefiCpuPkg/Library/MpInitLib/X64/MpFuncs.nasm | 3 +-- 3 files changed, 6 insertions(+), 13 deletions(-) diff --git a/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm b/UefiCpuPkg/Li= brary/MpInitLib/Ia32/MpFuncs.nasm index 59db4081d6..d117f09ef5 100644 --- a/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm +++ b/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm @@ -197,8 +197,8 @@ CProcedureInvoke: =20 push ebx ; Push ApIndex mov eax, esi - add eax, MP_CPU_EXCHANGE_INFO_OFFSET - push eax ; push address of exchange info data buff= er + add eax, MP_CPU_EXCHANGE_INFO_FIELD (CpuMpData) + push dword [eax] ; push address of CpuMpData =20 mov edi, esi add edi, MP_CPU_EXCHANGE_INFO_FIELD (CFunction) diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpIn= itLib/MpLib.c index 8aecd29a94..e56f2455dc 100644 --- a/UefiCpuPkg/Library/MpInitLib/MpLib.c +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c @@ -710,17 +710,16 @@ PlaceAPInMwaitLoopOrRunLoop ( /** This function will be called from AP reset code if BSP uses WakeUpAP. =20 - @param[in] ExchangeInfo Pointer to the MP exchange info buffer + @param[in] CpuMpData Pointer to CPU MP Data @param[in] ApIndex Number of current executing AP **/ VOID EFIAPI ApWakeupFunction ( - IN MP_CPU_EXCHANGE_INFO *ExchangeInfo, - IN UINTN ApIndex + IN CPU_MP_DATA *CpuMpData, + IN UINTN ApIndex ) { - CPU_MP_DATA *CpuMpData; UINTN ProcessorNumber; EFI_AP_PROCEDURE Procedure; VOID *Parameter; @@ -731,11 +730,6 @@ ApWakeupFunction ( UINTN CurrentApicMode; AP_STACK_DATA *ApStackData; =20 - // - // AP finished assembly code and begin to execute C code - // - CpuMpData =3D ExchangeInfo->CpuMpData; - // // AP's local APIC settings will be lost after received INIT IPI // We need to re-initialize them at here diff --git a/UefiCpuPkg/Library/MpInitLib/X64/MpFuncs.nasm b/UefiCpuPkg/Lib= rary/MpInitLib/X64/MpFuncs.nasm index 5bcdf7726b..40e80ffab4 100644 --- a/UefiCpuPkg/Library/MpInitLib/X64/MpFuncs.nasm +++ b/UefiCpuPkg/Library/MpInitLib/X64/MpFuncs.nasm @@ -259,8 +259,7 @@ CProcedureInvoke: add rsp, 20h =20 mov edx, ebx ; edx is ApIndex - mov ecx, esi - add ecx, MP_CPU_EXCHANGE_INFO_OFFSET ; rcx is address of exchan= ge info data buffer + mov rcx, qword [esi + MP_CPU_EXCHANGE_INFO_FIELD (CpuMpData)] =20 mov edi, esi add edi, MP_CPU_EXCHANGE_INFO_FIELD (CFunction) --=20 2.36.1.windows.1 -=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 (#106018): https://edk2.groups.io/g/devel/message/106018 Mute This Topic: https://groups.io/mt/99483118/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- From nobody Thu May 16 04:06:56 2024 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+106019+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+106019+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1686577142; cv=none; d=zohomail.com; s=zohoarc; b=ErRPY3rc7yc5tHiMEeRqN9MsXpzhWMPta6L/QVNNsA34ItY6eca7cOAO/DiKJ/JjMtwABV6y80PlYWX9rGcxV99Rg0rbP/2W1d7ZuKnM4h8RbMoy6ezdgWpUsg9YCubw3mGIDw3PicYQBpDPGLjQ/j9yNO9R8kcK2+xuEY63uWY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1686577142; 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=kXR8AVo5y202sjLzp/touGnmVB0WawrtWIg3ANsG+r4=; b=hmZE9h+KqMCrv9FPKbgrVwv/Ah6q2nCzVzSf3nEOQvZjjgp/OQ8eT3l4Wqp1npemnyWos59GaSiXrSXRfo4e3cIyD4WCTo6nMWzW4pbhARv/fzDJv/8H5NUS9w1e7qhvw3naGwz7K6JWEWwlhQ6w1Lya6H6b741mQ/BnLGERiKo= 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+106019+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 1686577142552818.7103639476603; Mon, 12 Jun 2023 06:39:02 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id 4vnEYY1788612x051aIblp2A; Mon, 12 Jun 2023 06:39:02 -0700 X-Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by mx.groups.io with SMTP id smtpd.web11.58885.1686577140495656780 for ; Mon, 12 Jun 2023 06:39:01 -0700 X-IronPort-AV: E=McAfee;i="6600,9927,10739"; a="338400675" X-IronPort-AV: E=Sophos;i="6.00,236,1681196400"; d="scan'208";a="338400675" X-Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jun 2023 06:38:00 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10739"; a="958033021" X-IronPort-AV: E=Sophos;i="6.00,236,1681196400"; d="scan'208";a="958033021" X-Received: from shwdeopenlab705.ccr.corp.intel.com ([10.239.55.55]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jun 2023 06:37:56 -0700 From: "Yuanhao Xie" To: devel@edk2.groups.io Cc: Gerd Hoffmann , Eric Dong , Ray Ni , Rahul Kumar , Tom Lendacky , Yuanhao Xie Subject: [edk2-devel] [PATCH 5/5] UefiCpuPkg: Eliminate the second INIT-SIPI-SIPI sequence. Date: Mon, 12 Jun 2023 21:37:20 +0800 Message-Id: <20230612133720.15501-6-yuanhao.xie@intel.com> In-Reply-To: <20230612133720.15501-1-yuanhao.xie@intel.com> References: <20230612133720.15501-1-yuanhao.xie@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,yuanhao.xie@intel.com X-Gm-Message-State: pb2zXOqkrEPYClH8wpHinJTAx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1686577142; bh=cPJ0Jpbt2S51m+sFqtEEiUmhWwUwFFfnKzcQKfxBb8I=; h=Cc:Date:From:Reply-To:Subject:To; b=i6Xoen/moMCPTVhhgQtMqIo3Mdp7R5fsppPCuBnS6P2S4dOQHQRDNYmSsDIEpWk7hbG +FSPD9U9f210qLfZDgumlOsu5MWQUeXc9wISqnBCa5oYp29m0qY7Eb5Q3oLBGF1OWWSnz g8thPLlyFDvsJW6bWf4dZ91tCehtw1gxJtk= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1686577143916100010 Content-Type: text/plain; charset="utf-8" When both the PEI and DXE phases operate in the same execution mode(32-bit/64-bit), the BSP send a special start-up signal during the DXE phase to awaken the Application APs. To eliminate the need for the INIT-SIPI-SIPI sequence at the beginning of the DXE phase, the BSP call the SwitchApContext function to trigger the special start-up signal. By writing the specified StartupSignalValue to the designated StartupSignalAddress, the BSP wakes up the APs from mwait mode. Once the APs receive the MP_HAND_OFF_SIGNAL value, they are awakened and proceed to execute the SwitchContextPerAp procedure. They enter another while loop, transitioning their context from the PEI phase to the DXE phase. The original state transitions for an AP during the procedure are as follows: Idle ----> Ready ----> Busy ----> Idle [BSP] [AP] [AP] Instead of init-sipi-sipi sequence, we make use of a start-up signal to awaken the APs and transfer their context from PEI to DXE. Consequently, APs, rather than the BSP, to set their state to CpuStateReady. Cc: Gerd Hoffmann Cc: Eric Dong Cc: Ray Ni Cc: Rahul Kumar Cc: Tom Lendacky Signed-off-by: Yuanhao Xie --- UefiCpuPkg/Library/MpInitLib/MpLib.c | 130 +++++++++++++++++++++++++++++++= +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= ++++++++++++++++++++++++ UefiCpuPkg/Library/MpInitLib/MpLib.h | 8 ++++++++ 2 files changed, 138 insertions(+) diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpIn= itLib/MpLib.c index e56f2455dc..325710b442 100644 --- a/UefiCpuPkg/Library/MpInitLib/MpLib.c +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c @@ -729,6 +729,7 @@ ApWakeupFunction ( UINT64 ApTopOfStack; UINTN CurrentApicMode; AP_STACK_DATA *ApStackData; + UINT32 OriginalValue; =20 // // AP's local APIC settings will be lost after received INIT IPI @@ -769,6 +770,15 @@ ApWakeupFunction ( // Clear AP start-up signal when AP waken up // ApStartupSignalBuffer =3D CpuMpData->CpuData[ProcessorNumber].Startu= pApSignal; + OriginalValue =3D InterlockedCompareExchange32 ( + (UINT32 *)ApStartupSignalBuffer, + MP_HAND_OFF_SIGNAL, + 0 + ); + if (OriginalValue =3D=3D MP_HAND_OFF_SIGNAL) { + SetApState (&CpuMpData->CpuData[ProcessorNumber], CpuStateReady); + } + InterlockedCompareExchange32 ( (UINT32 *)ApStartupSignalBuffer, WAKEUP_AP_SIGNAL, @@ -887,6 +897,31 @@ ApWakeupFunction ( } } =20 +/** + This function serves as the entry point for APs when + they are awakened by the stores in the memory address + indicated by the MP_HANDOFF_INFO structure. + @param[in] CpuMpData Pointer to PEI CPU MP Data +**/ +VOID +EFIAPI +DxeApEntryPoint ( + CPU_MP_DATA *CpuMpData + ) +{ + UINTN ProcessorNumber; + + GetProcessorNumber (CpuMpData, &ProcessorNumber); + InterlockedIncrement ((UINT32 *)&CpuMpData->FinishedCount); + RestoreVolatileRegisters (&CpuMpData->CpuData[0].VolatileRegisters, FALS= E); + PlaceAPInMwaitLoopOrRunLoop ( + CpuMpData->ApLoopMode, + CpuMpData->CpuData[ProcessorNumber].StartupApSignal, + CpuMpData->ApTargetCState + ); + ApWakeupFunction (CpuMpData, ProcessorNumber); +} + /** Wait for AP wakeup and write AP start-up signal till AP is waken up. =20 @@ -1857,6 +1892,68 @@ AmdSevUpdateCpuMpData ( OldCpuMpData->NewCpuMpData =3D CpuMpData; } =20 +/** + Switch Context for each AP. +**/ +VOID +EFIAPI +SwitchContextPerAp ( + VOID + ) +{ + UINTN ProcessorNumber; + CPU_MP_DATA *CpuMpData; + CPU_INFO_IN_HOB *CpuInfoInHob; + + CpuMpData =3D GetCpuMpData (); + CpuInfoInHob =3D (CPU_INFO_IN_HOB *)(UINTN)CpuMpData->CpuInfoInHob; + GetProcessorNumber (CpuMpData, &ProcessorNumber); + + SwitchStack ( + (SWITCH_STACK_ENTRY_POINT)(UINTN)DxeApEntryPoint, + (VOID *)(UINTN)CpuMpData, + NULL, + (VOID *)((UINTN)CpuInfoInHob[ProcessorNumber].ApTopOfStack) + ); +} + +/** + This function is intended to be invoked by the BSP in order + to wake up the AP. The BSP accomplishes this by triggering a + start-up signal, which in turn causes any APs that are + currently in a loop on the PEI-prepared memory to awaken and + begin running the procedure called SwitchContextPerAp. + This procedure allows the AP to switch to another section of + memory and continue its loop there. + @param[in] MpHandOff Pointer to MP hand-off data structure. +**/ +VOID +SwitchApContext ( + IN MP_HAND_OFF *MpHandOff + ) +{ + UINTN Index; + UINT32 BspNumber; + + BspNumber =3D GetBspNumber (MpHandOff); + + for (Index =3D 0; Index < MpHandOff->CpuCount; Index++) { + if (Index !=3D BspNumber) { + *(UINTN *)(UINTN)MpHandOff->Info[Index].StartupProcedureAddress =3D = (UINTN)SwitchContextPerAp; + *(UINT32 *)(UINTN)MpHandOff->Info[Index].StartupSignalAddress =3D = MpHandOff->StartupSignalValue; + } + } + + // + // Wait all APs waken up if this is not the 1st broadcast of SIPI + // + for (Index =3D 0; Index < MpHandOff->CpuCount; Index++) { + if (Index !=3D BspNumber) { + WaitApWakeup ((UINT32 *)(UINTN)(MpHandOff->Info[Index].StartupSignal= Address)); + } + } +} + /** MP Initialize Library initialization. =20 @@ -2068,6 +2165,39 @@ MpInitLibInitialize ( CpuInfoInHob[Index].ApicId =3D MpHandOff->Info[Index].Apic= Id; CpuInfoInHob[Index].Health =3D MpHandOff->Info[Index].Heal= th; } + + DEBUG ((DEBUG_INFO, "MpHandOff->WaitLoopExecutionMode: %04d, sizeof (V= OID *): %04d\n", MpHandOff->WaitLoopExecutionMode, sizeof (VOID *))); + if (MpHandOff->WaitLoopExecutionMode =3D=3D sizeof (VOID *)) { + // + // In scenarios where both the PEI and DXE phases run in the same + // execution mode (32bit or 64bit), the BSP triggers + // a start-up signal during the DXE phase to wake up the APs. This c= auses any + // APs that are currently in a loop on the memory prepared during th= e PEI + // phase to awaken and run the SwitchContextPerAp procedure. This pr= ocedure + // enables the APs to switch to a different memory section and conti= nue their + // looping process there. + // + CpuMpData->FinishedCount =3D 0; + CpuMpData->InitFlag =3D ApInitDone; + SaveCpuMpData (CpuMpData); + SwitchApContext (MpHandOff); + ASSERT (CpuMpData->FinishedCount =3D=3D (CpuMpData->CpuCount - 1)); + + // + // Set Apstate as Idle, otherwise Aps cannot be waken-up again. + // If any enabled AP is not idle, return EFI_NOT_READY during waken-= up. + // + for (Index =3D 0; Index < CpuMpData->CpuCount; Index++) { + SetApState (&CpuMpData->CpuData[Index], CpuStateIdle); + } + + // + // Initialize global data for MP support + // + InitMpGlobalData (CpuMpData); + + return EFI_SUCCESS; + } } =20 if (!GetMicrocodePatchInfoFromHob ( diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.h b/UefiCpuPkg/Library/MpIn= itLib/MpLib.h index 9bb70415f3..2e7d1a0af5 100644 --- a/UefiCpuPkg/Library/MpInitLib/MpLib.h +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.h @@ -467,6 +467,14 @@ GetWakeupBuffer ( IN UINTN WakeupBufferSize ); =20 +/** + Switch Context for each AP. +**/ +VOID +SwitchApContext ( + IN MP_HAND_OFF *MpHandOff + ); + /** Get available EfiBootServicesCode memory below 4GB by specified size. =20 --=20 2.36.1.windows.1 -=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 (#106019): https://edk2.groups.io/g/devel/message/106019 Mute This Topic: https://groups.io/mt/99483119/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-