From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail05.groups.io (mail05.groups.io [45.79.224.7]) by spool.mail.gandi.net (Postfix) with ESMTPS id 426B9AC09A6 for ; Thu, 23 May 2024 02:48:31 +0000 (UTC) DKIM-Signature: a=rsa-sha256; bh=iWuaHH8vHf+8SFgTaL8JmROutbetrt8A3vQOQa0Fu7A=; c=relaxed/simple; d=groups.io; h=From:To:Cc:Subject:Date:Message-Id:MIME-Version:Precedence:List-Subscribe:List-Help:Sender:List-Id:Mailing-List:Delivered-To:Resent-Date:Resent-From:Reply-To:List-Unsubscribe-Post:List-Unsubscribe:Content-Transfer-Encoding; s=20240206; t=1716432509; v=1; b=36kYeCK8f3hocSFvQsV4FrOiBXuEKw2HCQER2WqSLRmPrcEel4KId+3/tloU+AKN+MNawPux 3hKA7uWSMY4ndKAkajxSbPaB5StkREBRSlNE1uHHcRzb3nW3AUPhGGGupjSMHX6GnJcDtJSAJOC Hv9TO1WC37xzbhLMTKWDJrOFyozYWGkQObrhLYjoPGPXIZPM35e68h/1sS6AFBXnlHA+zEp9stQ PCxPedWsQngh4p+xaa98PEjXbJg0XGzBdIlSAeZSw9Wt2Ct9x/xOYHPe/1dCqHE8iBqYxN3qi2F xbKP3YLTLziNsR9gqHzTbGOazJBmmE/tbmTAbjsyEYR4w== X-Received: by 127.0.0.2 with SMTP id STb9YY7687511xDtrCx7ZglU; Wed, 22 May 2024 19:48:29 -0700 X-Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.17]) by mx.groups.io with SMTP id smtpd.web11.8165.1716432507951713588 for ; Wed, 22 May 2024 19:48:28 -0700 X-CSE-ConnectionGUID: hxcLI7H7ST6fIBH7zni8BQ== X-CSE-MsgGUID: zy1CxprQRjuwDjEaDQqlcQ== X-IronPort-AV: E=McAfee;i="6600,9927,11080"; a="12598409" X-IronPort-AV: E=Sophos;i="6.08,181,1712646000"; d="scan'208";a="12598409" X-Received: from orviesa005.jf.intel.com ([10.64.159.145]) by fmvoesa111.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 22 May 2024 19:48:28 -0700 X-CSE-ConnectionGUID: Z4mSn77ORUa0UD/oFTE07g== X-CSE-MsgGUID: tWM6ro8EQkm68BAX8IwtAA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.08,181,1712646000"; d="scan'208";a="38345984" X-Received: from unknown (HELO shsse002.sh.intel.com) ([10.239.132.247]) by orviesa005.jf.intel.com with ESMTP; 22 May 2024 19:48:27 -0700 From: "Ning Feng" To: devel@edk2.groups.io Cc: Ning Feng , Ray Ni , Jiaxin Wu Subject: [edk2-devel] [PATCH] Pkg-Module:UefiCpuPkg/MpLib Date: Thu, 23 May 2024 07:13:03 -0400 Message-Id: <20240523111303.2929615-1-ning.feng@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 Resent-Date: Wed, 22 May 2024 19:48:28 -0700 Resent-From: ning.feng@intel.com Reply-To: devel@edk2.groups.io,ning.feng@intel.com List-Unsubscribe-Post: List-Unsubscribe=One-Click List-Unsubscribe: X-Gm-Message-State: limTjaGTjNvHfwTUFsk75Blsx7686176AA= Content-Transfer-Encoding: quoted-printable X-GND-Status: LEGIT Authentication-Results: spool.mail.gandi.net; dkim=pass header.d=groups.io header.s=20240206 header.b=36kYeCK8; 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 45.79.224.7 as permitted sender) smtp.mailfrom=bounce@groups.io REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3D4778=0D MPlib have wrong expectation that bsp id should always be 0 in=0D MpInitLibInitialize(), SwitchBsp(),ApWakeupFunction().=0D That will caused the data mismatch, if the beginning bsp is not 0.=0D Use CpuMpData->NewBspNumber insted of index 0 to avoid the issue.=0D Cc: Ray Ni =0D Cc: Jiaxin Wu =0D Signed-off-by: Ning Feng =0D ---=0D UefiCpuPkg/Library/MpInitLib/MpLib.c | 34 +++++++++++++++++++---------=0D 1 file changed, 23 insertions(+), 11 deletions(-)=0D =0D diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpIn= itLib/MpLib.c=0D index d724456502..3834f7236e 100644=0D --- a/UefiCpuPkg/Library/MpInitLib/MpLib.c=0D +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c=0D @@ -114,6 +114,10 @@ FutureBSPProc (=0D SaveVolatileRegisters (&DataInHob->APInfo.VolatileRegisters);=0D AsmExchangeRole (&DataInHob->APInfo, &DataInHob->BSPInfo);=0D RestoreVolatileRegisters (&DataInHob->APInfo.VolatileRegisters, FALSE);= =0D + //=0D + // Restore VolatileReg saved in CpuMpData->CpuData=0D + //=0D + CopyMem (&DataInHob->CpuData[DataInHob->BspNumber].VolatileRegisters, &D= ataInHob->APInfo.VolatileRegisters, sizeof(CPU_VOLATILE_REGISTERS));=0D }=0D =0D /**=0D @@ -761,11 +765,11 @@ ApWakeupFunction (=0D BistData =3D (UINT32)ApStackData->Bist;=0D =0D //=0D - // CpuMpData->CpuData[0].VolatileRegisters is initialized based on B= SP environment,=0D + // CpuMpData->CpuData[BspNumber].VolatileRegisters is initialized ba= sed on BSP environment,=0D // to initialize AP in InitConfig path.=0D - // NOTE: IDTR.BASE stored in CpuMpData->CpuData[0].VolatileRegisters= points to a different IDT shared by all APs.=0D + // NOTE: IDTR.BASE stored in CpuMpData->CpuData[BspNumber].VolatileR= egisters points to a different IDT shared by all APs.=0D //=0D - RestoreVolatileRegisters (&CpuMpData->CpuData[0].VolatileRegisters, = FALSE);=0D + RestoreVolatileRegisters (&CpuMpData->CpuData[CpuMpData->BspNumber].= VolatileRegisters, FALSE);=0D InitializeApData (CpuMpData, ProcessorNumber, BistData, ApTopOfStack= );=0D ApStartupSignalBuffer =3D CpuMpData->CpuData[ProcessorNumber].Startu= pApSignal;=0D } else {=0D @@ -798,10 +802,10 @@ ApWakeupFunction (=0D // 1. AP is re-enabled after it's disabled, in either PEI or DXE p= hase.=0D // 2. AP is initialized in DXE phase.=0D // In either case, use the volatile registers value derived from B= SP.=0D - // NOTE: IDTR.BASE stored in CpuMpData->CpuData[0].VolatileRegiste= rs points to a=0D + // NOTE: IDTR.BASE stored in CpuMpData->CpuData[BspNumber].Volatil= eRegisters points to a=0D // different IDT shared by all APs.=0D //=0D - RestoreVolatileRegisters (&CpuMpData->CpuData[0].VolatileRegisters= , FALSE);=0D + RestoreVolatileRegisters (&CpuMpData->CpuData[CpuMpData->BspNumber= ].VolatileRegisters, FALSE);=0D } else {=0D if (CpuMpData->ApLoopMode =3D=3D ApInHltLoop) {=0D //=0D @@ -927,7 +931,7 @@ DxeApEntryPoint (=0D AsmWriteMsr64 (MSR_IA32_EFER, EferMsr.Uint64);=0D }=0D =0D - RestoreVolatileRegisters (&CpuMpData->CpuData[0].VolatileRegisters, FALS= E);=0D + RestoreVolatileRegisters (&CpuMpData->CpuData[CpuMpData->BspNumber].Vola= tileRegisters, FALSE);=0D InterlockedIncrement ((UINT32 *)&CpuMpData->FinishedCount);=0D PlaceAPInMwaitLoopOrRunLoop (=0D CpuMpData->ApLoopMode,=0D @@ -2151,7 +2155,11 @@ MpInitLibInitialize (=0D CpuMpData->BackupBufferSize =3D ApResetVectorSizeBelow1Mb;=0D CpuMpData->WakeupBuffer =3D (UINTN)-1;=0D CpuMpData->CpuCount =3D 1;=0D - CpuMpData->BspNumber =3D 0;=0D + if (MpHandOff =3D=3D NULL) {=0D + CpuMpData->BspNumber =3D 0;=0D + }else{=0D + CpuMpData->BspNumber =3D GetBspNumber (MpHandOff);=0D + }=0D CpuMpData->WaitEvent =3D NULL;=0D CpuMpData->SwitchBspFlag =3D FALSE;=0D CpuMpData->CpuData =3D (CPU_AP_DATA *)(CpuMpData + 1);=0D @@ -2186,11 +2194,11 @@ MpInitLibInitialize (=0D // Don't pass BSP's TR to APs to avoid AP init failure.=0D //=0D VolatileRegisters.Tr =3D 0;=0D - CopyMem (&CpuMpData->CpuData[0].VolatileRegisters, &VolatileRegisters, s= izeof (VolatileRegisters));=0D + CopyMem (&CpuMpData->CpuData[CpuMpData->BspNumber].VolatileRegisters, &V= olatileRegisters, sizeof (VolatileRegisters));=0D //=0D // Set BSP basic information=0D //=0D - InitializeApData (CpuMpData, 0, 0, CpuMpData->Buffer + ApStackSize);=0D + InitializeApData (CpuMpData, CpuMpData->BspNumber, 0, CpuMpData->Buffer = + ApStackSize * (CpuMpData->BspNumber+1));=0D //=0D // Save assembly code information=0D //=0D @@ -2536,7 +2544,6 @@ SwitchBSPWorker (=0D MSR_IA32_APIC_BASE_REGISTER ApicBaseMsr;=0D BOOLEAN OldInterruptState;=0D BOOLEAN OldTimerInterruptState;=0D -=0D //=0D // Save and Disable Local APIC timer interrupt=0D //=0D @@ -2615,7 +2622,12 @@ SwitchBSPWorker (=0D SaveVolatileRegisters (&CpuMpData->BSPInfo.VolatileRegisters);=0D AsmExchangeRole (&CpuMpData->BSPInfo, &CpuMpData->APInfo);=0D RestoreVolatileRegisters (&CpuMpData->BSPInfo.VolatileRegisters, FALSE);= =0D -=0D + //=0D + // Restore VolatileReg saved in CpuMpData->CpuData=0D + // Don't pass BSP's TR to APs to avoid AP init failure.=0D + //=0D + CopyMem (&CpuMpData->CpuData[CpuMpData->NewBspNumber].VolatileRegisters,= &CpuMpData->BSPInfo.VolatileRegisters, sizeof(CPU_VOLATILE_REGISTERS));=0D + CpuMpData->CpuData[CpuMpData->NewBspNumber].VolatileRegisters.Tr =3D 0;= =0D //=0D // Set the BSP bit of MSR_IA32_APIC_BASE on new BSP=0D //=0D --=0D 2.25.1=0D =0D -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#119127): https://edk2.groups.io/g/devel/message/119127 Mute This Topic: https://groups.io/mt/106256300/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=-