From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from MRWPR03CU001.outbound.protection.outlook.com (mail-francesouthazon11021099.outbound.protection.outlook.com [40.107.130.99]) by lore.virtuozzo.com (Postfix) with ESMTPS id 6D3418015B for ; Wed, 23 Sep 2026 13:30:33 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=y2EjvKdBuNFXHQD8/+PyfPJWAjhvD8FBzpNR0cyCvVXuXz1KPet0BlRcYf3/FQMFdD3JadQ5/VlblKIxJwEyf7PTIQp4Ds/FxsdpSbL8nyS+Q7PaJUXlvHvhGeDayZyKLiqG6xqBwRsAnYD55LTIoWiGW5KrdAo9R6+I/i9ueN5GihMzvWCiCFxcDLS4ptDXB/yy6l1xOVOaaE8NDKfyZOq7bFiCtDheyK4Nk3AZTV4TUn67QeA405Kqjbx5/M4hbtnISzKbVaANn+FmnmMYAlB9xg0roo1lRMdsdpOa0M73/d8dJuijNDjeb7uWLYAPihBuhH35/ToWr1K9mb1aDA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=Td5NvXLthTbU9uoajEo8WpYPoqmrMGE+hRtoEkoYkhA=; b=XjaaenMzHQ/RBGgLe3l/3nATyUTuQHdikb/Qt+k62PWuWBwmxWSpeDyslwAPxihI3xQyInEkJG6cOTO7n92sVattNDgn/yFaTZeAuo68WVKUPE0c5g+CiEXOsB26IYJ9AQtcp7VRx4VNQHcJrZE7M6TSuY3sBFl/14cTJPBJCvoMOHcZbOEkCo87mXgEeKMASDj8k4N1S0BCmiOUEb3CAllYHFWRSOWIhVW1L4f0zyrOKzHnj5cf7Hmsb7tNR/Xw7nMMst+h2VI7TFnXApf9LJfjI1i4V3JC+UORB54W4AbKO4Y/8x4iVuGKR01sIq0q9dZmfHhTTowU258oU7t63A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=virtuozzo.com; dmarc=pass action=none header.from=virtuozzo.com; dkim=pass header.d=virtuozzo.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Td5NvXLthTbU9uoajEo8WpYPoqmrMGE+hRtoEkoYkhA=; b=J3OBVPbgJ3FJM/FnNfb8/1aVebe5M8MH6xId4BlLVj3oaJQZ9K7eind7+UVwCbl8WNVOUMbQeOYmCqUipmQ9r1+Yyo41ynzjUvCD224Eb82Qs5iegYga/b+ruPK1iQMGMytth/jFD2ce4JV3pF5DlzGi7lku283ARZVr2rKBdfEtyg05hBFhQe5SulsqHQ7iLe7AdmeYnvzDYtz+ZLjTx6JR16UbK3uhW/fmjn/2f4ZtdmBdQnJqjq7qigQIXwUXoVc5EuH3m6jL0Bo4hJeYS05Pt2HcxpXQEhMd9eh4cGmDQIr8NgUdVuVSaQb6AU3m7UOhZ9YQ2vEyjuzyFsuAzQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=virtuozzo.com; Received: from VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) by AS8PR08MB6582.eurprd08.prod.outlook.com (2603:10a6:20b:339::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.13; Wed, 23 Sep 2026 13:30:32 +0000 Received: from VI0PR08MB10656.eurprd08.prod.outlook.com ([fe80::4e37:b189:ddcd:3dd8]) by VI0PR08MB10656.eurprd08.prod.outlook.com ([fe80::4e37:b189:ddcd:3dd8%7]) with mapi id 15.21.0451.014; Wed, 23 Sep 2026 13:30:32 +0000 Message-ID: <204fc73c-5c58-48a6-a481-2ff67c99936c@virtuozzo.com> Date: Wed, 23 Sep 2026 16:30:31 +0300 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH 2/2] UefiCpuPkg/MpInitLib: resend the Start-up IPI when an AP misses it #VSTOR-146639 To: "Denis V. Lunev" , svt-core@virtuozzo.com References: <20260921154406.1628753-1-den@openvz.org> <20260921154406.1628753-3-den@openvz.org> Content-Language: en-US From: Andrey Drobyshev In-Reply-To: <20260921154406.1628753-3-den@openvz.org> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-ClientProxiedBy: FR4P281CA0201.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:e5::17) To VI0PR08MB10656.eurprd08.prod.outlook.com (2603:10a6:800:20a::12) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI0PR08MB10656:EE_|AS8PR08MB6582:EE_ X-MS-Office365-Filtering-Correlation-Id: c890144e-b7d3-4a3a-352b-08df1976d74e X-LD-Processed: 0bc7f26d-0264-416e-a6fc-8352af79c58f,ExtAddr List-Id: svt-core@virtuozzo.com X-MS-Exchange-Transport-Rules-Loop: 1 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|23010399003|366016|376014|10067099003|5113699003|3023799007|6133799003|5023799004|18002099003|22082099003|56012099006|4143699003; X-Microsoft-Antispam-Message-Info: 3f6rf6yktRtRdU+m1PbZ2icaAeZA0OcYGP3oeSD26D3HCRT8/PX2BExmnMG4zgyrOtpmP7wAFYnfjnf/KCQE2wqFjTkR9gzTe+0MMCjcH4gOoYM0Y+kYBSlIzUG1YtkUjP3kc+LWmnwpr813epFDhuyP7WUV2HISCrnWrKV37vKoqEN+Sm/CQmK93n8tc8htE6j5wK3El48d/gOTYGJqQP4bNd59NCkuYB6kPsLH12bnI5hrJVqO26hFwfRdX0ULHfgft4STItPEa9aREwcR7ZsjulnbKHiBT1rSmkjJ5oP/A9VJkYQeDgL8OMJdQamvgVpCpeS9xHvppBqnsJ3LUbV3FnaSUqEIlklXFaPSwA7P7kKkv/wDsh5iR7rth/mS45rpSI4tAuFOeMAnvWvjBg/u6SGOswYCy6G4IacPdYO4LXZAXR+v7IO3NwIaNo6g3pg6TqYKddXKkhboU7a2DWsb9i5qh94uoimDYnsXQD78acZFN9zEtUpCAIQqs/IiMHH02FD8/fNcnYR3mHw0BDNKgYC7xZotReYJnruuuGUtRKNSf3i8HnGzoV/VxfqfdGI0wkU672Lwh6pru1xT4/9VJCFcc5rP9ynNMBDeRZfbQghko7NPZLFJ1Y1b1C8at7Lc339hSBaB2ll/XccPmDWmqYUia09K6cvRnT+fwlM= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:VI0PR08MB10656.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(23010399003)(366016)(376014)(10067099003)(5113699003)(3023799007)(6133799003)(5023799004)(18002099003)(22082099003)(56012099006)(4143699003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?QVljOHJXa0ZoMWVOWHFaRitBa2NVNVMraC91S3JBdlRCZ1lQMmlaSnpVcWI1?= =?utf-8?B?MkVVb01iaVFkNllnMkQwaVNvdURLSWVsZ3N1UEF2QnFjeHY4M01KeExWa2Zv?= =?utf-8?B?c000aWpIcEVjRU9YNDZkc0NsVkdqdWJSdlJ4dHVVV2ZMTjAzeGlGd1hHMWh0?= =?utf-8?B?cHRRd3ZOWGhzL1lWSHIzU2YweUhXb2REZ0h6Z1BYcEZlaTl4M2kraVA1eEJo?= =?utf-8?B?K0RWMjNWUUtZSndRL1M1TENITkdBellBcDVFRThycGdKVnVnV3RmdXhaL21F?= =?utf-8?B?SkQ4WjdoYndaZ0d5cEpSeWZ0bWVkcUg4Z25WSVlkQjZUY2VhWWt3SUJuT0ZR?= =?utf-8?B?OVN3Ymp3bVhETG5sZHIrV3ZLUTJ2UHM2aEk0ZmVueFRaSHJ3R3RzWk9OQmth?= =?utf-8?B?YVBxQVRNZjJzdWtxQ0JnYTJMei9kb3ZRMXBUSXc0YVVSb09CalhlQWtWTWhY?= =?utf-8?B?QXl5Ykd1S1pVc01yTG1jQUJLN0kyNDNOTXlpU0g2UjIxZXMzaGUvWGZBN3ly?= =?utf-8?B?dEgrSHU1Snp5cHVlQkp1ZHpaZkxaL2h4TWs5WXgwb0hmYVdzRVMxMTI4dXYz?= =?utf-8?B?Y0kzdDVqRGdxbldvVkhIQ1dBdnNiSVNFcys1RGtwbzE4UGR6U05kdHFnYldK?= =?utf-8?B?MUlOT3BzTGI0YlRoZ2ZoM25nV3RDKyt0b1diZEVPU2hhdnc5VExWUEdIaU01?= =?utf-8?B?eWoyY3dvajVaYm8yUExiMHRqaWEvMy9kSjBJRGVqQjd3bzQ0bGR0UjZJamo0?= =?utf-8?B?K3E5NVdtNEo2TFhNUkFJYWhhQUVJZC9HaFVaZER0UzBKMTZjUk8vOURvY0Ev?= =?utf-8?B?Wk5JR0NBTk9raDJVcHoxV2JqTTJURlM3ODIybXo4M1QwU0l3NU9xMXBIL3dQ?= =?utf-8?B?ajA3OUgvSjlSYnU1WlBic3I0dlNlbnNvTU55TDBncERSSVRHbnROMkJicjhi?= =?utf-8?B?YXRJNFp6a2VsbzNjUmxOSFhqQU5SUkFIQUJ6VHZNTVY4dXlKY1MvMENXRER3?= =?utf-8?B?OExHTnhycjUxWDFCSGozaFg2bFF2dW9iY0ZQWVhjVU9Ra25vOVVrcUdZV3ZR?= =?utf-8?B?aWRDRWtRdzg5ZkcvVlVTRHhrL3hPckdGTkNFVzg4TGlpSGFMNmhWZTZGcFcz?= =?utf-8?B?UXU5Q0w5Uit0Ukp1a0x2bVRtQjk1cmFQVDlIbWk3ZmdNeHlsa3FSbE8wYzZB?= =?utf-8?B?RTlkWGliakJpdUNrUmloZXRNdkRTU3ZLV3JTZnlGWUl5bkVlZGlMV3QvdVow?= =?utf-8?B?bFRpd3g0eWY0ZnhIWTJqYU01VG10cjZtbVY4bXc0VUtWaEFUR1hpNGdUcS9z?= =?utf-8?B?eFdCaXhhSkdJVk1kN2h6SWdabFg5TTJySmh4N3JDRDF5bFo4MU1rMytUU01W?= =?utf-8?B?d0hrbFEwUjdwTm5TNVY3eHM4ZVZoL2xrbFVtbGIwOEVqZDVTeWhrNm5pSDV2?= =?utf-8?B?UHU3LytlY29aR2dNVU5PZ0lQMUpTWGhlY0pjRXE1K21SOWlqVVYzaGdLZmZN?= =?utf-8?B?WlJWUVI3TCthbnEveVg3RXBRVTJUWXZtNUYzSHpDMis1aDl6SWd3MUNrVHdG?= =?utf-8?B?b2t4eW1tYkdIbTBvdEVrdy9iMFliZ2RpbExPc25zMi8xb0NDcDVTN2lXWDhG?= =?utf-8?B?WXdpenRSUFNXamQrMklFWGVnTjBDZTVaTFZ1eFBoZ1U1eUZrTEVSaTlxMzMy?= =?utf-8?B?bUNZSDFSV2Q0UnQxUDBKZHpzWHJ4ZXZBZCtBa2FZNG1wcDdHL0F4cUNqWVNt?= =?utf-8?B?QnBFSHVkZkllWDhTbityVzFlR0lEdG5wUUVkUUZUUHo3aHY5R255S044ZjZT?= =?utf-8?B?ME9lZEYyOEpwOERsbEd0V2hldWFuN0VVV0IxUTN6SnNWWTExTmFTK05taStM?= =?utf-8?B?VGw2MXNCaDc0VDc2SmpIREdwQmtodDlYWUZ3alFDdGYzMzdKTzlCS09HdHl3?= =?utf-8?B?ODJ6TWlwbTcxNVNzbFJHOVN5Mm1jYytEVW9GMU52cGswMWU0T2NndGNQWFVM?= =?utf-8?B?YkJ0czVXRVdRSjJvZ3o3U1VaclZ6RzAyalpJN3RSS09WNzNaM3lvVHFPUUtz?= =?utf-8?B?Z3RmR0tWOEJ3ZjNURzlDblg4UkVVa2cxZlVRSnBpcURSNUNiY3dmSitDZmVB?= =?utf-8?B?TWZoaU1jNjhpRGNGUm54NktMRURFUDFVV2FQY1pWbVN0QmtoNGpKV2FTTis5?= =?utf-8?B?SHJ1dVpWVExhWUI1KzlhRjhST1ZybGk3TzhWZ3dRRFNRQ0lyanBYdFRDSG1P?= =?utf-8?B?WnVNT3RaQWxKSldiYlIzbzRXenJFcm41dGh4S09hMkdIRnJFZFgzSDVONjhY?= =?utf-8?B?bXc5dHVFVTRmZ2N2L2JCbzJGVXdub2IwZFluT0todTYrcVlYenYyaC9qTTRQ?= =?utf-8?Q?6cChkC3lWlGAjmY0=3D?= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-Network-Message-Id: c890144e-b7d3-4a3a-352b-08df1976d74e X-MS-Exchange-CrossTenant-AuthSource: VI0PR08MB10656.eurprd08.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Sep 2026 13:30:32.0620 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: UQ5GjhCvBX3XteLBnQc5K5Lz5cJ2GBhmMAfgfBVZqPM4gFtQq2kG9QPISV3QM/nJJf1BCJ5brszEkBJD+Ok4HxyTtokqVo1SL2AjLWa6Pog= X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR08MB6582 Ack Overall LGTM, see some minor nits below On 9/21/26 6:44 PM, Denis V. Lunev wrote: > From: Denis V. Lunev > > WaitApWakeup spins until the AP clears its wakeup signal, with no > timeout and no way out. If the AP never consumes the Start-up IPI, the > BSP spins forever and the boot is dead. > > A hypervisor can lose that IPI. Under KVM, INIT is latched while a > vCPU is in SMM but the Start-up IPI is discarded outright, so an AP > that takes an SMI just before the BSP broadcasts INIT-SIPI-SIPI is > left in wait-for-SIPI with nothing left to start it. The window is the > few instructions between an AP releasing the BSP at the end of the SMM > rendezvous and its own RSM, which a scheduled vCPU can be preempted > inside of. KVM holds that delivering the SIPI is software's job, so > the firmware has to cope. > > Resend rather than spin. Address the AP individually so that APs > already running the procedure are not disturbed, and pass the reset > vector only on the paths that sent a Start-up IPI in the first place, > so the SEV-SNP and hand-off paths keep waiting as before. A Start-up > IPI is ignored unless the target is in wait-for-SIPI, so resending > costs nothing when the AP is merely slow. > > The failure this fixes looks like a guest that never boots: firmware > starts the boot manager, paints nothing further, and one CPU spins > while the other APs sit idle. > > Signed-off-by: Denis V. Lunev > Cc: Andrey Drobyshev > --- > UefiCpuPkg/Library/MpInitLib/MpLib.c | 85 +++++++++++++++++++++++++--- > UefiCpuPkg/Library/MpInitLib/MpLib.h | 2 + > 2 files changed, 80 insertions(+), 7 deletions(-) > > diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpInitLib/MpLib.c > index 426d998b9a..87e8f824b6 100644 > --- a/UefiCpuPkg/Library/MpInitLib/MpLib.c > +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c > @@ -942,16 +942,63 @@ DxeApEntryPoint ( > ApWakeupFunction (CpuMpData, ProcessorNumber); > } > > +/** > + Calculate timeout value and return the current performance counter value. > + > + @param[in] TimeoutInMicroseconds The timeout value in microseconds. > + @param[out] CurrentTime Returns the current value of the performance counter. > + > + @return Expected timestamp counter for timeout, or 0 if TimeoutInMicroseconds is 0. > +**/ > +UINT64 > +CalculateTimeout ( > + IN UINTN TimeoutInMicroseconds, > + OUT UINT64 *CurrentTime > + ); > + > +/** > + Checks whether timeout expires. > + > + @param[in, out] PreviousTime On input, the requested time. On output, the elapsed time. > + @param[in] TotalTime The total amount of elapsed time. > + @param[in] Timeout The timeout ticks, 0 means infinity. > + > + @retval TRUE A timeout occurred. > + @retval FALSE No timeout occurred. > +**/ > +BOOLEAN > +CheckTimeout ( > + IN OUT UINT64 *PreviousTime, > + IN UINT64 *TotalTime, > + IN UINT64 Timeout > + ); > + These functions are only used here in this translation unit, yet they aren't declared static. Should we wither declare them static and move their definitions above (without the need for forward declarations), or just declare them in MpLib.h? > /** > Wait for AP wakeup and write AP start-up signal till AP is waken up. > > @param[in] ApStartupSignalBuffer Pointer to AP wakeup signal > + @param[in] ApicId Local APIC ID of the AP being woken > + @param[in] StartupRoutine AP reset vector, or 0 if the AP was not > + woken by INIT-SIPI-SIPI and no Start-up > + IPI may be resent > **/ > VOID > WaitApWakeup ( > - IN volatile UINT32 *ApStartupSignalBuffer > + IN volatile UINT32 *ApStartupSignalBuffer, > + IN UINT32 ApicId, > + IN UINT32 StartupRoutine > ) > { > + UINT64 CurrentTime; > + UINT64 TotalTime; > + UINT64 Timeout; > + > + Timeout = CalculateTimeout ( > + (StartupRoutine != 0) ? AP_SIPI_RESEND_TIMEOUT_US : 0, > + &CurrentTime > + ); > + TotalTime = 0; > + > // > // If AP is waken up, StartupApSignal should be cleared. > // Otherwise, write StartupApSignal again till AP waken up. > @@ -962,6 +1009,12 @@ WaitApWakeup ( > WAKEUP_AP_SIGNAL > ) != 0) > { > + if (CheckTimeout (&CurrentTime, &TotalTime, Timeout)) { > + SendStartupIpi (ApicId, StartupRoutine); > + Timeout = CalculateTimeout (AP_SIPI_RESEND_TIMEOUT_US, &CurrentTime); > + TotalTime = 0; > + } This re-send of IPI should happen rarely. Wouldn't we wanna know when it does happen? How about adding some debug info when IPI is re-issued? Andrey > + > CpuPause (); > } > } > @@ -1256,8 +1309,10 @@ WakeUpAP ( > CPU_AP_DATA *CpuData; > BOOLEAN ResetVectorRequired; > CPU_INFO_IN_HOB *CpuInfoInHob; > + UINT32 SipiVector; > > CpuMpData->FinishedCount = 0; > + SipiVector = 0; > ResetVectorRequired = FALSE; > > if (CpuMpData->WakeUpByInitSipiSipi || > @@ -1320,13 +1375,14 @@ WakeUpAP ( > if (CanUseSevSnpCreateAP (CpuMpData)) { > SevSnpCreateAP (CpuMpData, -1); > } else { > + SipiVector = (UINT32)ExchangeInfo->BufferStart; > if ((CpuMpData->InitFlag == ApInitConfig) && FixedPcdGetBool (PcdFirstTimeWakeUpAPsBySipi)) { > // > // SIPI can be used for the first time wake up after reset to reduce boot time. > // > - SendStartupIpiAllExcludingSelf ((UINT32)ExchangeInfo->BufferStart); > + SendStartupIpiAllExcludingSelf (SipiVector); > } else { > - SendInitSipiSipiAllExcludingSelf ((UINT32)ExchangeInfo->BufferStart); > + SendInitSipiSipiAllExcludingSelf (SipiVector); > } > } > } > @@ -1398,10 +1454,15 @@ WakeUpAP ( > // > // Wait all APs waken up if this is not the 1st broadcast of SIPI > // > + CpuInfoInHob = (CPU_INFO_IN_HOB *)(UINTN)CpuMpData->CpuInfoInHob; > for (Index = 0; Index < CpuMpData->CpuCount; Index++) { > CpuData = &CpuMpData->CpuData[Index]; > if (Index != CpuMpData->BspNumber) { > - WaitApWakeup (CpuData->StartupApSignal); > + WaitApWakeup ( > + CpuData->StartupApSignal, > + CpuInfoInHob[Index].ApicId, > + SipiVector > + ); > } > } > } > @@ -1430,9 +1491,10 @@ WakeUpAP ( > if (CanUseSevSnpCreateAP (CpuMpData)) { > SevSnpCreateAP (CpuMpData, (INTN)ProcessorNumber); > } else { > + SipiVector = (UINT32)ExchangeInfo->BufferStart; > SendInitSipiSipi ( > CpuInfoInHob[ProcessorNumber].ApicId, > - (UINT32)ExchangeInfo->BufferStart > + SipiVector > ); > } > } > @@ -1440,7 +1502,12 @@ WakeUpAP ( > // > // Wait specified AP waken up > // > - WaitApWakeup (CpuData->StartupApSignal); > + CpuInfoInHob = (CPU_INFO_IN_HOB *)(UINTN)CpuMpData->CpuInfoInHob; > + WaitApWakeup ( > + CpuData->StartupApSignal, > + CpuInfoInHob[ProcessorNumber].ApicId, > + SipiVector > + ); > } > > if (ResetVectorRequired) { > @@ -2017,7 +2084,11 @@ SwitchApContext ( > { > for (Index = 0; Index < MpHandOff->CpuCount; Index++) { > if (MpHandOff->ProcessorIndex + Index != BspNumber) { > - WaitApWakeup ((UINT32 *)(UINTN)(MpHandOff->Info[Index].StartupSignalAddress)); > + WaitApWakeup ( > + (UINT32 *)(UINTN)(MpHandOff->Info[Index].StartupSignalAddress), > + 0, > + 0 > + ); > } > } > } > diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.h b/UefiCpuPkg/Library/MpInitLib/MpLib.h > index 5d10516cd8..94bda7f1ea 100644 > --- a/UefiCpuPkg/Library/MpInitLib/MpLib.h > +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.h > @@ -44,6 +44,8 @@ > #include "MpHandOff.h" > > #define WAKEUP_AP_SIGNAL SIGNATURE_32 ('S', 'T', 'A', 'P') > + > +#define AP_SIPI_RESEND_TIMEOUT_US 10000 > // > // To trigger the start-up signal, BSP writes the specified > // StartupSignalValue to the StartupSignalAddress of each processor.