* [PATCH 0/2] Wake up APs by a single SIPI. @ 2023-03-27 3:17 Yuanhao Xie 2023-03-27 3:17 ` [PATCH 1/2] UefiCpuPkg: Add SendStartupIpiAllExcludingSelf Yuanhao Xie 2023-03-27 3:17 ` [PATCH 2/2] UefiCpuPkg: After reset, wake up APs by SIPI Yuanhao Xie 0 siblings, 2 replies; 6+ messages in thread From: Yuanhao Xie @ 2023-03-27 3:17 UTC (permalink / raw) To: devel After a power-up or reset, all application processors (APs) are in a state where they are waiting for sipi. In this state, the bootstrap processor (BSP) send a single SIPI Inter-Processor Interrupt (IPI) to all the APs. Yuanhao Xie (2): UefiCpuPkg: Add SendStartupIpiAllExcludingSelf UefiCpuPkg: After reset, wake up APs by SIPI. UefiCpuPkg/Include/Library/LocalApicLib.h | 17 +++++++- .../Library/BaseXApicLib/BaseXApicLib.c | 43 +++++++++++++------ .../BaseXApicX2ApicLib/BaseXApicX2ApicLib.c | 43 +++++++++++++------ UefiCpuPkg/Library/MpInitLib/MpLib.c | 9 +++- 4 files changed, 84 insertions(+), 28 deletions(-) -- 2.36.1.windows.1 ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 1/2] UefiCpuPkg: Add SendStartupIpiAllExcludingSelf 2023-03-27 3:17 [PATCH 0/2] Wake up APs by a single SIPI Yuanhao Xie @ 2023-03-27 3:17 ` Yuanhao Xie 2023-03-27 3:17 ` [PATCH 2/2] UefiCpuPkg: After reset, wake up APs by SIPI Yuanhao Xie 1 sibling, 0 replies; 6+ messages in thread From: Yuanhao Xie @ 2023-03-27 3:17 UTC (permalink / raw) To: devel; +Cc: Guo Dong, Ray Ni, Sean Rhodes, James Lu, Gua Guo Add new API SendStartupIpiAllExcludingSelf(), and modify SendInitSipiSipiAllExcludingSelf() by let it call the new API. Cc: Guo Dong <guo.dong@intel.com> Cc: Ray Ni <ray.ni@intel.com> Cc: Sean Rhodes <sean@starlabs.systems> Cc: James Lu <james.lu@intel.com> Cc: Gua Guo <gua.guo@intel.com> Signed-off-by: Yuanhao Xie <yuanhao.xie@intel.com> --- UefiCpuPkg/Include/Library/LocalApicLib.h | 17 +++++++- .../Library/BaseXApicLib/BaseXApicLib.c | 43 +++++++++++++------ .../BaseXApicX2ApicLib/BaseXApicX2ApicLib.c | 43 +++++++++++++------ 3 files changed, 76 insertions(+), 27 deletions(-) diff --git a/UefiCpuPkg/Include/Library/LocalApicLib.h b/UefiCpuPkg/Include/Library/LocalApicLib.h index b55d88b0f5..d7c2ad3f70 100644 --- a/UefiCpuPkg/Include/Library/LocalApicLib.h +++ b/UefiCpuPkg/Include/Library/LocalApicLib.h @@ -4,7 +4,7 @@ Local APIC library assumes local APIC is enabled. It does not handles cases where local APIC is disabled. - Copyright (c) 2010 - 2019, Intel Corporation. All rights reserved.<BR> + Copyright (c) 2010 - 2023, Intel Corporation. All rights reserved.<BR> SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -185,6 +185,21 @@ SendInitIpiAllExcludingSelf ( VOID ); +/** + Send a Start-up IPI to all processors excluding self. + This function returns after the IPI has been accepted by the target processors. + if StartupRoutine >= 1M, then ASSERT. + if StartupRoutine is not multiple of 4K, then ASSERT. + @param StartupRoutine Points to a start-up routine which is below 1M physical + address and 4K aligned. +**/ + +VOID +EFIAPI +SendStartupIpiAllExcludingSelf ( + IN UINT32 StartupRoutine + ); + /** Send an INIT-Start-up-Start-up IPI sequence to a specified target processor. diff --git a/UefiCpuPkg/Library/BaseXApicLib/BaseXApicLib.c b/UefiCpuPkg/Library/BaseXApicLib/BaseXApicLib.c index 008b8a070b..d56c6275cc 100644 --- a/UefiCpuPkg/Library/BaseXApicLib/BaseXApicLib.c +++ b/UefiCpuPkg/Library/BaseXApicLib/BaseXApicLib.c @@ -3,7 +3,7 @@ This local APIC library instance supports xAPIC mode only. - Copyright (c) 2010 - 2019, Intel Corporation. All rights reserved.<BR> + Copyright (c) 2010 - 2023, Intel Corporation. All rights reserved.<BR> Copyright (c) 2017 - 2020, AMD Inc. All rights reserved.<BR> SPDX-License-Identifier: BSD-2-Clause-Patent @@ -497,6 +497,33 @@ SendInitIpiAllExcludingSelf ( SendIpi (IcrLow.Uint32, 0); } +/** + Send a Start-up IPI to all processors excluding self. + This function returns after the IPI has been accepted by the target processors. + if StartupRoutine >= 1M, then ASSERT. + if StartupRoutine is not multiple of 4K, then ASSERT. + @param StartupRoutine Points to a start-up routine which is below 1M physical + address and 4K aligned. +**/ +VOID +EFIAPI +SendStartupIpiAllExcludingSelf ( + IN UINT32 StartupRoutine + ) +{ + LOCAL_APIC_ICR_LOW IcrLow; + + ASSERT (StartupRoutine < 0x100000); + ASSERT ((StartupRoutine & 0xfff) == 0); + + IcrLow.Uint32 = 0; + IcrLow.Bits.Vector = (StartupRoutine >> 12); + IcrLow.Bits.DeliveryMode = LOCAL_APIC_DELIVERY_MODE_STARTUP; + IcrLow.Bits.Level = 1; + IcrLow.Bits.DestinationShorthand = LOCAL_APIC_DESTINATION_SHORTHAND_ALL_EXCLUDING_SELF; + SendIpi (IcrLow.Uint32, 0); +} + /** Send an INIT-Start-up-Start-up IPI sequence to a specified target processor. @@ -551,22 +578,12 @@ SendInitSipiSipiAllExcludingSelf ( IN UINT32 StartupRoutine ) { - LOCAL_APIC_ICR_LOW IcrLow; - - ASSERT (StartupRoutine < 0x100000); - ASSERT ((StartupRoutine & 0xfff) == 0); - SendInitIpiAllExcludingSelf (); MicroSecondDelay (PcdGet32 (PcdCpuInitIpiDelayInMicroSeconds)); - IcrLow.Uint32 = 0; - IcrLow.Bits.Vector = (StartupRoutine >> 12); - IcrLow.Bits.DeliveryMode = LOCAL_APIC_DELIVERY_MODE_STARTUP; - IcrLow.Bits.Level = 1; - IcrLow.Bits.DestinationShorthand = LOCAL_APIC_DESTINATION_SHORTHAND_ALL_EXCLUDING_SELF; - SendIpi (IcrLow.Uint32, 0); + SendStartupIpiAllExcludingSelf (StartupRoutine); if (!StandardSignatureIsAuthenticAMD ()) { MicroSecondDelay (200); - SendIpi (IcrLow.Uint32, 0); + SendStartupIpiAllExcludingSelf (StartupRoutine); } } diff --git a/UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.c b/UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.c index 0ba0499631..aa4eb11181 100644 --- a/UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.c +++ b/UefiCpuPkg/Library/BaseXApicX2ApicLib/BaseXApicX2ApicLib.c @@ -4,7 +4,7 @@ This local APIC library instance supports x2APIC capable processors which have xAPIC and x2APIC modes. - Copyright (c) 2010 - 2019, Intel Corporation. All rights reserved.<BR> + Copyright (c) 2010 - 2023, Intel Corporation. All rights reserved.<BR> Copyright (c) 2017 - 2020, AMD Inc. All rights reserved.<BR> SPDX-License-Identifier: BSD-2-Clause-Patent @@ -736,6 +736,33 @@ SendInitIpiAllExcludingSelf ( SendIpi (IcrLow.Uint32, 0); } +/** + Send a Start-up IPI to all processors excluding self. + This function returns after the IPI has been accepted by the target processors. + if StartupRoutine >= 1M, then ASSERT. + if StartupRoutine is not multiple of 4K, then ASSERT. + @param StartupRoutine Points to a start-up routine which is below 1M physical + address and 4K aligned. +**/ +VOID +EFIAPI +SendStartupIpiAllExcludingSelf ( + IN UINT32 StartupRoutine + ) +{ + LOCAL_APIC_ICR_LOW IcrLow; + + ASSERT (StartupRoutine < 0x100000); + ASSERT ((StartupRoutine & 0xfff) == 0); + + IcrLow.Uint32 = 0; + IcrLow.Bits.Vector = (StartupRoutine >> 12); + IcrLow.Bits.DeliveryMode = LOCAL_APIC_DELIVERY_MODE_STARTUP; + IcrLow.Bits.Level = 1; + IcrLow.Bits.DestinationShorthand = LOCAL_APIC_DESTINATION_SHORTHAND_ALL_EXCLUDING_SELF; + SendIpi (IcrLow.Uint32, 0); +} + /** Send an INIT-Start-up-Start-up IPI sequence to a specified target processor. @@ -790,22 +817,12 @@ SendInitSipiSipiAllExcludingSelf ( IN UINT32 StartupRoutine ) { - LOCAL_APIC_ICR_LOW IcrLow; - - ASSERT (StartupRoutine < 0x100000); - ASSERT ((StartupRoutine & 0xfff) == 0); - SendInitIpiAllExcludingSelf (); MicroSecondDelay (PcdGet32 (PcdCpuInitIpiDelayInMicroSeconds)); - IcrLow.Uint32 = 0; - IcrLow.Bits.Vector = (StartupRoutine >> 12); - IcrLow.Bits.DeliveryMode = LOCAL_APIC_DELIVERY_MODE_STARTUP; - IcrLow.Bits.Level = 1; - IcrLow.Bits.DestinationShorthand = LOCAL_APIC_DESTINATION_SHORTHAND_ALL_EXCLUDING_SELF; - SendIpi (IcrLow.Uint32, 0); + SendStartupIpiAllExcludingSelf (StartupRoutine); if (!StandardSignatureIsAuthenticAMD ()) { MicroSecondDelay (200); - SendIpi (IcrLow.Uint32, 0); + SendStartupIpiAllExcludingSelf (StartupRoutine); } } -- 2.36.1.windows.1 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 2/2] UefiCpuPkg: After reset, wake up APs by SIPI. 2023-03-27 3:17 [PATCH 0/2] Wake up APs by a single SIPI Yuanhao Xie 2023-03-27 3:17 ` [PATCH 1/2] UefiCpuPkg: Add SendStartupIpiAllExcludingSelf Yuanhao Xie @ 2023-03-27 3:17 ` Yuanhao Xie 2023-03-27 11:02 ` [edk2-devel] " Gerd Hoffmann 1 sibling, 1 reply; 6+ messages in thread From: Yuanhao Xie @ 2023-03-27 3:17 UTC (permalink / raw) To: devel; +Cc: Guo Dong, Ray Ni, Sean Rhodes, James Lu, Gua Guo Following a power-up or RESET, since all APs are already in the “wait-for-SIPI state,” the BSP can broadcast just a single SIPI IPI to the APs to wake them up and initialize them. Cc: Guo Dong <guo.dong@intel.com> Cc: Ray Ni <ray.ni@intel.com> Cc: Sean Rhodes <sean@starlabs.systems> Cc: James Lu <james.lu@intel.com> Cc: Gua Guo <gua.guo@intel.com> Signed-off-by: Yuanhao Xie <yuanhao.xie@intel.com> --- UefiCpuPkg/Library/MpInitLib/MpLib.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpInitLib/MpLib.c index e5dc852ed9..a540b3fe3d 100644 --- a/UefiCpuPkg/Library/MpInitLib/MpLib.c +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c @@ -1233,7 +1233,14 @@ WakeUpAP ( if (CpuMpData->SevSnpIsEnabled && (CpuMpData->InitFlag != ApInitConfig)) { SevSnpCreateAP (CpuMpData, -1); } else { - SendInitSipiSipiAllExcludingSelf ((UINT32)ExchangeInfo->BufferStart); + if (CpuMpData->InitFlag == ApInitConfig) { + // + // SIPI can be used for the first time wake up after reset to reduce boot time. + // + SendStartupIpiAllExcludingSelf ((UINT32)ExchangeInfo->BufferStart); + } else { + SendInitSipiSipiAllExcludingSelf ((UINT32)ExchangeInfo->BufferStart); + } } } -- 2.36.1.windows.1 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [edk2-devel] [PATCH 2/2] UefiCpuPkg: After reset, wake up APs by SIPI. 2023-03-27 3:17 ` [PATCH 2/2] UefiCpuPkg: After reset, wake up APs by SIPI Yuanhao Xie @ 2023-03-27 11:02 ` Gerd Hoffmann 2023-03-29 8:50 ` Yuanhao Xie 0 siblings, 1 reply; 6+ messages in thread From: Gerd Hoffmann @ 2023-03-27 11:02 UTC (permalink / raw) To: devel, yuanhao.xie; +Cc: Guo Dong, Ray Ni, Sean Rhodes, James Lu, Gua Guo On Mon, Mar 27, 2023 at 11:17:11AM +0800, Yuanhao Xie wrote: > Following a power-up or RESET, since all APs are already in the > “wait-for-SIPI state,” the BSP can broadcast just a single SIPI IPI to > the APs to wake them up and initialize them. > > Cc: Guo Dong <guo.dong@intel.com> > Cc: Ray Ni <ray.ni@intel.com> > Cc: Sean Rhodes <sean@starlabs.systems> > Cc: James Lu <james.lu@intel.com> > Cc: Gua Guo <gua.guo@intel.com> > Signed-off-by: Yuanhao Xie <yuanhao.xie@intel.com> This patch breaks OVMF (just boot the firmware in qemu image with '-smp 2'). take care, Gerd ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [edk2-devel] [PATCH 2/2] UefiCpuPkg: After reset, wake up APs by SIPI. 2023-03-27 11:02 ` [edk2-devel] " Gerd Hoffmann @ 2023-03-29 8:50 ` Yuanhao Xie 2023-03-29 13:29 ` Gerd Hoffmann 0 siblings, 1 reply; 6+ messages in thread From: Yuanhao Xie @ 2023-03-29 8:50 UTC (permalink / raw) To: Gerd Hoffmann Cc: Dong, Guo, Ni, Ray, Rhodes, Sean, Lu, James, Guo, Gua, devel@edk2.groups.io Hi Gerd, Could you please provide me more information, like where does it hang, ad what build and boot options you use I used this image https://www.kraxel.org/repos/images/fedora-30-efi-systemd-i686.qcow2.xz, and extracted the kernel from second partition (VFAT) of "/a29755367bf242efb072cfdd1a70134f/5.3.12-200.fc30.i686/linux" . Build and boot with: build \ -a IA32 \ -b NOOPT \ -p OvmfPkg/OvmfPkgIa32.dsc \ -t GCC5 \ -D SECURE_BOOT_ENABLE \ -D SMM_REQUIRE \ -D NETWORK_TLS_ENABLE \ -D NETWORK_IP6_ENABLE \ -D NETWORK_HTTP_BOOT_ENABLE \ -D TPM2_ENABLE \ --pcd=gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel=0x8040004F qemu-system-i386 \ -cpu coreduo,-nx \ -machine q35,smm=on,accel=kvm \ -m 5120 \ -smp 2 \ -global driver=cfi.pflash01,property=secure,value=on \ -drive if=pflash,format=raw,unit=0,file=OVMF_CODE.fd,readonly=on \ -drive if=pflash,format=raw,unit=1,file=OVMF_VARS.fd,snapshot=on \ -debugcon file:debug3.log \ -global isa-debugcon.iobase=0x402 \ -chardev stdio,signal=off,mux=on,id=char0 \ -mon chardev=char0,mode=readline \ -serial chardev:char0 \ -kernel linux \ -append "ignore_loglevel console=ttyS0" The end of log are as following: PixelBlueGreenRedReserved8BitPerColor ConvertPages: range 400000 - 141CFFF covers multiple entries SmmInstallProtocolInterface: 296EB418-C4C8-4E05-AB59-39E8AF56F00A 0 CpuDxe: 5-Level Paging = 0 MpInitChangeApLoopCallback() done! SetUefiImageMemoryAttributes - 0x000000007ED47000 - 0x000000000000A000 (0x0000000000000008) SetUefiImageMemoryAttributes - 0x000000007ED3E000 - 0x0000000000009000 (0x0000000000000008) SetUefiImageMemoryAttributes - 0x000000007ED33000 - 0x000000000000B000 (0x0000000000000008) SetUefiImageMemoryAttributes - 0x000000007ED2A000 - 0x0000000000009000 (0x0000000000000008) SetUefiImageMemoryAttributes - 0x000000007ED1F000 - 0x000000000000B000 (0x0000000000000008) SetUefiImageMemoryAttributes - 0x000000007ED11000 - 0x000000000000E000 (0x0000000000000008) SetUefiImageMemoryAttributes - 0x000000007ED04000 - 0x000000000000D000 (0x0000000000000008) SetUefiImageMemoryAttributes - 0x000000007ECF8000 - 0x000000000000C000 (0x0000000000000008) SetUefiImageMemoryAttributes - 0x000000007ECF1000 - 0x0000000000007000 (0x0000000000000008) SetUefiImageMemoryAttributes - 0x000000007ECE9000 - 0x0000000000008000 (0x0000000000000008) ValidateSetVariable - Variable (4424AC57-BE4B-47DD-9E97-ED50F09F92A9:DUMMY) returning Success. Thanks Yuanhao -----Original Message----- From: Gerd Hoffmann <kraxel@redhat.com> Sent: Monday, March 27, 2023 7:03 PM To: devel@edk2.groups.io; Xie, Yuanhao <yuanhao.xie@intel.com> Cc: Dong, Guo <guo.dong@intel.com>; Ni, Ray <ray.ni@intel.com>; Rhodes, Sean <sean@starlabs.systems>; Lu, James <james.lu@intel.com>; Guo, Gua <gua.guo@intel.com> Subject: Re: [edk2-devel] [PATCH 2/2] UefiCpuPkg: After reset, wake up APs by SIPI. On Mon, Mar 27, 2023 at 11:17:11AM +0800, Yuanhao Xie wrote: > Following a power-up or RESET, since all APs are already in the > “wait-for-SIPI state,” the BSP can broadcast just a single SIPI IPI to > the APs to wake them up and initialize them. > > Cc: Guo Dong <guo.dong@intel.com> > Cc: Ray Ni <ray.ni@intel.com> > Cc: Sean Rhodes <sean@starlabs.systems> > Cc: James Lu <james.lu@intel.com> > Cc: Gua Guo <gua.guo@intel.com> > Signed-off-by: Yuanhao Xie <yuanhao.xie@intel.com> This patch breaks OVMF (just boot the firmware in qemu image with '-smp 2'). take care, Gerd ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [edk2-devel] [PATCH 2/2] UefiCpuPkg: After reset, wake up APs by SIPI. 2023-03-29 8:50 ` Yuanhao Xie @ 2023-03-29 13:29 ` Gerd Hoffmann 0 siblings, 0 replies; 6+ messages in thread From: Gerd Hoffmann @ 2023-03-29 13:29 UTC (permalink / raw) To: Xie, Yuanhao Cc: Dong, Guo, Ni, Ray, Rhodes, Sean, Lu, James, Guo, Gua, devel@edk2.groups.io On Wed, Mar 29, 2023 at 08:50:24AM +0000, Xie, Yuanhao wrote: > Hi Gerd, > > Could you please provide me more information, like where does it hang, ad what build and boot options you use qemu-system-x86_64 -display none -accel kvm -smp 2 -M q35 \ -bios Build/OvmfX64/DEBUG_GCC5/FV/OVMF.fd \ -chardev stdio,id=fw -device isa-debugcon,iobase=0x402,chardev=fw Last log lines are ... AP Loop Mode is 1 AP Vector: non-16-bit = 7EA7000/447 WakeupBufferStart = 9F000, WakeupBufferSize = 1000 AP Vector: 16-bit = 9F000/39, ExchangeInfo = 9F039/A4 CpuMpPei: 5-Level Paging = 0 ... and here it hangs. > -p OvmfPkg/OvmfPkgIa32.dsc \ Using OvmfPkgX64.dsc here. Tried using Ia32 instead, hangs too, at the same place. take care, Gerd ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2023-03-29 13:29 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2023-03-27 3:17 [PATCH 0/2] Wake up APs by a single SIPI Yuanhao Xie 2023-03-27 3:17 ` [PATCH 1/2] UefiCpuPkg: Add SendStartupIpiAllExcludingSelf Yuanhao Xie 2023-03-27 3:17 ` [PATCH 2/2] UefiCpuPkg: After reset, wake up APs by SIPI Yuanhao Xie 2023-03-27 11:02 ` [edk2-devel] " Gerd Hoffmann 2023-03-29 8:50 ` Yuanhao Xie 2023-03-29 13:29 ` Gerd Hoffmann
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox