Re: [edk2-devel] [PATCH] UefiCpuPkg/MpLib:Do not assume BSP is #0.
I created PR for merge: UefiCpuPkg/MpLib:Do not assume BSP is #0. by niruiyu · Pull Request #5683 · tianocore/edk2 (github.com)<https://github.com/tianocore/edk2/pull/5683> But, I cannot set "push" label. @Gao, Liming<mailto:gaolim...@byosoft.com.cn>? Thanks, Ray From: devel@edk2.groups.io on behalf of Ni, Ray Sent: Saturday, May 25, 2024 9:32 To: Feng, Ning ; devel@edk2.groups.io Subject: Re: [edk2-devel] [PATCH] UefiCpuPkg/MpLib:Do not assume BSP is #0. Reviewed-by: Ray Ni Thanks, Ray From: Feng, Ning Sent: Saturday, May 25, 2024 15:42 To: devel@edk2.groups.io Cc: Feng, Ning ; Ni, Ray Subject: [PATCH] UefiCpuPkg/MpLib:Do not assume BSP is #0. REF:https://bugzilla.tianocore.org/show_bug.cgi?id=4778 MPInitlib have wrong expectation that BSP index should always be 0 in MpInitLibInitialize(), SwitchBsp(),ApWakeupFunction(). That will cause the data mismatch, if the initial BSP is not 0. Cc: Ray Ni Signed-off-by: Ning Feng --- UefiCpuPkg/Library/MpInitLib/MpLib.c | 47 ++-- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpInitLib/MpLib.c index d724456502..ba497cbfd9 100644 --- a/UefiCpuPkg/Library/MpInitLib/MpLib.c +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c @@ -114,6 +114,10 @@ FutureBSPProc ( SaveVolatileRegisters (>APInfo.VolatileRegisters); AsmExchangeRole (>APInfo, >BSPInfo); RestoreVolatileRegisters (>APInfo.VolatileRegisters, FALSE); + // + // Restore VolatileReg saved in CpuMpData->CpuData + // + CopyMem (>CpuData[DataInHob->BspNumber].VolatileRegisters, >APInfo.VolatileRegisters, sizeof (CPU_VOLATILE_REGISTERS)); } /** @@ -761,11 +765,11 @@ ApWakeupFunction ( BistData = (UINT32)ApStackData->Bist; // - // CpuMpData->CpuData[0].VolatileRegisters is initialized based on BSP environment, + // CpuMpData->CpuData[BspNumber].VolatileRegisters is initialized based on BSP environment, // to initialize AP in InitConfig path. - // NOTE: IDTR.BASE stored in CpuMpData->CpuData[0].VolatileRegisters points to a different IDT shared by all APs. + // NOTE: IDTR.BASE stored in CpuMpData->CpuData[BspNumber].VolatileRegisters points to a different IDT shared by all APs. // - RestoreVolatileRegisters (>CpuData[0].VolatileRegisters, FALSE); + RestoreVolatileRegisters (>CpuData[CpuMpData->BspNumber].VolatileRegisters, FALSE); InitializeApData (CpuMpData, ProcessorNumber, BistData, ApTopOfStack); ApStartupSignalBuffer = CpuMpData->CpuData[ProcessorNumber].StartupApSignal; } else { @@ -798,10 +802,10 @@ ApWakeupFunction ( // 1. AP is re-enabled after it's disabled, in either PEI or DXE phase. // 2. AP is initialized in DXE phase. // In either case, use the volatile registers value derived from BSP. -// NOTE: IDTR.BASE stored in CpuMpData->CpuData[0].VolatileRegisters points to a +// NOTE: IDTR.BASE stored in CpuMpData->CpuData[BspNumber].VolatileRegisters points to a // different IDT shared by all APs. // -RestoreVolatileRegisters (>CpuData[0].VolatileRegisters, FALSE); +RestoreVolatileRegisters (>CpuData[CpuMpData->BspNumber].VolatileRegisters, FALSE); } else { if (CpuMpData->ApLoopMode == ApInHltLoop) { // @@ -927,7 +931,7 @@ DxeApEntryPoint ( AsmWriteMsr64 (MSR_IA32_EFER, EferMsr.Uint64); } - RestoreVolatileRegisters (>CpuData[0].VolatileRegisters, FALSE); + RestoreVolatileRegisters (>CpuData[CpuMpData->BspNumber].VolatileRegisters, FALSE); InterlockedIncrement ((UINT32 *)>FinishedCount); PlaceAPInMwaitLoopOrRunLoop ( CpuMpData->ApLoopMode, @@ -2151,11 +2155,16 @@ MpInitLibInitialize ( CpuMpData->BackupBufferSize = ApResetVectorSizeBelow1Mb; CpuMpData->WakeupBuffer = (UINTN)-1; CpuMpData->CpuCount = 1; - CpuMpData->BspNumber= 0; - CpuMpData->WaitEvent= NULL; - CpuMpData->SwitchBspFlag= FALSE; - CpuMpData->CpuData = (CPU_AP_DATA *)(CpuMpData + 1); - CpuMpData->CpuInfoInHob = (UINT64)(UINTN)(CpuMpData->CpuData + MaxLogicalProcessorNumber); + if (FirstMpHandOff == NULL) { +CpuMpData->BspNumber = 0; + } else { +CpuMpData->BspNumber = GetBspNumber (FirstMpHandOff); + } + + CpuMpData->WaitEvent = NULL; + CpuMpData->SwitchBspFlag = FALSE; + CpuMpData->CpuData = (CPU_AP_DATA *)(CpuMpData + 1); + CpuMpData->CpuInfoInHob = (UINT64)(UINTN)(CpuMpData->CpuData + MaxLogicalProcessorNumber); InitializeSpinLock (>MpLock); CpuMpData->SevEsIsEnabled = ConfidentialComputingGuestHas (CCAttrAmdSevEs);
Re: [edk2-devel] [PATCH] UefiCpuPkg/MpLib:Do not assume BSP is #0.
Reviewed-by: Ray Ni Thanks, Ray From: Feng, Ning Sent: Saturday, May 25, 2024 15:42 To: devel@edk2.groups.io Cc: Feng, Ning ; Ni, Ray Subject: [PATCH] UefiCpuPkg/MpLib:Do not assume BSP is #0. REF:https://bugzilla.tianocore.org/show_bug.cgi?id=4778 MPInitlib have wrong expectation that BSP index should always be 0 in MpInitLibInitialize(), SwitchBsp(),ApWakeupFunction(). That will cause the data mismatch, if the initial BSP is not 0. Cc: Ray Ni Signed-off-by: Ning Feng --- UefiCpuPkg/Library/MpInitLib/MpLib.c | 47 ++-- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpInitLib/MpLib.c index d724456502..ba497cbfd9 100644 --- a/UefiCpuPkg/Library/MpInitLib/MpLib.c +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c @@ -114,6 +114,10 @@ FutureBSPProc ( SaveVolatileRegisters (>APInfo.VolatileRegisters); AsmExchangeRole (>APInfo, >BSPInfo); RestoreVolatileRegisters (>APInfo.VolatileRegisters, FALSE); + // + // Restore VolatileReg saved in CpuMpData->CpuData + // + CopyMem (>CpuData[DataInHob->BspNumber].VolatileRegisters, >APInfo.VolatileRegisters, sizeof (CPU_VOLATILE_REGISTERS)); } /** @@ -761,11 +765,11 @@ ApWakeupFunction ( BistData = (UINT32)ApStackData->Bist; // - // CpuMpData->CpuData[0].VolatileRegisters is initialized based on BSP environment, + // CpuMpData->CpuData[BspNumber].VolatileRegisters is initialized based on BSP environment, // to initialize AP in InitConfig path. - // NOTE: IDTR.BASE stored in CpuMpData->CpuData[0].VolatileRegisters points to a different IDT shared by all APs. + // NOTE: IDTR.BASE stored in CpuMpData->CpuData[BspNumber].VolatileRegisters points to a different IDT shared by all APs. // - RestoreVolatileRegisters (>CpuData[0].VolatileRegisters, FALSE); + RestoreVolatileRegisters (>CpuData[CpuMpData->BspNumber].VolatileRegisters, FALSE); InitializeApData (CpuMpData, ProcessorNumber, BistData, ApTopOfStack); ApStartupSignalBuffer = CpuMpData->CpuData[ProcessorNumber].StartupApSignal; } else { @@ -798,10 +802,10 @@ ApWakeupFunction ( // 1. AP is re-enabled after it's disabled, in either PEI or DXE phase. // 2. AP is initialized in DXE phase. // In either case, use the volatile registers value derived from BSP. -// NOTE: IDTR.BASE stored in CpuMpData->CpuData[0].VolatileRegisters points to a +// NOTE: IDTR.BASE stored in CpuMpData->CpuData[BspNumber].VolatileRegisters points to a // different IDT shared by all APs. // -RestoreVolatileRegisters (>CpuData[0].VolatileRegisters, FALSE); +RestoreVolatileRegisters (>CpuData[CpuMpData->BspNumber].VolatileRegisters, FALSE); } else { if (CpuMpData->ApLoopMode == ApInHltLoop) { // @@ -927,7 +931,7 @@ DxeApEntryPoint ( AsmWriteMsr64 (MSR_IA32_EFER, EferMsr.Uint64); } - RestoreVolatileRegisters (>CpuData[0].VolatileRegisters, FALSE); + RestoreVolatileRegisters (>CpuData[CpuMpData->BspNumber].VolatileRegisters, FALSE); InterlockedIncrement ((UINT32 *)>FinishedCount); PlaceAPInMwaitLoopOrRunLoop ( CpuMpData->ApLoopMode, @@ -2151,11 +2155,16 @@ MpInitLibInitialize ( CpuMpData->BackupBufferSize = ApResetVectorSizeBelow1Mb; CpuMpData->WakeupBuffer = (UINTN)-1; CpuMpData->CpuCount = 1; - CpuMpData->BspNumber= 0; - CpuMpData->WaitEvent= NULL; - CpuMpData->SwitchBspFlag= FALSE; - CpuMpData->CpuData = (CPU_AP_DATA *)(CpuMpData + 1); - CpuMpData->CpuInfoInHob = (UINT64)(UINTN)(CpuMpData->CpuData + MaxLogicalProcessorNumber); + if (FirstMpHandOff == NULL) { +CpuMpData->BspNumber = 0; + } else { +CpuMpData->BspNumber = GetBspNumber (FirstMpHandOff); + } + + CpuMpData->WaitEvent = NULL; + CpuMpData->SwitchBspFlag = FALSE; + CpuMpData->CpuData = (CPU_AP_DATA *)(CpuMpData + 1); + CpuMpData->CpuInfoInHob = (UINT64)(UINTN)(CpuMpData->CpuData + MaxLogicalProcessorNumber); InitializeSpinLock (>MpLock); CpuMpData->SevEsIsEnabled = ConfidentialComputingGuestHas (CCAttrAmdSevEs); CpuMpData->SevSnpIsEnabled = ConfidentialComputingGuestHas (CCAttrAmdSevSnp); @@ -2186,11 +2195,11 @@ MpInitLibInitialize ( // Don't pass BSP's TR to APs to avoid AP init failure. // VolatileRegisters.Tr = 0; - CopyMem (>CpuData[0].VolatileRegisters, , sizeof (VolatileRegisters)); + CopyMem (>CpuData[CpuMpData->BspNumber].VolatileRegisters, , sizeof (VolatileRegisters)); // // Set BSP basic information // - InitializeApData (CpuMpData, 0, 0, CpuMpData->Buffer + ApStackSize);
Re: [edk2-devel] [PATCH] Pkg-Module:UefiCpuPkg/MpLib:Do not assume BSP is #0.
Ning, I missed one minor issue with your patch. Can you check if the following GetBspNumber() call can be removed? if (FirstMpHandOff == NULL) { ... } else { ... CpuMpData->CpuCount = MaxLogicalProcessorNumber; CpuMpData->BspNumber = GetBspNumber (FirstMpHandOff); CpuInfoInHob = (CPU_INFO_IN_HOB *)(UINTN)CpuMpData->CpuInfoInHob; BTW, please remove "Pkg-Module:" from the subject. Thanks, Ray From: Feng, Ning Sent: Friday, May 24, 2024 7:16 To: devel@edk2.groups.io Cc: Feng, Ning ; Ni, Ray Subject: [PATCH] Pkg-Module:UefiCpuPkg/MpLib:Do not assume BSP is #0. REF:https://bugzilla.tianocore.org/show_bug.cgi?id=4778 MPInitlib have wrong expectation that BSP index should always be 0 in MpInitLibInitialize(), SwitchBsp(),ApWakeupFunction(). That will cause the data mismatch, if the initial BSP is not 0. Cc: Ray Ni Signed-off-by: Ning Feng --- UefiCpuPkg/Library/MpInitLib/MpLib.c | 34 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpInitLib/MpLib.c index d724456502..ae279c6ceb 100644 --- a/UefiCpuPkg/Library/MpInitLib/MpLib.c +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c @@ -114,6 +114,10 @@ FutureBSPProc ( SaveVolatileRegisters (>APInfo.VolatileRegisters); AsmExchangeRole (>APInfo, >BSPInfo); RestoreVolatileRegisters (>APInfo.VolatileRegisters, FALSE); + // + // Restore VolatileReg saved in CpuMpData->CpuData + // + CopyMem (>CpuData[DataInHob->BspNumber].VolatileRegisters, >APInfo.VolatileRegisters, sizeof (CPU_VOLATILE_REGISTERS)); } /** @@ -761,11 +765,11 @@ ApWakeupFunction ( BistData = (UINT32)ApStackData->Bist; // - // CpuMpData->CpuData[0].VolatileRegisters is initialized based on BSP environment, + // CpuMpData->CpuData[BspNumber].VolatileRegisters is initialized based on BSP environment, // to initialize AP in InitConfig path. - // NOTE: IDTR.BASE stored in CpuMpData->CpuData[0].VolatileRegisters points to a different IDT shared by all APs. + // NOTE: IDTR.BASE stored in CpuMpData->CpuData[BspNumber].VolatileRegisters points to a different IDT shared by all APs. // - RestoreVolatileRegisters (>CpuData[0].VolatileRegisters, FALSE); + RestoreVolatileRegisters (>CpuData[CpuMpData->BspNumber].VolatileRegisters, FALSE); InitializeApData (CpuMpData, ProcessorNumber, BistData, ApTopOfStack); ApStartupSignalBuffer = CpuMpData->CpuData[ProcessorNumber].StartupApSignal; } else { @@ -798,10 +802,10 @@ ApWakeupFunction ( // 1. AP is re-enabled after it's disabled, in either PEI or DXE phase. // 2. AP is initialized in DXE phase. // In either case, use the volatile registers value derived from BSP. -// NOTE: IDTR.BASE stored in CpuMpData->CpuData[0].VolatileRegisters points to a +// NOTE: IDTR.BASE stored in CpuMpData->CpuData[BspNumber].VolatileRegisters points to a // different IDT shared by all APs. // -RestoreVolatileRegisters (>CpuData[0].VolatileRegisters, FALSE); +RestoreVolatileRegisters (>CpuData[CpuMpData->BspNumber].VolatileRegisters, FALSE); } else { if (CpuMpData->ApLoopMode == ApInHltLoop) { // @@ -927,7 +931,7 @@ DxeApEntryPoint ( AsmWriteMsr64 (MSR_IA32_EFER, EferMsr.Uint64); } - RestoreVolatileRegisters (>CpuData[0].VolatileRegisters, FALSE); + RestoreVolatileRegisters (>CpuData[CpuMpData->BspNumber].VolatileRegisters, FALSE); InterlockedIncrement ((UINT32 *)>FinishedCount); PlaceAPInMwaitLoopOrRunLoop ( CpuMpData->ApLoopMode, @@ -2151,7 +2155,12 @@ MpInitLibInitialize ( CpuMpData->BackupBufferSize = ApResetVectorSizeBelow1Mb; CpuMpData->WakeupBuffer = (UINTN)-1; CpuMpData->CpuCount = 1; - CpuMpData->BspNumber= 0; + if (MpHandOff == NULL) { +CpuMpData->BspNumber = 0; + } else { +CpuMpData->BspNumber = GetBspNumber (MpHandOff); + } + CpuMpData->WaitEvent= NULL; CpuMpData->SwitchBspFlag= FALSE; CpuMpData->CpuData = (CPU_AP_DATA *)(CpuMpData + 1); @@ -2186,11 +2195,11 @@ MpInitLibInitialize ( // Don't pass BSP's TR to APs to avoid AP init failure. // VolatileRegisters.Tr = 0; - CopyMem (>CpuData[0].VolatileRegisters, , sizeof (VolatileRegisters)); + CopyMem (>CpuData[CpuMpData->BspNumber].VolatileRegisters, , sizeof (VolatileRegisters)); // // Set BSP basic information // - InitializeApData (CpuMpData, 0, 0, CpuMpData->Buffer + ApStackSize); + InitializeApData (CpuMpData, CpuMpData->BspNumber, 0, CpuMpData->Buffer + ApStackSize * (CpuMpData->BspNumber + 1)); // // Save assembly
Re: [edk2-devel] [PATCH] Pkg-Module:UefiCpuPkg/MpLib
Ning, The patch looks good to me. But it seems you did not change the patch title to a more specific message. [Ray.1] The subject should be more specific. E.g.: UefiCpuPkg/MpInitLib: Do not assume BSP is #0. Thanks, Ray From: Feng, Ning Sent: Friday, May 24, 2024 2:02 To: devel@edk2.groups.io Cc: Feng, Ning ; Ni, Ray Subject: [PATCH] Pkg-Module:UefiCpuPkg/MpLib REF:https://bugzilla.tianocore.org/show_bug.cgi?id=4778 MPInitlib have wrong expectation that BSP index should always be 0 in MpInitLibInitialize(), SwitchBsp(),ApWakeupFunction(). That will cause the data mismatch, if the initial BSP is not 0. Cc: Ray Ni Signed-off-by: Ning Feng --- UefiCpuPkg/Library/MpInitLib/MpLib.c | 34 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpInitLib/MpLib.c index d724456502..ae279c6ceb 100644 --- a/UefiCpuPkg/Library/MpInitLib/MpLib.c +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c @@ -114,6 +114,10 @@ FutureBSPProc ( SaveVolatileRegisters (>APInfo.VolatileRegisters); AsmExchangeRole (>APInfo, >BSPInfo); RestoreVolatileRegisters (>APInfo.VolatileRegisters, FALSE); + // + // Restore VolatileReg saved in CpuMpData->CpuData + // + CopyMem (>CpuData[DataInHob->BspNumber].VolatileRegisters, >APInfo.VolatileRegisters, sizeof (CPU_VOLATILE_REGISTERS)); } /** @@ -761,11 +765,11 @@ ApWakeupFunction ( BistData = (UINT32)ApStackData->Bist; // - // CpuMpData->CpuData[0].VolatileRegisters is initialized based on BSP environment, + // CpuMpData->CpuData[BspNumber].VolatileRegisters is initialized based on BSP environment, // to initialize AP in InitConfig path. - // NOTE: IDTR.BASE stored in CpuMpData->CpuData[0].VolatileRegisters points to a different IDT shared by all APs. + // NOTE: IDTR.BASE stored in CpuMpData->CpuData[BspNumber].VolatileRegisters points to a different IDT shared by all APs. // - RestoreVolatileRegisters (>CpuData[0].VolatileRegisters, FALSE); + RestoreVolatileRegisters (>CpuData[CpuMpData->BspNumber].VolatileRegisters, FALSE); InitializeApData (CpuMpData, ProcessorNumber, BistData, ApTopOfStack); ApStartupSignalBuffer = CpuMpData->CpuData[ProcessorNumber].StartupApSignal; } else { @@ -798,10 +802,10 @@ ApWakeupFunction ( // 1. AP is re-enabled after it's disabled, in either PEI or DXE phase. // 2. AP is initialized in DXE phase. // In either case, use the volatile registers value derived from BSP. -// NOTE: IDTR.BASE stored in CpuMpData->CpuData[0].VolatileRegisters points to a +// NOTE: IDTR.BASE stored in CpuMpData->CpuData[BspNumber].VolatileRegisters points to a // different IDT shared by all APs. // -RestoreVolatileRegisters (>CpuData[0].VolatileRegisters, FALSE); +RestoreVolatileRegisters (>CpuData[CpuMpData->BspNumber].VolatileRegisters, FALSE); } else { if (CpuMpData->ApLoopMode == ApInHltLoop) { // @@ -927,7 +931,7 @@ DxeApEntryPoint ( AsmWriteMsr64 (MSR_IA32_EFER, EferMsr.Uint64); } - RestoreVolatileRegisters (>CpuData[0].VolatileRegisters, FALSE); + RestoreVolatileRegisters (>CpuData[CpuMpData->BspNumber].VolatileRegisters, FALSE); InterlockedIncrement ((UINT32 *)>FinishedCount); PlaceAPInMwaitLoopOrRunLoop ( CpuMpData->ApLoopMode, @@ -2151,7 +2155,12 @@ MpInitLibInitialize ( CpuMpData->BackupBufferSize = ApResetVectorSizeBelow1Mb; CpuMpData->WakeupBuffer = (UINTN)-1; CpuMpData->CpuCount = 1; - CpuMpData->BspNumber= 0; + if (MpHandOff == NULL) { +CpuMpData->BspNumber = 0; + } else { +CpuMpData->BspNumber = GetBspNumber (MpHandOff); + } + CpuMpData->WaitEvent= NULL; CpuMpData->SwitchBspFlag= FALSE; CpuMpData->CpuData = (CPU_AP_DATA *)(CpuMpData + 1); @@ -2186,11 +2195,11 @@ MpInitLibInitialize ( // Don't pass BSP's TR to APs to avoid AP init failure. // VolatileRegisters.Tr = 0; - CopyMem (>CpuData[0].VolatileRegisters, , sizeof (VolatileRegisters)); + CopyMem (>CpuData[CpuMpData->BspNumber].VolatileRegisters, , sizeof (VolatileRegisters)); // // Set BSP basic information // - InitializeApData (CpuMpData, 0, 0, CpuMpData->Buffer + ApStackSize); + InitializeApData (CpuMpData, CpuMpData->BspNumber, 0, CpuMpData->Buffer + ApStackSize * (CpuMpData->BspNumber + 1)); // // Save assembly code information // @@ -2615,7 +2624,12 @@ SwitchBSPWorker ( SaveVolatileRegisters (>BSPInfo.VolatileRegisters); AsmExchangeRole (>BSPInfo, >APInfo); RestoreVolatileRegisters (>BSPInfo.VolatileRegisters, FALSE);
Re: [edk2-devel] [PATCH] Pkg-Module:UefiCpuPkg/MpLib
Ning, I tried to run uncrustify locally and still saw additional changes. It might mean the code style doesn't follow the uncrustify. more comments embedded in the patch mail starting with [Ray.]. Thanks, Ray From: Feng, Ning Sent: Thursday, May 23, 2024 19:13 To: devel@edk2.groups.io Cc: Feng, Ning ; Ni, Ray ; Wu, Jiaxin Subject: [PATCH] Pkg-Module:UefiCpuPkg/MpLib [Ray.1] The subject should be more specific. E.g.: UefiCpuPkg/MpInitLib: Do not assume BSP is #0 REF:https://bugzilla.tianocore.org/show_bug.cgi?id=4778 MPlib have wrong expectation that bsp id should always be 0 in [Ray.1] MPlib should be MpInitLib. "bsp id" -> "BSP index". MpInitLibInitialize(), SwitchBsp(),ApWakeupFunction(). That will caused the data mismatch, if the beginning bsp is not 0. [Ray.2] "will caused" -> "will cause", "beginning bsp" -> "initial bsp". Use CpuMpData->NewBspNumber insted of index 0 to avoid the issue. [Ray.3] "NewBspNumber" is only used in SwitchBsp() but not other places. I would just delete this from commit message. + // Restore VolatileReg saved in CpuMpData->CpuData [Ray.4] "Restore VolatileRegisters saved in CpuMpData->CpuData". // - InitializeApData (CpuMpData, 0, 0, CpuMpData->Buffer + ApStackSize); + InitializeApData (CpuMpData, CpuMpData->BspNumber, 0, CpuMpData->Buffer + ApStackSize * (CpuMpData->BspNumber+1)); [Ray.5] "BspNumber+1" -> "BspNumber + 1". (spaces before and after "+") -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#119133): https://edk2.groups.io/g/devel/message/119133 Mute This Topic: https://groups.io/mt/106256300/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH 7/9] MdeModulePkg:Consume gEdkiiVariableRuntimeCacheInfoHobGuid
Kun, Good to know that you have no concerns on the patch. The patch set aims to finalize the unblock memory regions before standalone MM env is launched. The PeiNotifyPpi() can still notify the PPI callback when the PPI has been installed already. Thanks, Ray From: Kun Qin Sent: Saturday, May 18, 2024 1:09 To: Ni, Ray ; Tan, Dun ; devel@edk2.groups.io Cc: Liming Gao ; Sean Brogan Subject: RE: [PATCH 7/9] MdeModulePkg:Consume gEdkiiVariableRuntimeCacheInfoHobGuid Hi Ray & Dun, Thanks for adding me to the patch. I think the proposed solution should work. One question, which is actually on the hob creator patch (https://edk2.groups.io/g/devel/message/119022), is that I understand the hob creation depends on “gEfiPeiMemoryDiscoveredPpiGuid”, but does this routine still run properly if variable PEIM is loaded much later than memory discovered? Regards, Kun From: Ni, Ray Sent: Friday, May 17, 2024 5:10 AM To: Tan, Dun ; devel@edk2.groups.io Cc: Liming Gao ; Kun Qin ; Sean Brogan Subject: [EXTERNAL] Re: [PATCH 7/9] MdeModulePkg:Consume gEdkiiVariableRuntimeCacheInfoHobGuid Reviewed-by: Ray Ni mailto:ray...@intel.com>> Thanks, Ray From: Tan, Dun mailto:dun@intel.com>> Sent: Friday, May 17, 2024 17:49 To: devel@edk2.groups.io<mailto:devel@edk2.groups.io> mailto:devel@edk2.groups.io>> Cc: Ni, Ray mailto:ray...@intel.com>>; Liming Gao mailto:gaolim...@byosoft.com.cn>> Subject: [PATCH 7/9] MdeModulePkg:Consume gEdkiiVariableRuntimeCacheInfoHobGuid Consume gEdkiiVariableRuntimeCacheInfoHobGuid in VariableSmmRuntimeDxe driver to initialize the following variable cache related buffer: *mVariableRuntimeHobCacheBuffer *mVariableRuntimeNvCacheBuffer *mVariableRuntimeVolatileCacheBuffer *mVariableRuntimeCachePendingUpdate *mVariableRuntimeCacheReadLock *mHobFlushComplete The code to to allocate and unblock the buffer for different type cache in VariableSmmRuntimeDxe is also removed in this commit. Signed-off-by: Dun Tan mailto:dun@intel.com>> Cc: Ray Ni mailto:ray...@intel.com>> Cc: Liming Gao mailto:gaolim...@byosoft.com.cn>> Cc: Jiaxin Wu mailto:jiaxin...@intel.com>> --- MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c | 120 +--- MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.inf | 5 +++-- 2 files changed, 52 insertions(+), 73 deletions(-) diff --git a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c index 8b42ae7d72..68a249c5ac 100644 --- a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c +++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c @@ -35,10 +35,11 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include #include -#include +#include #include #include +#include #include "PrivilegePolymorphic.h" #include "VariableParsing.h" @@ -56,10 +57,10 @@ VARIABLE_STORE_HEADER *mVariableRuntimeVolatileCacheBuffer = NULL; UINTN mVariableBufferSize; UINTN mVariableRuntimeHobCacheBufferSize; UINTN mVariableBufferPayloadSize; -BOOLEAN mVariableRuntimeCachePendingUpdate; -BOOLEAN mVariableRuntimeCacheReadLock; +BOOLEAN *mVariableRuntimeCachePendingUpdate; +BOOLEAN *mVariableRuntimeCacheReadLock; BOOLEAN mVariableAuthFormat; -BOOLEAN mHobFlushComplete; +BOOLEAN *mHobFlushComplete; EFI_LOCKmVariableServicesLock; EDKII_VARIABLE_LOCK_PROTOCOLmVariableLock; EDKII_VAR_CHECK_PROTOCOLmVarCheck; @@ -180,27 +181,6 @@ InitVariableCache ( *TotalVariableCacheSize = ALIGN_VALUE (*TotalVariableCacheSize, sizeof (UINT32)); - // - // Allocate NV Storage Cache and initialize it to all 1's (like an erased FV) - // - *VariableCacheBuffer = (VARIABLE_STORE_HEADER *)AllocateRuntimePages ( - EFI_SIZE_TO_PAGES (*TotalVariableCacheSize) - ); - if (*VariableCacheBuffer == NULL) { -return EFI_OUT_OF_RESOURCES; - } - - // - // Request to unblock the newly allocated cache region to be accessible from inside MM - // - Status = MmUnblockMemoryRequest ( - (EFI_PHYSICAL_ADDRESS)(UINTN)*VariableCacheBuffer, - EFI_SIZE_TO_PAGES (*TotalVariableCacheSize) - ); - if ((Status != EFI_UNSUPPORTED) && EFI_ERROR (Status)) { -return Status; - } - VariableCacheStorePtr = *Variab
Re: [edk2-devel] [Patch V2 00/18] Remove some S3 related code in CpuS3.c of smm cpu driver
Following 3 patches still require the Reviewed-by from package maintainers of MdeModulePkg and OvmfPkg. MdeModulePkg: Add gEdkiiS3MtrrSettingGuid OvmfPkg: Save MTRR by lockbox in CpuS3DataDxe MdeModulePkg:Remove MpService2Ppi field in SMM_S3_RESUME_STATE The patch set is a good move to simplify the X86 CPU SMM driver by removing most of S3 related logics. I hope it can be merged next week when the stable tag freeze ends in the end of this week. Thanks, Ray From: Tan, Dun Sent: Friday, May 17, 2024 17:45 To: devel@edk2.groups.io Cc: Liming Gao ; Wu, Jiaxin ; Ni, Ray ; Ard Biesheuvel ; Yao, Jiewen ; Gerd Hoffmann ; Kumar, Rahul R Subject: [Patch V2 00/18] Remove some S3 related code in CpuS3.c of smm cpu driver Comparing to V1 patchs set, the V2 patch set only adjusts the commits ordering and modifies copy right year in some files. This patch set is to remove some S3 related code in CpuS3.c of smm cpu driver. It contain commits to: 1) S3 MTRRs operation: > MdeModulePkg: Add gEdkiiS3MtrrSettingGuid > OvmfPkg: Save MTRR by lockbox in CpuS3DataDxe > UefiCpuPkg: Add locbox lib instance in DSC > UefiCpuPkg: Save MTRR by lockbox in CpuS3DataDxe > UefiCpuPkg: LoadMtrrData for all cpu in S3Resume > UefiCpuPkg: Remove code to load mtrr setting 2) AP page table unavailiable issue fix: > UefiCpuPkg: Disable PG in IA32 ApLoopCode 3) Register table cleanup: > UefiCpuPkg:Set PcdCpuFeaturesInitOnS3Resume to TRUE > UefiCpuPkg: Remove code to set register table 4) S3 ApHltLoopCode Operation: > UefiCpuPkg:Abstract some DxeMpLib code to function > UefiCpuPkg:Move some code in DxeMpLib to common place > UefiCpuPkg: Install gEdkiiEndOfS3ResumeGuid in S3Resume > UefiCpuPkg:Relocate AP to new safe buffer in PeiMpLib > UefiCpuPkg:Remove code to handle APIC setting and Interrupt > UefiCpuPkg:Rremove code to wakeup AP and relocate ap > UefiCpuPkg: Remove the duplicated mpservice locate > MdeModulePkg: remove MpService2Ppi field in SMM_S3_RESUME_STATE 5) Remove code to get AcpiCpuData: > UefiCpuPkg: Remove GetAcpiCpuData() in CpuS3.c With this patch set, CpuS3.c in smm CPU driver can be simplified. The whole patch set has been reviewed-by Ray. PR for review: https://github.com/tianocore/edk2/pull/5606 Cc: Liming Gao Cc: Jiaxin Wu Cc: Ray Ni Cc: Ard Biesheuvel Cc: Jiewen Yao Cc: Gerd Hoffmann Cc: Rahul Kumar Cc: Gerd Hoffmann Dun Tan (18): MdeModulePkg: Add gEdkiiS3MtrrSettingGuid OvmfPkg: Save MTRR by lockbox in CpuS3DataDxe UefiCpuPkg: Add locbox lib instance in DSC UefiCpuPkg: Save MTRR by lockbox in CpuS3DataDxe UefiCpuPkg: LoadMtrrData for all cpu in S3Resume UefiCpuPkg: Remove code to load mtrr setting UefiCpuPkg:Set PcdCpuFeaturesInitOnS3Resume to TRUE UefiCpuPkg: Remove code to set register table UefiCpuPkg: Disable PG in IA32 ApLoopCode UefiCpuPkg:Abstract some DxeMpLib code to function UefiCpuPkg:Move some code in DxeMpLib to common place UefiCpuPkg: Install gEdkiiEndOfS3ResumeGuid in S3Resume UefiCpuPkg:Relocate AP to new safe buffer in PeiMpLib UefiCpuPkg:Remove code to handle APIC setting and Interrupt UefiCpuPkg:Remove code to wakeup AP and relocate ap UefiCpuPkg: Remove unneeded MpService2Ppi assignment MdeModulePkg:Remove MpService2Ppi field in SMM_S3_RESUME_STATE UefiCpuPkg: Remove GetAcpiCpuData() in CpuS3.c MdeModulePkg/Include/Guid/AcpiS3Context.h | 3 +-- MdeModulePkg/MdeModulePkg.dec | 5 - OvmfPkg/CpuS3DataDxe/CpuS3Data.c| 13 - OvmfPkg/CpuS3DataDxe/CpuS3DataDxe.inf | 4 +++- UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c | 13 - UefiCpuPkg/CpuS3DataDxe/CpuS3DataDxe.inf| 4 +++- UefiCpuPkg/Library/MpInitLib/DxeMpLib.c | 183 - UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm | 6 +- UefiCpuPkg/Library/MpInitLib/MpLib.c| 144 +++- UefiCpuPkg/Library/MpInitLib/MpLib.h| 56 +++-- UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf | 6 +- UefiCpuPkg/Library/MpInitLib/PeiMpLib.c | 154 +- UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c | 993 +
Re: [edk2-devel] [PATCH 0/9] Allocate and unblock variable runtime cache buffer in PEI
I remember ARM platform could have a PEI-less design so that SEC directly invokes DXE. So I can imagine that a SEC logic to create the VARIABLE_RUNTIME_CACHE_INFO HOB. Then it comes to how to calculate the size before bios boots. I think it's doable. There are 3 caches. Volatile cache size is hardcode by a PCD. NV cache size can equal to the bios NV variable region size. HOB cache size can be calculated by: 1. collect all default values in IFR/VFR 2. convert the default variable to auth/non-auth type depending on the BIOS NV variable region format. Both steps can be performed in bios-build phase. There is no runtime information needed. Thanks, Ray From: Nhi Pham Sent: Monday, May 20, 2024 9:01 To: devel@edk2.groups.io ; Tan, Dun Cc: Ni, Ray ; Liming Gao ; Wu, Jiaxin ; Ard Biesheuvel ; Leif Lindholm ; Sami Mujawar ; Gerd Hoffmann ; Andrew Fish ; Yao, Jiewen Subject: Re: [edk2-devel] [PATCH 0/9] Allocate and unblock variable runtime cache buffer in PEI On 5/17/2024 4:49 PM, duntan via groups.io wrote: > This patch set defines a new VARIABLE_RUNTIME_CACHE_INFO HOB. The HOB is used > to store the address and size of the buffer that will be used for variable > runtime service when the PcdEnableVariableRuntimeCache is TRUE. > In following patches, when PcdEnableVariableRuntimeCache is TRUE, VariablePei > will install a callback of gEfiPeiMemoryDiscoveredPpiGuid to allocate the > needed buffer for different type variable runtime cache and build the HOB. > Then VariableSmmRuntimeDxe driver will consume > gEdkiiVariableRuntimeCacheInfoHobGuid to initialize the variable runtime > cache related content. The code to allocate and unblock the runtime cache > buffer in VariableSmmRuntimeDxe is also removed in this patc set. > > PR for review: https://github.com/tianocore/edk2/pull/5607 Per design, SMM or StandaloneMM needs to access these runtime cache buffers for cache coherency. I'm not sure how to implement the MmUnblockMemoryLib for ARM to dynamically request mapping of the non-secure runtime cache buffers in StandaloneMM (Secure World). Is it possible to have these runtime buffers allocated statically with predefined PCD at build time. On ARM, they can also define the buffers in device tree (manifest)? Thanks, Nhi -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#119072): https://edk2.groups.io/g/devel/message/119072 Mute This Topic: https://groups.io/mt/106150796/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH 9/9] MdeModulePkg:Add global variable mVariableRtCacheInfo
I didn't read through all changes. 2 comments: 1. Please do not remember to call ConvertPointer() for any pointers accessed at runtime. I think your patch contains 4 pointers in the mVariableRtCacheInfo structure. 2. Please do not call FreePages() to free a PEI-allocated runtime memory. It won't succeed as PEI and DXE memory services do not share one database. * The FreePages() call should be removed in earlier patch when you let the Variable driver consume the PEI-allocated memory. Thanks, Ray From: Tan, Dun Sent: Friday, May 17, 2024 17:49 To: devel@edk2.groups.io Cc: Ni, Ray ; Liming Gao ; Wu, Jiaxin Subject: [PATCH 9/9] MdeModulePkg:Add global variable mVariableRtCacheInfo Add global variable mVariableRtCacheInfo to save the content in gEdkiiVariableRuntimeCacheInfoHobGuid. With this new global variable, 7 global variables can be removed. Signed-off-by: Dun Tan Cc: Ray Ni Cc: Liming Gao Cc: Jiaxin Wu --- MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c | 97 + 1 file changed, 41 insertions(+), 56 deletions(-) diff --git a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c index 6efe5cee10..de39462d68 100644 --- a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c +++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c @@ -44,26 +44,20 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include "PrivilegePolymorphic.h" #include "VariableParsing.h" -EFI_HANDLE mHandle = NULL; -EFI_SMM_VARIABLE_PROTOCOL *mSmmVariable= NULL; -EFI_EVENT mVirtualAddressChangeEvent = NULL; -EFI_MM_COMMUNICATION2_PROTOCOL *mMmCommunication2 = NULL; -UINT8 *mVariableBuffer = NULL; -UINT8 *mVariableBufferPhysical = NULL; -VARIABLE_INFO_ENTRY *mVariableInfo = NULL; -VARIABLE_STORE_HEADER *mVariableRuntimeHobCacheBuffer = NULL; -VARIABLE_STORE_HEADER *mVariableRuntimeNvCacheBuffer = NULL; -VARIABLE_STORE_HEADER *mVariableRuntimeVolatileCacheBuffer = NULL; +EFI_HANDLE mHandle= NULL; +EFI_SMM_VARIABLE_PROTOCOL *mSmmVariable = NULL; +EFI_EVENT mVirtualAddressChangeEvent = NULL; +EFI_MM_COMMUNICATION2_PROTOCOL *mMmCommunication2 = NULL; +UINT8 *mVariableBuffer = NULL; +UINT8 *mVariableBufferPhysical = NULL; +VARIABLE_INFO_ENTRY *mVariableInfo = NULL; UINTN mVariableBufferSize; -UINTN mVariableRuntimeHobCacheBufferSize; UINTN mVariableBufferPayloadSize; -BOOLEAN *mVariableRuntimeCachePendingUpdate; -BOOLEAN *mVariableRuntimeCacheReadLock; BOOLEAN mVariableAuthFormat; -BOOLEAN *mHobFlushComplete; EFI_LOCKmVariableServicesLock; EDKII_VARIABLE_LOCK_PROTOCOLmVariableLock; EDKII_VAR_CHECK_PROTOCOLmVarCheck; +VARIABLE_RUNTIME_CACHE_INFO mVariableRtCacheInfo; /** The logic to initialize the VariablePolicy engine is in its own file. @@ -500,21 +494,21 @@ CheckForRuntimeCacheSync ( VOID ) { - if (*mVariableRuntimeCachePendingUpdate) { + if (mVariableRtCacheInfo.CacheInfoFlag->PendingUpdate) { SyncRuntimeCache (); } - ASSERT (!(*mVariableRuntimeCachePendingUpdate)); + ASSERT (!(mVariableRtCacheInfo.CacheInfoFlag->PendingUpdate)); // // The HOB variable data may have finished being flushed in the runtime cache sync update // - if ((*mHobFlushComplete) && (mVariableRuntimeHobCacheBuffer != NULL)) { + if ((mVariableRtCacheInfo.CacheInfoFlag->HobFlushComplete) && (mVariableRtCacheInfo.RuntimeHobCacheBuffer != 0)) { if (!EfiAtRuntime ()) { - FreePages (mVariableRuntimeHobCacheBuffer, EFI_SIZE_TO_PAGES (mVariableRuntimeHobCacheBufferSize)); + FreePages ((VOID *)(UINTN)mVariableRtCacheInfo.RuntimeHobCacheBuffer, mVariableRtCacheInfo.RuntimeHobCachePages); } -mVariableRuntimeHobCacheBuffer = NULL; +mVariableRtCacheInfo.RuntimeHobCacheBuffer = 0; } } @@ -565,20 +559,20 @@ FindVariableInRuntimeCache ( // a GetVariable () or GetNextVariable () call from being issued until a prior call has returned. The runtime // cache read lock should always be free when entering this function. // - ASSERT (!(*mVariableRuntimeCacheReadLock)); + ASSERT (!
Re: [edk2-devel] [PATCH 7/9] MdeModulePkg:Consume gEdkiiVariableRuntimeCacheInfoHobGuid
Dun, All the 6 new pointers that are accessed at runtime should be converted through ConvertPointer(). Please ignore my previous Reviewed-by. Thanks, Ray From: Tan, Dun Sent: Friday, May 17, 2024 17:49 To: devel@edk2.groups.io Cc: Ni, Ray ; Liming Gao Subject: [PATCH 7/9] MdeModulePkg:Consume gEdkiiVariableRuntimeCacheInfoHobGuid Consume gEdkiiVariableRuntimeCacheInfoHobGuid in VariableSmmRuntimeDxe driver to initialize the following variable cache related buffer: *mVariableRuntimeHobCacheBuffer *mVariableRuntimeNvCacheBuffer *mVariableRuntimeVolatileCacheBuffer *mVariableRuntimeCachePendingUpdate *mVariableRuntimeCacheReadLock *mHobFlushComplete The code to to allocate and unblock the buffer for different type cache in VariableSmmRuntimeDxe is also removed in this commit. Signed-off-by: Dun Tan Cc: Ray Ni Cc: Liming Gao Cc: Jiaxin Wu --- MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c | 120 +--- MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.inf | 5 +++-- 2 files changed, 52 insertions(+), 73 deletions(-) diff --git a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c index 8b42ae7d72..68a249c5ac 100644 --- a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c +++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c @@ -35,10 +35,11 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include #include -#include +#include #include #include +#include #include "PrivilegePolymorphic.h" #include "VariableParsing.h" @@ -56,10 +57,10 @@ VARIABLE_STORE_HEADER *mVariableRuntimeVolatileCacheBuffer = NULL; UINTN mVariableBufferSize; UINTN mVariableRuntimeHobCacheBufferSize; UINTN mVariableBufferPayloadSize; -BOOLEAN mVariableRuntimeCachePendingUpdate; -BOOLEAN mVariableRuntimeCacheReadLock; +BOOLEAN *mVariableRuntimeCachePendingUpdate; +BOOLEAN *mVariableRuntimeCacheReadLock; BOOLEAN mVariableAuthFormat; -BOOLEAN mHobFlushComplete; +BOOLEAN *mHobFlushComplete; EFI_LOCKmVariableServicesLock; EDKII_VARIABLE_LOCK_PROTOCOLmVariableLock; EDKII_VAR_CHECK_PROTOCOLmVarCheck; @@ -180,27 +181,6 @@ InitVariableCache ( *TotalVariableCacheSize = ALIGN_VALUE (*TotalVariableCacheSize, sizeof (UINT32)); - // - // Allocate NV Storage Cache and initialize it to all 1's (like an erased FV) - // - *VariableCacheBuffer = (VARIABLE_STORE_HEADER *)AllocateRuntimePages ( - EFI_SIZE_TO_PAGES (*TotalVariableCacheSize) - ); - if (*VariableCacheBuffer == NULL) { -return EFI_OUT_OF_RESOURCES; - } - - // - // Request to unblock the newly allocated cache region to be accessible from inside MM - // - Status = MmUnblockMemoryRequest ( - (EFI_PHYSICAL_ADDRESS)(UINTN)*VariableCacheBuffer, - EFI_SIZE_TO_PAGES (*TotalVariableCacheSize) - ); - if ((Status != EFI_UNSUPPORTED) && EFI_ERROR (Status)) { -return Status; - } - VariableCacheStorePtr = *VariableCacheBuffer; SetMem32 ((VOID *)VariableCacheStorePtr, *TotalVariableCacheSize, (UINT32)0x); @@ -568,16 +548,16 @@ CheckForRuntimeCacheSync ( VOID ) { - if (mVariableRuntimeCachePendingUpdate) { + if (*mVariableRuntimeCachePendingUpdate) { SyncRuntimeCache (); } - ASSERT (!mVariableRuntimeCachePendingUpdate); + ASSERT (!(*mVariableRuntimeCachePendingUpdate)); // // The HOB variable data may have finished being flushed in the runtime cache sync update // - if (mHobFlushComplete && (mVariableRuntimeHobCacheBuffer != NULL)) { + if ((*mHobFlushComplete) && (mVariableRuntimeHobCacheBuffer != NULL)) { if (!EfiAtRuntime ()) { FreePages (mVariableRuntimeHobCacheBuffer, EFI_SIZE_TO_PAGES (mVariableRuntimeHobCacheBufferSize)); } @@ -633,12 +613,12 @@ FindVariableInRuntimeCache ( // a GetVariable () or GetNextVariable () call from being issued until a prior call has returned. The runtime // cache read lock should always be free when entering this function. // - ASSERT (!mVariableRuntimeCacheReadLock); + ASSERT (!(*mVariableRuntimeCacheReadLock)); - mVariableRuntimeCacheReadLock = TRUE; + *mVariableRuntimeCacheReadLock = TRUE; CheckForRuntimeCacheSync (); - if (!mVariableRuntimeCachePendingUpdate) { + if (!(*mVariableRuntimeCachePendingUpdate)) { //
Re: [edk2-devel] [PATCH 7/9] MdeModulePkg:Consume gEdkiiVariableRuntimeCacheInfoHobGuid
Reviewed-by: Ray Ni Thanks, Ray From: Tan, Dun Sent: Friday, May 17, 2024 17:49 To: devel@edk2.groups.io Cc: Ni, Ray ; Liming Gao Subject: [PATCH 7/9] MdeModulePkg:Consume gEdkiiVariableRuntimeCacheInfoHobGuid Consume gEdkiiVariableRuntimeCacheInfoHobGuid in VariableSmmRuntimeDxe driver to initialize the following variable cache related buffer: *mVariableRuntimeHobCacheBuffer *mVariableRuntimeNvCacheBuffer *mVariableRuntimeVolatileCacheBuffer *mVariableRuntimeCachePendingUpdate *mVariableRuntimeCacheReadLock *mHobFlushComplete The code to to allocate and unblock the buffer for different type cache in VariableSmmRuntimeDxe is also removed in this commit. Signed-off-by: Dun Tan Cc: Ray Ni Cc: Liming Gao Cc: Jiaxin Wu --- MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c | 120 +--- MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.inf | 5 +++-- 2 files changed, 52 insertions(+), 73 deletions(-) diff --git a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c index 8b42ae7d72..68a249c5ac 100644 --- a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c +++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c @@ -35,10 +35,11 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include #include -#include +#include #include #include +#include #include "PrivilegePolymorphic.h" #include "VariableParsing.h" @@ -56,10 +57,10 @@ VARIABLE_STORE_HEADER *mVariableRuntimeVolatileCacheBuffer = NULL; UINTN mVariableBufferSize; UINTN mVariableRuntimeHobCacheBufferSize; UINTN mVariableBufferPayloadSize; -BOOLEAN mVariableRuntimeCachePendingUpdate; -BOOLEAN mVariableRuntimeCacheReadLock; +BOOLEAN *mVariableRuntimeCachePendingUpdate; +BOOLEAN *mVariableRuntimeCacheReadLock; BOOLEAN mVariableAuthFormat; -BOOLEAN mHobFlushComplete; +BOOLEAN *mHobFlushComplete; EFI_LOCKmVariableServicesLock; EDKII_VARIABLE_LOCK_PROTOCOLmVariableLock; EDKII_VAR_CHECK_PROTOCOLmVarCheck; @@ -180,27 +181,6 @@ InitVariableCache ( *TotalVariableCacheSize = ALIGN_VALUE (*TotalVariableCacheSize, sizeof (UINT32)); - // - // Allocate NV Storage Cache and initialize it to all 1's (like an erased FV) - // - *VariableCacheBuffer = (VARIABLE_STORE_HEADER *)AllocateRuntimePages ( - EFI_SIZE_TO_PAGES (*TotalVariableCacheSize) - ); - if (*VariableCacheBuffer == NULL) { -return EFI_OUT_OF_RESOURCES; - } - - // - // Request to unblock the newly allocated cache region to be accessible from inside MM - // - Status = MmUnblockMemoryRequest ( - (EFI_PHYSICAL_ADDRESS)(UINTN)*VariableCacheBuffer, - EFI_SIZE_TO_PAGES (*TotalVariableCacheSize) - ); - if ((Status != EFI_UNSUPPORTED) && EFI_ERROR (Status)) { -return Status; - } - VariableCacheStorePtr = *VariableCacheBuffer; SetMem32 ((VOID *)VariableCacheStorePtr, *TotalVariableCacheSize, (UINT32)0x); @@ -568,16 +548,16 @@ CheckForRuntimeCacheSync ( VOID ) { - if (mVariableRuntimeCachePendingUpdate) { + if (*mVariableRuntimeCachePendingUpdate) { SyncRuntimeCache (); } - ASSERT (!mVariableRuntimeCachePendingUpdate); + ASSERT (!(*mVariableRuntimeCachePendingUpdate)); // // The HOB variable data may have finished being flushed in the runtime cache sync update // - if (mHobFlushComplete && (mVariableRuntimeHobCacheBuffer != NULL)) { + if ((*mHobFlushComplete) && (mVariableRuntimeHobCacheBuffer != NULL)) { if (!EfiAtRuntime ()) { FreePages (mVariableRuntimeHobCacheBuffer, EFI_SIZE_TO_PAGES (mVariableRuntimeHobCacheBufferSize)); } @@ -633,12 +613,12 @@ FindVariableInRuntimeCache ( // a GetVariable () or GetNextVariable () call from being issued until a prior call has returned. The runtime // cache read lock should always be free when entering this function. // - ASSERT (!mVariableRuntimeCacheReadLock); + ASSERT (!(*mVariableRuntimeCacheReadLock)); - mVariableRuntimeCacheReadLock = TRUE; + *mVariableRuntimeCacheReadLock = TRUE; CheckForRuntimeCacheSync (); - if (!mVariableRuntimeCachePendingUpdate) { + if (!(*mVariableRuntimeCachePendingUpdate)) { // // 0: Volatile, 1: HOB, 2: Non-Volatile. // The index and attributes mapping must be kept in this ord
Re: [edk2-devel] [PATCH 6/9] MdeModulePkg:Remove unnecessary global variable
Reviewed-by: Ray Ni Thanks, Ray From: Tan, Dun Sent: Friday, May 17, 2024 17:49 To: devel@edk2.groups.io Cc: Ni, Ray ; Liming Gao ; Wu, Jiaxin Subject: [PATCH 6/9] MdeModulePkg:Remove unnecessary global variable Remove the two unnecessary global variables and replace them by two local variables: mVariableRuntimeNvCacheBufferSize mVariableRuntimeVolatileCacheBufferSize Signed-off-by: Dun Tan Cc: Ray Ni Cc: Liming Gao Cc: Jiaxin Wu --- MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c | 14 +++--- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c index 6930875e9f..8b42ae7d72 100644 --- a/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c +++ b/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.c @@ -13,7 +13,7 @@ InitCommunicateBuffer() is really function to check the variable data size. -Copyright (c) 2010 - 2019, Intel Corporation. All rights reserved. +Copyright (c) 2010 - 2024, Intel Corporation. All rights reserved. Copyright (c) Microsoft Corporation. SPDX-License-Identifier: BSD-2-Clause-Patent @@ -55,8 +55,6 @@ VARIABLE_STORE_HEADER *mVariableRuntimeNvCacheBuffer = NULL; VARIABLE_STORE_HEADER *mVariableRuntimeVolatileCacheBuffer = NULL; UINTN mVariableBufferSize; UINTN mVariableRuntimeHobCacheBufferSize; -UINTN mVariableRuntimeNvCacheBufferSize; -UINTN mVariableRuntimeVolatileCacheBufferSize; UINTN mVariableBufferPayloadSize; BOOLEAN mVariableRuntimeCachePendingUpdate; BOOLEAN mVariableRuntimeCacheReadLock; @@ -1691,6 +1689,8 @@ SmmVariableReady ( ) { EFI_STATUS Status; + UINTN RuntimeNvCacheSize; + UINTN RuntimeVolatileCacheSize; Status = gBS->LocateProtocol (, NULL, (VOID **)); if (EFI_ERROR (Status)) { @@ -1721,16 +1721,16 @@ SmmVariableReady ( // Status = GetRuntimeCacheInfo ( , -, -, +, +, ); if (!EFI_ERROR (Status)) { Status = InitVariableCache (, ); if (!EFI_ERROR (Status)) { -Status = InitVariableCache (, ); +Status = InitVariableCache (, ); if (!EFI_ERROR (Status)) { - Status = InitVariableCache (, ); + Status = InitVariableCache (, ); if (!EFI_ERROR (Status)) { Status = SendRuntimeVariableCacheContextToSmm (); if (!EFI_ERROR (Status)) { -- 2.31.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#119045): https://edk2.groups.io/g/devel/message/119045 Mute This Topic: https://groups.io/mt/106150803/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH 5/9] MdeModulePkg:Create gEdkiiVariableRuntimeCacheInfoHobGuid
+ VariableRuntimeCacheHob = BuildGuidHob (, sizeof (VARIABLE_RUNTIME_CACHE_INFO)); + ASSERT (VariableRuntimeCacheHob != NULL); + ZeroMem (VariableRuntimeCacheHob, sizeof (VARIABLE_RUNTIME_CACHE_INFO)); + + // + // AllocateRuntimePages for CACHE_INFO_FLAG and unblock it. + // + Pages = EFI_SIZE_TO_PAGES (sizeof (CACHE_INFO_FLAG)); + Buffer = AllocateRuntimePages (Pages); + ASSERT (Buffer != NULL); + Status = MmUnblockMemoryRequest ( + (EFI_PHYSICAL_ADDRESS)(UINTN)Buffer, + Pages + ); + if ((Status != EFI_UNSUPPORTED) && EFI_ERROR (Status)) { +return Status; [Ray.1] The GUID hob is created already. Maybe you should defer the HOB creation to later phase. + } + + VariableRuntimeCacheHob->CacheInfoFlag = (CACHE_INFO_FLAG *)(UINTN)Buffer; + DEBUG (( +DEBUG_INFO, +"PeiVariable: CACHE_INFO_FLAG Buffer is: 0x%x, number of pages is: 0x%x\n", [Ray.2] please use "%p" for pointer dump. "%x" only prints "int" type value. [Ray.3]I think you should create HOB at this point. -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#119044): https://edk2.groups.io/g/devel/message/119044 Mute This Topic: https://groups.io/mt/106150802/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH 4/9] OvmfPkg: Add MmUnblockMemoryLib in DSC
it's not needed. Thanks, Ray From: Tan, Dun Sent: Friday, May 17, 2024 17:49 To: devel@edk2.groups.io Cc: Ni, Ray ; Ard Biesheuvel ; Yao, Jiewen ; Gerd Hoffmann Subject: [PATCH 4/9] OvmfPkg: Add MmUnblockMemoryLib in DSC Add MmUnblockMemoryLib in OvmfPkgIa32X64.dsc. This lib will be required by VariablePei in following commits. Signed-off-by: Dun Tan Cc: Ray Ni Cc: Ard Biesheuvel Cc: Jiewen Yao Cc: Gerd Hoffmann --- OvmfPkg/OvmfPkgIa32X64.dsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc index d27a4c7278..cc03104aac 100644 --- a/OvmfPkg/OvmfPkgIa32X64.dsc +++ b/OvmfPkg/OvmfPkgIa32X64.dsc @@ -233,7 +233,7 @@ VariablePolicyLib|MdeModulePkg/Library/VariablePolicyLib/VariablePolicyLib.inf VariablePolicyHelperLib|MdeModulePkg/Library/VariablePolicyHelperLib/VariablePolicyHelperLib.inf VariableFlashInfoLib|MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariableFlashInfoLib.inf - + MmUnblockMemoryLib|MdePkg/Library/MmUnblockMemoryLib/MmUnblockMemoryLibNull.inf # # Network libraries -- 2.31.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#119043): https://edk2.groups.io/g/devel/message/119043 Mute This Topic: https://groups.io/mt/106150800/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH 3/9] EmulatorPkg: Add MmUnblockMemoryLib in DSC
It's not needed. Thanks, Ray From: Tan, Dun Sent: Friday, May 17, 2024 17:49 To: devel@edk2.groups.io Cc: Andrew Fish ; Ni, Ray Subject: [PATCH 3/9] EmulatorPkg: Add MmUnblockMemoryLib in DSC Add MmUnblockMemoryLib in EmulatorPkg.dsc. This lib will be required by VariablePei in following commits. Signed-off-by: Dun Tan Cc: Andrew Fish Cc: Ray Ni --- EmulatorPkg/EmulatorPkg.dsc | 1 + 1 file changed, 1 insertion(+) diff --git a/EmulatorPkg/EmulatorPkg.dsc b/EmulatorPkg/EmulatorPkg.dsc index 5fa1ed345a..0e15dafb5c 100644 --- a/EmulatorPkg/EmulatorPkg.dsc +++ b/EmulatorPkg/EmulatorPkg.dsc @@ -127,6 +127,7 @@ ShellLib|ShellPkg/Library/UefiShellLib/UefiShellLib.inf FileHandleLib|MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf ImagePropertiesRecordLib|MdeModulePkg/Library/ImagePropertiesRecordLib/ImagePropertiesRecordLib.inf + MmUnblockMemoryLib|MdePkg/Library/MmUnblockMemoryLib/MmUnblockMemoryLibNull.inf !if $(SECURE_BOOT_ENABLE) == TRUE RngLib|MdeModulePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.inf -- 2.31.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#119042): https://edk2.groups.io/g/devel/message/119042 Mute This Topic: https://groups.io/mt/106150799/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH 2/9] ArmVirtPkg: Add MmUnblockMemoryLib in DSC
+ MmUnblockMemoryLib|MdePkg/Library/MmUnblockMemoryLib/MmUnblockMemoryLibNull.inf [Ray] Do you really need this line as the next "!include" already includes the NULL instance lib? + !include MdePkg/MdeLibs.dsc.inc -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#119041): https://edk2.groups.io/g/devel/message/119041 Mute This Topic: https://groups.io/mt/106150798/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH 1/9] MdeModulePkg:Add new gEdkiiVariableRuntimeCacheInfoHobGuid
There is no need to use pack(1). Explicit pack(1) is needed when you really need to save spaces or the data is saved in some NV storage to be accessed by a different software component. Thanks, Ray From: Tan, Dun Sent: Friday, May 17, 2024 17:49 To: devel@edk2.groups.io Cc: Ni, Ray ; Liming Gao ; Wu, Jiaxin Subject: [PATCH 1/9] MdeModulePkg:Add new gEdkiiVariableRuntimeCacheInfoHobGuid This commit defines VARIABLE_RUNTIME_CACHE_INFO HOB. The HOB is used to store the address and size of the buffer that will be used for variable runtime service when the PcdEnableVariableRuntimeCache is TRUE. In following patches, when PcdEnableVariableRuntimeCache is TRUE, VariablePei module will install a callback of gEfiPeiMemoryDiscoveredPpiGuid to allocate needed buffer for different type cache, unblock the buffer and build HOB. Then VariableSmmRuntimeDxe driver will consume the gEdkiiVariableRuntimeCacheInfoHobGuid to initialize the variable runtime cache related content. Signed-off-by: Dun Tan Cc: Ray Ni Cc: Liming Gao Cc: Jiaxin Wu --- MdeModulePkg/Include/Guid/VariableRuntimeCacheInfo.h | 65 + MdeModulePkg/MdeModulePkg.dec| 3 +++ 2 files changed, 68 insertions(+) diff --git a/MdeModulePkg/Include/Guid/VariableRuntimeCacheInfo.h b/MdeModulePkg/Include/Guid/VariableRuntimeCacheInfo.h new file mode 100644 index 00..c2a8b77945 --- /dev/null +++ b/MdeModulePkg/Include/Guid/VariableRuntimeCacheInfo.h @@ -0,0 +1,65 @@ +/** @file + This Variable Runtime Cache Info HOB is used to store the address + and the size of the buffer that will be used for variable runtime + service when the PcdEnableVariableRuntimeCache is TRUE. + + Copyright (c) 2024, Intel Corporation. All rights reserved. + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef VARIABLE_RUNTIME_CACHE_INFO_H_ +#define VARIABLE_RUNTIME_CACHE_INFO_H_ + +#include + +#define VARIABLE_RUNTIME_CACHE_INFO_HOB_REVISION 1 + +#define VARIABLE_RUNTIME_CACHE_INFO_GUID \ + { \ +0x0f472f7d, 0x6713, 0x4915, {0x96, 0x14, 0x5d, 0xda, 0x28, 0x40, 0x10, 0x56} \ + } + +#pragma pack(1) +typedef struct { + /// + /// TRUE indicates GetVariable () or GetNextVariable () is being called. + /// When the value is FALSE, the given update (and any other pending updates) + /// can be flushed to the runtime cache. + /// + BOOLEANReadLock; + /// + /// TRUE indicates there is pending update for the given variable store needed + /// to be flushed to the runtime cache. + /// + BOOLEANPendingUpdate; + /// + /// TRUE indicates all HOB variables have been flushed in flash. + /// + BOOLEANHobFlushComplete; +} CACHE_INFO_FLAG; + +typedef struct { + CACHE_INFO_FLAG*CacheInfoFlag; + /// + /// Buffer reserved for runtime Hob cache + /// + UINT64 RuntimeHobCacheBuffer; + UINTN RuntimeHobCachePages; + /// + /// Buffer reserved for Non-Volatile runtime cache + /// + UINT64 RuntimeNvCacheBuffer; + UINTN RuntimeNvCachePages; + /// + /// Buffer reserved for Volatile runtime cache + /// + UINT64 RuntimeVolatileCacheBuffer; + UINTN RuntimeVolatileCachePages; +} VARIABLE_RUNTIME_CACHE_INFO; +#pragma pack() + +extern EFI_GUID gEdkiiVariableRuntimeCacheInfoHobGuid; + +#endif diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec index f7339f0aec..1bf5e31b7c 100644 --- a/MdeModulePkg/MdeModulePkg.dec +++ b/MdeModulePkg/MdeModulePkg.dec @@ -465,6 +465,9 @@ gEdk2JedecSfdpSpiDxeDriverGuid = { 0xBE71701E, 0xB63C, 0x4574, { 0x9C, 0x5C, 0x36, 0x29, 0xE8, 0xEA, 0xC4, 0x14 }} gEdk2JedecSfdpSpiSmmDriverGuid = { 0x95A1E915, 0x195C, 0x477C, { 0x92, 0x6F, 0x7E, 0x24, 0x67, 0xC1, 0xB3, 0x1F }} + ## Include/Guid/VariableRuntimeCacheInfo.h + gEdkiiVariableRuntimeCacheInfoHobGuid = { 0x0f472f7d, 0x6713, 0x4915, { 0x96, 0x14, 0x5d, 0xda, 0x28, 0x40, 0x10, 0x56 }} + [Ppis] ## Include/Ppi/FirmwareVolumeShadowPpi.h gEdkiiPeiFirmwareVolumeShadowPpiGuid = { 0x7dfe756c, 0xed8d, 0x4d77, {0x9e, 0xc4, 0x39, 0x9a, 0x8a, 0x81, 0x51, 0x16 } } -- 2.31.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#119040): https://edk2.groups.io/g/devel/message/119040 Mute This Topic: https://groups.io/mt/106150797/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH] UefiCpuPkg:fix issue when splitting paging entry
Reviewed-by: Ray Ni Thanks, Ray From: Tan, Dun Sent: Friday, May 17, 2024 17:44 To: devel@edk2.groups.io Cc: Ni, Ray ; Kumar, Rahul R ; Gerd Hoffmann ; Wu, Jiaxin ; Zhou, Jianfeng Subject: [PATCH] UefiCpuPkg:fix issue when splitting paging entry This patch is to fix issue when splitting leaf paging entry in CpuPageTableLib code. In previous code, before we assign the new child paging structure address to the content of splitted paging entry, PageTableLibSetPnle() is called to make sure the bit7 is set to 0, which indicate the previous leaf entry is changed to non-leaf entry now. There is a gap between we change the bit7 and we assign the new child paging structure address to the content of the splitted paging entry. If the address of code execution or data access happens to be in the range covered by the splitted paging entry, this gap may cause issue. In this patch, we prepare the new paging entry content value in a local variable and assign the value to the splitted paging entry at once. The volatile keyword is used to ensure that no optimization will occur in compilation. Signed-off-by: Dun Tan Cc: Ray Ni Cc: Rahul Kumar Cc: Gerd Hoffmann Cc: Jiaxin Wu Cc: Zhou Jianfeng --- UefiCpuPkg/Library/CpuPageTableLib/CpuPageTableMap.c | 9 +++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/UefiCpuPkg/Library/CpuPageTableLib/CpuPageTableMap.c b/UefiCpuPkg/Library/CpuPageTableLib/CpuPageTableMap.c index b10a3008e4..bdc411338f 100644 --- a/UefiCpuPkg/Library/CpuPageTableLib/CpuPageTableMap.c +++ b/UefiCpuPkg/Library/CpuPageTableLib/CpuPageTableMap.c @@ -342,6 +342,7 @@ PageTableLibMapInLevel ( UINT64 PhysicalAddrInAttr; IA32_PAGING_ENTRY OriginalParentPagingEntry; IA32_PAGING_ENTRY OriginalCurrentPagingEntry; + IA32_PAGING_ENTRY TempPagingEntry; ASSERT (Level != 0); ASSERT ((Attribute != NULL) && (Mask != NULL)); @@ -359,6 +360,8 @@ PageTableLibMapInLevel ( OriginalParentPagingEntry.Uint64 = ParentPagingEntry->Uint64; OneOfPagingEntry.Uint64 = 0; + TempPagingEntry.Uint64 = 0; + // // RegionLength: 256T (1 << 48) 512G (1 << 39), 1G (1 << 30), 2M (1 << 21) or 4K (1 << 12). // @@ -441,8 +444,10 @@ PageTableLibMapInLevel ( // Non-leaf entry doesn't have PAT bit. So use ~IA32_PE_BASE_ADDRESS_MASK_40 is to make sure PAT bit // (bit12) in original big-leaf entry is not assigned to PageTableBaseAddress field of non-leaf entry. // - PageTableLibSetPnle (>Pnle, , ); - ParentPagingEntry->Uint64 = ((UINTN)(VOID *)PagingEntry) | (ParentPagingEntry->Uint64 & (~IA32_PE_BASE_ADDRESS_MASK_40)); + TempPagingEntry.Uint64 = ParentPagingEntry->Uint64; + PageTableLibSetPnle (, , ); + TempPagingEntry.Uint64 = ((UINTN)(VOID *)PagingEntry) | (TempPagingEntry.Uint64 & (~IA32_PE_BASE_ADDRESS_MASK_40)); + *(volatile UINT64 *)&(ParentPagingEntry->Uint64) = TempPagingEntry.Uint64; } } else { // -- 2.31.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#119039): https://edk2.groups.io/g/devel/message/119039 Mute This Topic: https://groups.io/mt/106150750/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH v2] MdeModulePkg/PciBusDxe: plug device hierarchy leak upon bridge hot-unplug
Thanks for confirming. Thanks, Ray From: Ding, Feng (Sunnyvale) Sent: Friday, May 17, 2024 8:39 To: Ni, Ray ; Hsueh, Hong-Chih (Neo) ; Laszlo Ersek ; devel@edk2.groups.io Cc: He, Jiangang ; Chang, Abner ; gaolim...@byosoft.com.cn Subject: RE: [PATCH v2] MdeModulePkg/PciBusDxe: plug device hierarchy leak upon bridge hot-unplug [AMD Official Use Only - AMD Internal Distribution Only] Hi Ray, You are right. The change is NOT necessary. Thanks feng From: Ni, Ray Sent: Tuesday, May 7, 2024 8:26 PM To: Hsueh, Hong-Chih (Neo) ; Laszlo Ersek ; devel@edk2.groups.io Cc: Ding, Feng (Sunnyvale) ; He, Jiangang ; Chang, Abner ; gaolim...@byosoft.com.cn Subject: Re: [PATCH v2] MdeModulePkg/PciBusDxe: plug device hierarchy leak upon bridge hot-unplug Caution: This message originated from an External Source. Use proper caution when opening attachments, clicking links, or responding. Neo, I don't think your change is needed because of the following existing logic where RemoveAllPciDeviceOnBridge() is called to destroy/free all PCI nodes. if (Operation == EfiPciHotplugRequestRemove) { if (*NumberOfChildren == 0) { // // Remove all devices on the bridge // RemoveAllPciDeviceOnBridge (RootBridgeHandle, Bridge); return EFI_SUCCESS; } Thanks, Ray From: Hsueh, Hong-Chih (Neo) mailto:hong-chih.hs...@amd.com>> Sent: Wednesday, May 1, 2024 2:24 To: Laszlo Ersek mailto:ler...@redhat.com>>; devel@edk2.groups.io<mailto:devel@edk2.groups.io> mailto:devel@edk2.groups.io>>; Ni, Ray mailto:ray...@intel.com>> Cc: Ding, Feng (Sunnyvale) mailto:feng1.d...@amd.com>>; He, Jiangang mailto:jiangang...@amd.com>>; Chang, Abner mailto:abner.ch...@amd.com>>; gaolim...@byosoft.com.cn<mailto:gaolim...@byosoft.com.cn> mailto:gaolim...@byosoft.com.cn>> Subject: Re: [PATCH v2] MdeModulePkg/PciBusDxe: plug device hierarchy leak upon bridge hot-unplug [AMD Official Use Only - General] Hi @ray...@intel.com<mailto:ray...@intel.com>, Sorry you bother you, may I have your feedback for this patch? If it looks good to you could you help to give me an R-b ? Thank you. Regards, Neo From: Laszlo Ersek mailto:ler...@redhat.com>> Sent: Sunday, February 25, 2024 7:59 AM To: Hsueh, Hong-Chih (Neo) mailto:hong-chih.hs...@amd.com>>; devel@edk2.groups.io<mailto:devel@edk2.groups.io> mailto:devel@edk2.groups.io>> Cc: Ding, Feng (Sunnyvale) mailto:feng1.d...@amd.com>>; He, Jiangang mailto:jiangang...@amd.com>>; Chang, Abner mailto:abner.ch...@amd.com>>; ray...@intel.com<mailto:ray...@intel.com> mailto:ray...@intel.com>>; gaolim...@byosoft.com.cn<mailto:gaolim...@byosoft.com.cn> mailto:gaolim...@byosoft.com.cn>> Subject: Re: [PATCH v2] MdeModulePkg/PciBusDxe: plug device hierarchy leak upon bridge hot-unplug Caution: This message originated from an External Source. Use proper caution when opening attachments, clicking links, or responding. On 2/22/24 17:28, Neo Hsueh wrote: > A USB4 or TBT bridge can be plugged or unplugged on USB4 port. The actions > require PciHotPlugRequestNotify to add a root bridge or remove a root bridge > completely. > In the plug-unplug-plug scenerio, PciHotPlugRequestNotify will return with > no-action on second plug because bridge tree shows configured. > Destroy Pci Device Tree in function PciHotPlugRequestNotify for unplug event > to fix this issue. > > Cc: Feng Ding mailto:feng1.d...@amd.com>> > Cc: Jiangang He mailto:jiangang...@amd.com>> > Signed-off-by: Neo Hsueh > mailto:hong-chih.hs...@amd.com>> > --- > MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumerator.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumerator.c > b/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumerator.c > index 3f8c6e6da7..2b7af60e0a 100644 > --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumerator.c > +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumerator.c > @@ -2103,6 +2103,8 @@ PciHotPlugRequestNotify ( >} > } > > +DestroyPciDeviceTree (Bridge); > + > // > // End for > // This looks convincing to me, but I don't now nearly enough about PciBusDxe internals (resource management in particular) to confidently approve this patch. I can give an Acked-by: Laszlo Ersek mailto:ler...@redhat.com>> but the patch should not be merged until Ray provides an R-b. Laszlo -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118981): https://edk2.groups.io/g/devel/message/118981 Mute This Topic: https://groups.io/mt/104511503/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH] XiangshanSeriesPkg:Add Support for Xilinx RC(PCIE) Driver
1. The patch is too big. Can you split it to multiple smaller patches? > +STATIC > +UINT64 > +PciSegmentLibGetConfigBase ( > + IN UINT64 Address > + ) > +{ > + UINT8 Bus; > + UINT8 Device; > + UINT8 Function; > + > + EXTRACT_PCIE_ADDRESS (Address, Bus, Device, Function); > + if ((Bus == 1) || (Bus == 2) || (Bus == 3) || (Bus == 4)) { > +return PCI_SEG_CONFIG_BASE; > + } > + > + return PCI_SEG_CONFIG_BASE; 1. Both paths return the same PCI_SEG_CONFIG_BASE. Then why do you check the Bus number? -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118913): https://edk2.groups.io/g/devel/message/118913 Mute This Topic: https://groups.io/mt/105572700/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH 10/18] UefiCpuPkg:Relocate AP to new safe buffer in PeiMpLib
Gerd, I agree that the logic might be duplicated in multi places. But even CPU supports 1G paging, caller can decide whether to use 1G paging or 2M paging, or 4K paging. Using a single API to encapsulate the entire logic may not seem flexible. Maybe, a lib API to detect 1G paging capability can be added to CpuLib. Thanks, Ray From: Gerd Hoffmann Sent: Monday, May 13, 2024 19:07 To: Tan, Dun Cc: devel@edk2.groups.io ; Ni, Ray ; Laszlo Ersek ; Kumar, Rahul R ; Wu, Jiaxin Subject: Re: [PATCH 10/18] UefiCpuPkg:Relocate AP to new safe buffer in PeiMpLib Hi, > + if (sizeof (UINTN) == sizeof (UINT64)) { > +// > +// Check Page5Level Support or not. > +// > +Cr4.UintN = AsmReadCr4 (); > +Page5LevelSupport = (Cr4.Bits.LA57 ? TRUE : FALSE); > + > +// > +// Check Page1G Support or not. > +// > +Page1GSupport = FALSE; > +AsmCpuid (CPUID_EXTENDED_FUNCTION, , NULL, NULL, NULL); > +if (RegEax >= CPUID_EXTENDED_CPU_SIG) { > + AsmCpuid (CPUID_EXTENDED_CPU_SIG, NULL, NULL, NULL, ); > + if (RegEdx.Bits.Page1GB != 0) { > +Page1GSupport = TRUE; > + } > +} > + > +// > +// Decide Paging Mode according Page5LevelSupport & Page1GSupport. > +// > +if (Page5LevelSupport) { > + PagingMode = Page1GSupport ? Paging5Level1GB : Paging5Level; > +} else { > + PagingMode = Page1GSupport ? Paging4Level1GB : Paging4Level; > +} > + } else { > +PagingMode = PagingPae; > + } I'm wondering whenever CpuPageTableLib should get a function for this? I suspect there a multiple places in edk2 which will need this functionality ... take care, Gerd -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118880): https://edk2.groups.io/g/devel/message/118880 Mute This Topic: https://groups.io/mt/106018135/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH 00/19] Remove some S3 related code in CpuS3.c of smm cpu driver
Good suggestions, Jiaxin! Thanks, Ray From: Tan, Dun Sent: Monday, May 13, 2024 11:37 To: Wu, Jiaxin ; devel@edk2.groups.io ; Ni, Ray Subject: RE: [edk2-devel] [PATCH 00/19] Remove some S3 related code in CpuS3.c of smm cpu driver Thanks for the comments. Agree that the order adjustment can make the patch set clearer. Will modify the commits in next version patch set. Thanks, Dun -Original Message- From: Wu, Jiaxin Sent: Monday, May 13, 2024 10:49 AM To: devel@edk2.groups.io; Tan, Dun ; Ni, Ray Subject: RE: [edk2-devel] [PATCH 00/19] Remove some S3 related code in CpuS3.c of smm cpu driver My comments as below: 1. I stronger recommend re-ordering the patches as below so as to combine all related sub-patches together, then we can more easy understand what we are target to resolving: 1) S3 MTRRs operation 2) AP page table unavailiable issue fix. 3) S3 ApHltLoopCode Operation 3) Register table cleanup 1) S3 MTRRs operation: > MdeModulePkg: Add gEdkiiS3MtrrSettingGuid > OvmfPkg: Save MTRR by lockbox in CpuS3DataDxe > UefiCpuPkg: Add locbox lib instance in DSC > UefiCpuPkg: Save MTRR by lockbox in CpuS3DataDxe > UefiCpuPkg: LoadMtrrData for all cpu in S3Resume > UefiCpuPkg: Remove code to load mtrr setting 2) AP page table unavailiable issue fix: > UefiCpuPkg: Disable PG in IA32 ApLoopCode 3) S3 ApHltLoopCode Operation: > UefiCpuPkg:Abstract some DxeMpLib code to function > UefiCpuPkg:Move some code in DxeMpLib to common place > UefiCpuPkg: Install gEdkiiEndOfS3ResumeGuid in S3Resume > UefiCpuPkg:Relocate AP to new safe buffer in PeiMpLib > UefiCpuPkg:Remove code to handle APIC setting and Interrupt > UefiCpuPkg:Rremove code to wakeup AP and relocate ap > UefiCpuPkg: Remove the duplicated mpservice locate > MdeModulePkg: remove MpService2Ppi field in SMM_S3_RESUME_STATE 4) Register table cleanup: > UefiCpuPkg:Set PcdCpuFeaturesInitOnS3Resume to TRUE > UefiCpuPkg: Remove code to set register table > UefiCpuPkg: Remove GetAcpiCpuData() in CpuS3.c 2. Update all intel copyright year. 3. Add all reviewer in the 00 patch. 4. Add PR in the 00 patch (if have). Thanks, Jiaxin > -Original Message- > From: devel@edk2.groups.io On Behalf Of duntan > Sent: Friday, May 10, 2024 6:08 PM > To: devel@edk2.groups.io > Subject: [edk2-devel] [PATCH 00/19] Remove some S3 related code in > CpuS3.c of smm cpu driver > > This patch set is to remove some S3 related code in CpuS3.c of smm cpu > driver. It contain commits to: > 1.Save MTRR setting by lockbox in PEI phase 2.Load MTRR in S3Resume.c > before transferring to CpuS3.c in smm cpu driver. > 3.Add callback of gEdkiiEndOfS3ResumeGuid in PeiMpLib to relocate Ap > to new safe buffer. > 4.Install gEdkiiEndOfS3ResumeGuid in S3Resume.c before booting OS to > relocate APs 4.Change PcdCpuFeaturesInitOnS3Resume to TRUE to set > register table in CpuFeaturesPei 5.Remove code to set register > table/load mtrr/wakeup AP and relocate ap in CpuS3.c. > > With this patch set, CpuS3.c in smm CPU driver can be simplified. > > Dun Tan (18): > MdeModulePkg: Add gEdkiiS3MtrrSettingGuid > OvmfPkg: Save MTRR by lockbox in CpuS3DataDxe > UefiCpuPkg: Add locbox lib instance in DSC > UefiCpuPkg: Save MTRR by lockbox in CpuS3DataDxe > UefiCpuPkg: LoadMtrrData for all cpu in S3Resume > UefiCpuPkg: Remove the duplicated mpservice locate > UefiCpuPkg: Install gEdkiiEndOfS3ResumeGuid in S3Resume > UefiCpuPkg:Abstract some DxeMpLib code to function > UefiCpuPkg:Move some code in DxeMpLib to common place > UefiCpuPkg:Relocate AP to new safe buffer in PeiMpLib > UefiCpuPkg: Disable PG in IA32 ApLoopCode > UefiCpuPkg: Remove code to load mtrr setting > UefiCpuPkg:Set PcdCpuFeaturesInitOnS3Resume to TRUE > UefiCpuPkg: Remove code to set register table > UefiCpuPkg:Remove code to handle APIC setting and Interrupt > UefiCpuPkg:Rremove code to wakeup AP and relocate ap > UefiCpuPkg: Remove GetAcpiCpuData() in CpuS3.c > MdeModulePkg: remove MpService2Ppi field in SMM_S3_RESUME_STATE > > Ray Ni (1): > MdePkg: Add MmUnblockMemoryLib to MdeLibs.dsc > > MdeModulePkg/Include/Guid/AcpiS3Context.h | 1 - > MdeModulePkg/MdeModulePkg.dec | 3 +++ > MdePkg/MdeLibs.dsc.inc | 3 ++- > OvmfPkg/CpuS3DataDxe/CpuS3Data.c| 11 +++ > OvmfPkg/CpuS3DataDxe/CpuS3DataDxe.inf | 2 ++ > UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c | 11 +++ > UefiCpuPkg/CpuS3DataDxe/CpuS3DataDxe.inf| 2 ++ > UefiCpuPkg/Library/MpInitLib/DxeMpLib.c | 181 > +++---
Re: [edk2-devel] [PATCH 18/18] MdeModulePkg:Remove MpService2Ppi field in SMM_S3_RESUME_STATE
My comment to patch #6 suggested to keep the assignment to SmmS3ResumeState->MpService2Ppi. How about you keep the "SmmS3ResumeState->MpService2Ppi = 0" there and remove that assignment and the field together in this patch? Thanks, Ray From: Tan, Dun Sent: Friday, May 10, 2024 18:08 To: devel@edk2.groups.io Cc: Ni, Ray ; Wang, Jian J ; Liming Gao Subject: [PATCH 18/18] MdeModulePkg:Remove MpService2Ppi field in SMM_S3_RESUME_STATE This MpService2Ppi field in SMM_S3_RESUME_STATE is used to wakeup AP to do the CPU initialization during smm s3 boot when the execution mode of PEI and DXE are the same. Currently, in CpuS3.c of smm cpu driver, BSP doesn't need to wakeup AP anymore. The initialization for AP will be done in S3Resume.c before transfer to CpuS3.c of smm cpu driver. So we can remove the MpService2Ppi field in SMM_S3_RESUME_STATE. Signed-off-by: Dun Tan Cc: Ray Ni Cc: Jian J Wang Cc: Liming Gao --- MdeModulePkg/Include/Guid/AcpiS3Context.h | 1 - 1 file changed, 1 deletion(-) diff --git a/MdeModulePkg/Include/Guid/AcpiS3Context.h b/MdeModulePkg/Include/Guid/AcpiS3Context.h index 72d173c4fd..0cfc81b49b 100644 --- a/MdeModulePkg/Include/Guid/AcpiS3Context.h +++ b/MdeModulePkg/Include/Guid/AcpiS3Context.h @@ -30,7 +30,6 @@ typedef struct { EFI_PHYSICAL_ADDRESSReturnContext1; EFI_PHYSICAL_ADDRESSReturnContext2; EFI_PHYSICAL_ADDRESSReturnStackPointer; - EFI_PHYSICAL_ADDRESSMpService2Ppi; EFI_PHYSICAL_ADDRESSSmst; } SMM_S3_RESUME_STATE; -- 2.31.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118849): https://edk2.groups.io/g/devel/message/118849 Mute This Topic: https://groups.io/mt/106018145/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH 17/18] UefiCpuPkg: Remove GetAcpiCpuData() in CpuS3.c
Reviewed-by: Ray Ni Thanks, Ray From: Tan, Dun Sent: Friday, May 10, 2024 18:08 To: devel@edk2.groups.io Cc: Ni, Ray ; Laszlo Ersek ; Kumar, Rahul R ; Gerd Hoffmann ; Wu, Jiaxin Subject: [PATCH 17/18] UefiCpuPkg: Remove GetAcpiCpuData() in CpuS3.c Remove GetAcpiCpuData() in CpuS3.c. The mAcpiCpuData is not needed in S3 boot anymore. Signed-off-by: Dun Tan Cc: Ray Ni Cc: Laszlo Ersek Cc: Rahul Kumar Cc: Gerd Hoffmann Cc: Jiaxin Wu --- UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c | 243 +-- UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c | 6 ++ UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h | 24 3 files changed, 3 insertions(+), 270 deletions(-) diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c b/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c index e84bc14de0..78ecf4efc6 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c @@ -9,22 +9,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include "PiSmmCpuDxeSmm.h" #include -// -// Flags used when program the register. -// -typedef struct { - volatile UINTN MemoryMappedLock; // Spinlock used to program mmio - volatile UINT32*CoreSemaphoreCount; // Semaphore container used to program -// core level semaphore. - volatile UINT32*PackageSemaphoreCount;// Semaphore container used to program -// package level semaphore. -} PROGRAM_CPU_REGISTER_FLAGS; - -#define LEGACY_REGION_SIZE (2 * 0x1000) -#define LEGACY_REGION_BASE (0xA - LEGACY_REGION_SIZE) - -ACPI_CPU_DATA mAcpiCpuData; -BOOLEANmRestoreSmmConfigurationInS3 = FALSE; +BOOLEAN mRestoreSmmConfigurationInS3 = FALSE; // // S3 boot flag @@ -266,232 +251,6 @@ InitSmmS3ResumeState ( } } -/** - Copy register table from non-SMRAM into SMRAM. - - @param[in] DestinationRegisterTableList Points to destination register table. - @param[in] SourceRegisterTableList Points to source register table. - @param[in] NumberOfCpus Number of CPUs. - -**/ -VOID -CopyRegisterTable ( - IN CPU_REGISTER_TABLE *DestinationRegisterTableList, - IN CPU_REGISTER_TABLE *SourceRegisterTableList, - IN UINT32 NumberOfCpus - ) -{ - UINTN Index; - CPU_REGISTER_TABLE_ENTRY *RegisterTableEntry; - - CopyMem (DestinationRegisterTableList, SourceRegisterTableList, NumberOfCpus * sizeof (CPU_REGISTER_TABLE)); - for (Index = 0; Index < NumberOfCpus; Index++) { -if (DestinationRegisterTableList[Index].TableLength != 0) { - DestinationRegisterTableList[Index].AllocatedSize = DestinationRegisterTableList[Index].TableLength * sizeof (CPU_REGISTER_TABLE_ENTRY); - RegisterTableEntry= AllocateCopyPool ( - DestinationRegisterTableList[Index].AllocatedSize, -(VOID *)(UINTN)SourceRegisterTableList[Index].RegisterTableEntry -); - ASSERT (RegisterTableEntry != NULL); - DestinationRegisterTableList[Index].RegisterTableEntry = (EFI_PHYSICAL_ADDRESS)(UINTN)RegisterTableEntry; -} - } -} - -/** - Check whether the register table is empty or not. - - @param[in] RegisterTable Point to the register table. - @param[in] NumberOfCpus Number of CPUs. - - @retval TRUE The register table is empty. - @retval FALSE The register table is not empty. -**/ -BOOLEAN -IsRegisterTableEmpty ( - IN CPU_REGISTER_TABLE *RegisterTable, - IN UINT32 NumberOfCpus - ) -{ - UINTN Index; - - if (RegisterTable != NULL) { -for (Index = 0; Index < NumberOfCpus; Index++) { - if (RegisterTable[Index].TableLength != 0) { -return FALSE; - } -} - } - - return TRUE; -} - -/** - Copy the data used to initialize processor register into SMRAM. - - @param[in,out] CpuFeatureInitDataDst Pointer to the destination CPU_FEATURE_INIT_DATA structure. - @param[in] CpuFeatureInitDataSrc Pointer to the source CPU_FEATURE_INIT_DATA structure. - -**/ -VOID -CopyCpuFeatureInitDatatoSmram ( - IN OUT CPU_FEATURE_INIT_DATA *CpuFeatureInitDataDst, - IN CPU_FEATURE_INIT_DATA *CpuFeatureInitDataSrc - ) -{ - CPU_STATUS_INFORMATION *CpuStatus; - - if (!IsRegisterTableEmpty ((CPU_REGISTER_TABLE *)(UINTN)CpuFeatureInitDataSrc->PreSmmInitRegisterTable, mAcpiCpuData.NumberOfCpus)) { -CpuFeatureInitDataDst->PreSmmInitRegisterTable = (EFI_PHYSICAL_ADDRESS)(UINTN)AllocatePool (mAcpiCpuData
Re: [edk2-devel] [PATCH 16/18] UefiCpuPkg:Remove code to wakeup AP and relocate ap
Reviewed-by: Ray Ni Thanks, Ray From: Tan, Dun Sent: Friday, May 10, 2024 18:08 To: devel@edk2.groups.io Cc: Ni, Ray ; Laszlo Ersek ; Kumar, Rahul R ; Gerd Hoffmann ; Wu, Jiaxin Subject: [PATCH 16/18] UefiCpuPkg:Remove code to wakeup AP and relocate ap After the code to load mtrr setting, set register table, handle APIC setting and Interrupt after INIT-SIPI-SIPI is moved, the InitializeCpuProcedure() only contains following code logic: 1.Bsp runs ExecuteFirstSmiInit(). 2.Bsp transfers AP to safe hlt-loop During S3 boot, since APs will be relocated to new safe buffer by the callback of gEdkiiEndOfS3ResumeGuid in PeiMpLib, Bsp doesn't need to transfer AP to safe hlt-loop any more. SmmRestoreCpu() in CpuS3 only needs to runs the ExecuteFirstSmiInit() on BSP. So remove code to wakeup AP by INIT-SIPI-SIPI and remove code to relocate ap to safe hlt-loop. Signed-off-by: Dun Tan Cc: Ray Ni Cc: Laszlo Ersek Cc: Rahul Kumar Cc: Gerd Hoffmann Cc: Jiaxin Wu --- UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c | 292 +--- UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/MpFuncs.nasm | 153 - UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmmFuncsArch.c | 27 --- UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf | 3 --- UefiCpuPkg/PiSmmCpuDxeSmm/X64/MpFuncs.nasm| 189 - UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmFuncsArch.c | 28 6 files changed, 9 insertions(+), 683 deletions(-) diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c b/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c index 65fe903fd3..e84bc14de0 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c @@ -8,30 +8,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include "PiSmmCpuDxeSmm.h" #include -#include - -#pragma pack(1) -typedef struct { - UINTN Lock; - VOID *StackStart; - UINTN StackSize; - VOID *ApFunction; - IA32_DESCRIPTORGdtrProfile; - IA32_DESCRIPTORIdtrProfile; - UINT32 BufferStart; - UINT32 Cr3; - UINTN InitializeFloatingPointUnitsAddress; -} MP_CPU_EXCHANGE_INFO; -#pragma pack() - -typedef struct { - UINT8*RendezvousFunnelAddress; - UINTNPModeEntryOffset; - UINTNFlatJumpOffset; - UINTNSize; - UINTNLModeEntryOffset; - UINTNLongJumpOffset; -} MP_ASSEMBLY_ADDRESS_MAP; // // Flags used when program the register. @@ -44,31 +20,11 @@ typedef struct { // package level semaphore. } PROGRAM_CPU_REGISTER_FLAGS; -// -// Signal that SMM BASE relocation is complete. -// -volatile BOOLEAN mInitApsAfterSmmBaseReloc; - -/** - Get starting address and size of the rendezvous entry for APs. - Information for fixing a jump instruction in the code is also returned. - - @param AddressMap Output buffer for address map information. -**/ -VOID * -EFIAPI -AsmGetAddressMap ( - MP_ASSEMBLY_ADDRESS_MAP *AddressMap - ); - #define LEGACY_REGION_SIZE (2 * 0x1000) #define LEGACY_REGION_BASE (0xA - LEGACY_REGION_SIZE) -PROGRAM_CPU_REGISTER_FLAGS mCpuFlags; -ACPI_CPU_DATA mAcpiCpuData; -volatile UINT32 mNumberToFinish; -MP_CPU_EXCHANGE_INFO*mExchangeInfo; -BOOLEAN mRestoreSmmConfigurationInS3 = FALSE; +ACPI_CPU_DATA mAcpiCpuData; +BOOLEANmRestoreSmmConfigurationInS3 = FALSE; // // S3 boot flag @@ -82,191 +38,6 @@ SMM_S3_RESUME_STATE *mSmmS3ResumeState = NULL; BOOLEAN mAcpiS3Enable = TRUE; -UINT8 *mApHltLoopCode = NULL; -UINT8 mApHltLoopCodeTemplate[] = { - 0x8B, 0x44, 0x24, 0x04, // mov eax, dword ptr [esp+4] - 0xF0, 0xFF, 0x08, // lock dec dword ptr [eax] - 0xFA, // cli - 0xF4, // hlt - 0xEB, 0xFC // jmp $-2 -}; - -/** - The function is invoked before SMBASE relocation in S3 path to restores CPU status. - - The function is invoked before SMBASE relocation in S3 path. It does first time microcode load - and restores MTRRs for both BSP and APs. - - @param IsBsp The CPU this function executes on is BSP or not. - -**/ -VOID -InitializeCpuBeforeRebase ( - IN BOOLEAN IsBsp - ) -{ - // - // Count down the number with lock mechanism. - // - InterlockedDecrement (); - - if (IsBsp) { -// -// Bsp
Re: [edk2-devel] [PATCH 15/18] UefiCpuPkg:Remove code to handle APIC setting and Interrupt
Reviewed-by: Ray Ni Thanks, Ray From: Tan, Dun Sent: Friday, May 10, 2024 18:08 To: devel@edk2.groups.io Cc: Ni, Ray ; Laszlo Ersek ; Kumar, Rahul R ; Gerd Hoffmann ; Wu, Jiaxin Subject: [PATCH 15/18] UefiCpuPkg:Remove code to handle APIC setting and Interrupt Remove ProgramVirtualWireMode()/DisableLvtInterrupts() since APs won't be waken by INIT-SIPI-SIPI in CpuS3.c any more. The two functions has been executed in MpInitLibInitialize() in PeiMplib. Signed-off-by: Dun Tan Cc: Ray Ni Cc: Laszlo Ersek Cc: Rahul Kumar Cc: Gerd Hoffmann Cc: Jiaxin Wu --- UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c | 5 - 1 file changed, 5 deletions(-) diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c b/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c index 9520451d92..65fe903fd3 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c @@ -105,11 +105,6 @@ InitializeCpuBeforeRebase ( IN BOOLEAN IsBsp ) { - ProgramVirtualWireMode (); - if (!IsBsp) { -DisableLvtInterrupts (); - } - // // Count down the number with lock mechanism. // -- 2.31.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118846): https://edk2.groups.io/g/devel/message/118846 Mute This Topic: https://groups.io/mt/106018141/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH 14/18] UefiCpuPkg: Remove code to set register table
Reviewed-by: Ray Ni Thanks, Ray From: Tan, Dun Sent: Friday, May 10, 2024 18:08 To: devel@edk2.groups.io Cc: Ni, Ray ; Laszlo Ersek ; Kumar, Rahul R ; Gerd Hoffmann ; Wu, Jiaxin Subject: [PATCH 14/18] UefiCpuPkg: Remove code to set register table Remove code to set register table in CpuS3.c. In previous commit, PcdCpuFeaturesInitOnS3Resume has been set to TRUE. So that CpuFeaturesPei PEIM will initialize the CPU registers and perform CPU features initialization. Signed-off-by: Dun Tan Cc: Ray Ni Cc: Laszlo Ersek Cc: Rahul Kumar Cc: Gerd Hoffmann Cc: Jiaxin Wu --- UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c | 423 --- 1 file changed, 423 deletions(-) diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c b/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c index 7ac6b62676..9520451d92 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c @@ -91,425 +91,6 @@ UINT8 mApHltLoopCodeTemplate[] = { 0xEB, 0xFC // jmp $-2 }; -/** - Increment semaphore by 1. - - @param SemIN: 32-bit unsigned integer - -**/ -VOID -S3ReleaseSemaphore ( - IN OUT volatile UINT32 *Sem - ) -{ - InterlockedIncrement (Sem); -} - -/** - Decrement the semaphore by 1 if it is not zero. - - Performs an atomic decrement operation for semaphore. - The compare exchange operation must be performed using - MP safe mechanisms. - - @param SemIN: 32-bit unsigned integer - -**/ -VOID -S3WaitForSemaphore ( - IN OUT volatile UINT32 *Sem - ) -{ - UINT32 Value; - - do { -Value = *Sem; - } while (Value == 0 || - InterlockedCompareExchange32 ( - Sem, - Value, - Value - 1 - ) != Value); -} - -/** - Read / write CR value. - - @param[in] CrIndex The CR index which need to read/write. - @param[in] ReadRead or write. TRUE is read. - @param[in,out] CrValue CR value. - - @retvalEFI_SUCCESS means read/write success, else return EFI_UNSUPPORTED. -**/ -UINTN -ReadWriteCr ( - IN UINT32 CrIndex, - IN BOOLEAN Read, - IN OUT UINTN*CrValue - ) -{ - switch (CrIndex) { -case 0: - if (Read) { -*CrValue = AsmReadCr0 (); - } else { -AsmWriteCr0 (*CrValue); - } - - break; -case 2: - if (Read) { -*CrValue = AsmReadCr2 (); - } else { -AsmWriteCr2 (*CrValue); - } - - break; -case 3: - if (Read) { -*CrValue = AsmReadCr3 (); - } else { -AsmWriteCr3 (*CrValue); - } - - break; -case 4: - if (Read) { -*CrValue = AsmReadCr4 (); - } else { -AsmWriteCr4 (*CrValue); - } - - break; -default: - return EFI_UNSUPPORTED; - } - - return EFI_SUCCESS; -} - -/** - Initialize the CPU registers from a register table. - - @param[in] RegisterTable The register table for this AP. - @param[in] ApLocationAP location info for this ap. - @param[in] CpuStatus CPU status info for this CPU. - @param[in] CpuFlags Flags data structure used when program the register. - - @note This service could be called by BSP/APs. -**/ -VOID -ProgramProcessorRegister ( - IN CPU_REGISTER_TABLE *RegisterTable, - IN EFI_CPU_PHYSICAL_LOCATION *ApLocation, - IN CPU_STATUS_INFORMATION *CpuStatus, - IN PROGRAM_CPU_REGISTER_FLAGS *CpuFlags - ) -{ - CPU_REGISTER_TABLE_ENTRY *RegisterTableEntry; - UINTN Index; - UINTN Value; - CPU_REGISTER_TABLE_ENTRY *RegisterTableEntryHead; - volatile UINT32 *SemaphorePtr; - UINT32FirstThread; - UINT32CurrentThread; - UINT32CurrentCore; - UINTN ProcessorIndex; - UINT32*ThreadCountPerPackage; - UINT8 *ThreadCountPerCore; - EFI_STATUSStatus; - UINT64CurrentValue; - - // - // Traverse Register Table of this logical processor - // - RegisterTableEntryHead = (CPU_REGISTER_TABLE_ENTRY *)(UINTN)RegisterTable->RegisterTableEntry; - - for (Index = 0; Index < RegisterTable->TableLength; Index++) { -RegisterTableEntry = [Index]; - -// -// Check the type of specified register -// -switch (RegisterTableEntry->RegisterType) { - // - // The specified register is Control Register - // - case ControlRegister: -Status =
Re: [edk2-devel] [PATCH 13/18] UefiCpuPkg:Set PcdCpuFeaturesInitOnS3Resume to TRUE
Reviewed-by: Ray Ni Thanks, Ray From: Tan, Dun Sent: Friday, May 10, 2024 18:08 To: devel@edk2.groups.io Cc: Ni, Ray ; Laszlo Ersek ; Kumar, Rahul R ; Gerd Hoffmann ; Wu, Jiaxin Subject: [PATCH 13/18] UefiCpuPkg:Set PcdCpuFeaturesInitOnS3Resume to TRUE Set PcdCpuFeaturesInitOnS3Resume to TRUE. So that CpuFeaturesPei PEIM will initialize the CPU registers and perform CPU features initialization. Signed-off-by: Dun Tan Cc: Ray Ni Cc: Laszlo Ersek Cc: Rahul Kumar Cc: Gerd Hoffmann Cc: Jiaxin Wu --- UefiCpuPkg/UefiCpuPkg.dec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UefiCpuPkg/UefiCpuPkg.dec b/UefiCpuPkg/UefiCpuPkg.dec index f86a6d2bcb..45384d725c 100644 --- a/UefiCpuPkg/UefiCpuPkg.dec +++ b/UefiCpuPkg/UefiCpuPkg.dec @@ -310,7 +310,7 @@ ## Specifies if CPU features will be initialized during S3 resume. # @Prompt If CPU features will be initialized during S3 resume. - gUefiCpuPkgTokenSpaceGuid.PcdCpuFeaturesInitOnS3Resume|FALSE|BOOLEAN|0x001D + gUefiCpuPkgTokenSpaceGuid.PcdCpuFeaturesInitOnS3Resume|TRUE|BOOLEAN|0x001D ## Specifies CPUID Leaf 0x15 Time Stamp Counter and Nominal Core Crystal Clock Frequency. # TSC Frequency = ECX (core crystal clock frequency) * EBX/EAX. -- 2.31.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118844): https://edk2.groups.io/g/devel/message/118844 Mute This Topic: https://groups.io/mt/106018138/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH 12/18] UefiCpuPkg: Remove code to load mtrr setting
Reviewed-by: Ray Ni Thanks, Ray From: Tan, Dun Sent: Friday, May 10, 2024 18:08 To: devel@edk2.groups.io Cc: Ni, Ray ; Laszlo Ersek ; Kumar, Rahul R ; Gerd Hoffmann ; Wu, Jiaxin Subject: [PATCH 12/18] UefiCpuPkg: Remove code to load mtrr setting Remove code to load mtrr setting in CpuS3.c. In previous commits, before transferring to CpuS3.c, MTRR setting has been loaded in S3RestoreConfig2() for all CPU. Signed-off-by: Dun Tan Cc: Ray Ni Cc: Laszlo Ersek Cc: Rahul Kumar Cc: Gerd Hoffmann Cc: Jiaxin Wu --- UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c | 32 1 file changed, 32 deletions(-) diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c b/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c index d67fb49890..7ac6b62676 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c @@ -91,36 +91,6 @@ UINT8 mApHltLoopCodeTemplate[] = { 0xEB, 0xFC // jmp $-2 }; -/** - Sync up the MTRR values for all processors. - - @param MtrrTable Table holding fixed/variable MTRR values to be loaded. -**/ -VOID -EFIAPI -LoadMtrrData ( - EFI_PHYSICAL_ADDRESS MtrrTable - ) - -/*++ - -Routine Description: - - Sync up the MTRR values for all processors. - -Arguments: - -Returns: -None - ---*/ -{ - MTRR_SETTINGS *MtrrSettings; - - MtrrSettings = (MTRR_SETTINGS *)(UINTN)MtrrTable; - MtrrSetAllMtrrs (MtrrSettings); -} - /** Increment semaphore by 1. @@ -554,8 +524,6 @@ InitializeCpuBeforeRebase ( IN BOOLEAN IsBsp ) { - LoadMtrrData (mAcpiCpuData.MtrrTable); - SetRegister (TRUE); ProgramVirtualWireMode (); -- 2.31.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118843): https://edk2.groups.io/g/devel/message/118843 Mute This Topic: https://groups.io/mt/106018137/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH 11/18] UefiCpuPkg: Disable PG in IA32 ApLoopCode
Reviewed-by: Ray Ni Thanks, Ray From: Tan, Dun Sent: Friday, May 10, 2024 18:08 To: devel@edk2.groups.io Cc: Ni, Ray ; Laszlo Ersek ; Kumar, Rahul R ; Gerd Hoffmann ; Wu, Jiaxin Subject: [PATCH 11/18] UefiCpuPkg: Disable PG in IA32 ApLoopCode Disable paging in IA32 RelocateApLoop assembly code to fix the issue that the AP page table is unavailiable after boot OS under IA32 execution mode. This issue exist in IA32 PEI + IA32 DXE normal boot (also S3 boot with IA32 PEI after previous three commits are accepted). In current MpLib code, the IA32 execution mode code did not create page table in reserved memory like what X64 code did. If PcdCpuStackGuard is TRUE, the PG is enabled for AP in current RelocateApLoop assembly code. And the page table for AP is unavailiable after boot OS. This might cause potential issue. So disable PG in IA32 RelocateApLoop. Signed-off-by: Dun Tan Cc: Ray Ni Cc: Laszlo Ersek Cc: Rahul Kumar Cc: Gerd Hoffmann Cc: Jiaxin Wu --- UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm | 4 1 file changed, 4 insertions(+) diff --git a/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm b/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm index d117f09ef5..75b18ce56f 100644 --- a/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm +++ b/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm @@ -225,6 +225,10 @@ RendezvousFunnelProcEnd: ; specific to SEV-ES support and are not applicable on IA32. ;- AsmRelocateApLoopGenericStart: +moveax, cr0 +btreax, 31 ; Clear CR0.PG +movcr0, eax; Disable paging since the page table might be unavailiable + moveax, esp movesp, [eax + 12] ; TopOfApStack push dword [eax] ; push return address for stack trace -- 2.31.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118842): https://edk2.groups.io/g/devel/message/118842 Mute This Topic: https://groups.io/mt/106018136/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH 10/18] UefiCpuPkg:Relocate AP to new safe buffer in PeiMpLib
Reviewed-by: Ray Ni Thanks, Ray From: Tan, Dun Sent: Friday, May 10, 2024 18:08 To: devel@edk2.groups.io Cc: Ni, Ray ; Laszlo Ersek ; Kumar, Rahul R ; Gerd Hoffmann ; Wu, Jiaxin Subject: [PATCH 10/18] UefiCpuPkg:Relocate AP to new safe buffer in PeiMpLib In this commit, change PeiMpLib to install callback of gEdkiiEndOfS3ResumeGuid to relocate AP to new safe buffer. The gEdkiiEndOfS3ResumeGuid is installed in S3Resume.c before jmping to OS waking vector. Previously, code in CpuS3.c of PiSmmCpuDxe driver will prepare the new safe buffer for AP and place AP in hlt loop state. With this code change, we can remove the Machine Instructions of mApHltLoopCode in PiSmmCpuDxe. Also we can reuse the related code in DxeMpLib for PeiMpLib. Signed-off-by: Dun Tan Cc: Ray Ni Cc: Laszlo Ersek Cc: Rahul Kumar Cc: Gerd Hoffmann Cc: Jiaxin Wu --- UefiCpuPkg/Library/MpInitLib/MpLib.h | 3 +++ UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf | 4 UefiCpuPkg/Library/MpInitLib/PeiMpLib.c | 152 3 files changed, 159 insertions(+) diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.h b/UefiCpuPkg/Library/MpInitLib/MpLib.h index 11e0d2661f..3efd913395 100644 --- a/UefiCpuPkg/Library/MpInitLib/MpLib.h +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.h @@ -33,6 +33,7 @@ #include #include #include +#include #include #include @@ -68,6 +69,8 @@ // #define DEFAULT_MAX_MICROCODE_PATCH_NUM 8 +#define PAGING_4K_ADDRESS_MASK_64 0x000FF000ull + // // Data structure for microcode patch information // diff --git a/UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf b/UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf index e31e34b6f9..8736690348 100644 --- a/UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf +++ b/UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf @@ -25,10 +25,12 @@ [Sources.IA32] Ia32/AmdSev.c Ia32/MpFuncs.nasm + Ia32/CreatePageTable.c [Sources.X64] X64/AmdSev.c X64/MpFuncs.nasm + X64/CreatePageTable.c [Sources.IA32, Sources.X64] AmdSev.c @@ -64,6 +66,7 @@ LocalApicLib MicrocodeLib MtrrLib + CpuPageTableLib [Pcd] gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbBase ## CONSUMES @@ -87,6 +90,7 @@ gEdkiiS3SmmInitDoneGuid gEdkiiMicrocodePatchHobGuid gGhcbApicIdsGuid ## SOMETIMES_CONSUMES + gEdkiiEndOfS3ResumeGuid [Guids.LoongArch64] gProcessorResourceHobGuid ## SOMETIMES_CONSUMES ## HOB diff --git a/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c b/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c index 4d3acb491f..deb5fc3aac 100644 --- a/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c +++ b/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c @@ -9,6 +9,7 @@ #include "MpLib.h" #include #include +#include #include STATIC UINT64 mSevEsPeiWakeupBuffer = BASE_1MB; @@ -449,6 +450,47 @@ BuildMicrocodeCacheHob ( return; } +/** + S3 SMM Init Done notification function. + + @param PeiServices Indirect reference to the PEI Services Table. + @param NotifyDesc Address of the notification descriptor data structure. + @param InvokePpiAddress of the PPI that was invoked. + + @retval EFI_SUCCESS The function completes successfully. + +**/ +EFI_STATUS +EFIAPI +NotifyOnEndOfS3Resume ( + IN EFI_PEI_SERVICES **PeiServices, + IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDesc, + IN VOID *InvokePpi + ) +{ + CPU_MP_DATA *CpuMpData; + + CpuMpData = GetCpuMpData (); + mNumberToFinish = CpuMpData->CpuCount - 1; + WakeUpAP (CpuMpData, TRUE, 0, RelocateApLoop, NULL, TRUE); + while (mNumberToFinish > 0) { +CpuPause (); + } + + DEBUG ((DEBUG_INFO, "%a() done!\n", __func__)); + + return EFI_SUCCESS; +} + +// +// Global function +// +EFI_PEI_NOTIFY_DESCRIPTOR mEndOfS3ResumeNotifyDesc = { + EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST, + , + NotifyOnEndOfS3Resume +}; + /** Initialize global data for MP support. @@ -463,12 +505,16 @@ InitMpGlobalData ( BuildMicrocodeCacheHob (CpuMpData); SaveCpuMpData (CpuMpData); + PrepareApLoopCode (CpuMpData); /// /// Install Notify /// Status = PeiServicesNotifyPpi (); ASSERT_EFI_ERROR (Status); + + Status = PeiServicesNotifyPpi (); + ASSERT_EFI_ERROR (Status); } /** @@ -815,3 +861,109 @@ PlatformShadowMicrocode ( return EFI_SUCCESS; } + +/** + Allocate buffer for ApLoopCode. + + @param[in] PagesNumber of pages to allocate. + @param[in, out] Address Pointer to the allocated buffer. +**/ +VOID +AllocateApLoopCodeBuffer ( + IN UINTN Pages, + IN OUT EFI_PHYSICAL_ADDRESS *Address + ) +{ + EFI_STATUS Status; + + Status = PeiServicesAllocatePages (EfiACPIMemoryNVS, Pages, Address); + if (EFI_ERROR (St
Re: [edk2-devel] [PATCH 09/18] UefiCpuPkg:Move some code in DxeMpLib to common place
diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.h b/UefiCpuPkg/Library/MpInitLib/MpLib.h index 179f8e585b..11e0d2661f 100644 --- a/UefiCpuPkg/Library/MpInitLib/MpLib.h +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.h @@ -357,7 +357,8 @@ typedef IN UINTNStackStart ); -extern EFI_GUID mCpuInitMpLibHobGuid; +extern EFI_GUID mCpuInitMpLibHobGuid; +extern volatile UINT32 mNumberToFinish; [Ray] It's very good that you keep other global variables in MpLib.c only. Reviewed-by: Ray Ni -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118840): https://edk2.groups.io/g/devel/message/118840 Mute This Topic: https://groups.io/mt/106018133/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH 08/18] UefiCpuPkg:Abstract some DxeMpLib code to function
Reviewed-by: Ray Ni Thanks, Ray From: Tan, Dun Sent: Friday, May 10, 2024 18:08 To: devel@edk2.groups.io Cc: Ni, Ray ; Laszlo Ersek ; Kumar, Rahul R ; Gerd Hoffmann ; Wu, Jiaxin Subject: [PATCH 08/18] UefiCpuPkg:Abstract some DxeMpLib code to function Abstract some DxeMpLib code to function in this commit. Some of these internal functions will be moved to common MpLib.c in following commits. Then PeiMpLib can reuse the code. Signed-off-by: Dun Tan Cc: Ray Ni Cc: Laszlo Ersek Cc: Rahul Kumar Cc: Gerd Hoffmann Cc: Jiaxin Wu --- UefiCpuPkg/Library/MpInitLib/DxeMpLib.c | 220 +++- 1 file changed, 139 insertions(+), 81 deletions(-) diff --git a/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c b/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c index 57ddb86600..d13cebbee6 100644 --- a/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c +++ b/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c @@ -422,6 +422,144 @@ RelocateApLoop ( ASSERT (FALSE); } +/** + Allocate buffer for ApLoopCode. + + @param[in] PagesNumber of pages to allocate. + @param[in, out] Address Pointer to the allocated buffer. +**/ +VOID +AllocateApLoopCodeBuffer ( + IN UINTN Pages, + IN OUT EFI_PHYSICAL_ADDRESS *Address + ) +{ + EFI_STATUS Status; + + Status = gBS->AllocatePages ( + AllocateMaxAddress, + EfiReservedMemoryType, + Pages, + Address + ); + ASSERT_EFI_ERROR (Status); +} + +/** + Remove Nx protection for the range specific by BaseAddress and Length. + + The PEI implementation uses CpuPageTableLib to change the attribute. + The DXE implementation uses gDS to change the attribute. + + @param[in] BaseAddress BaseAddress of the range. + @param[in] Length Length of the range. +**/ +VOID +RemoveNxprotection ( + IN EFI_PHYSICAL_ADDRESS BaseAddress, + IN UINTN Length + ) +{ + EFI_STATUS Status; + EFI_GCD_MEMORY_SPACE_DESCRIPTOR MemDesc; + + // + // TODO: Check EFI_MEMORY_XP bit set or not once it's available in DXE GCD + // service. + // + Status = gDS->GetMemorySpaceDescriptor (BaseAddress, ); + if (!EFI_ERROR (Status)) { +gDS->SetMemorySpaceAttributes ( + BaseAddress, + Length, + MemDesc.Attributes & (~EFI_MEMORY_XP) + ); + } +} + +/** + Prepare ApLoopCode. + + @param[in] CpuMpData Pointer to CpuMpData. +**/ +VOID +PrepareApLoopCode ( + IN CPU_MP_DATA *CpuMpData + ) +{ + EFI_PHYSICAL_ADDRESS Address; + MP_ASSEMBLY_ADDRESS_MAP *AddressMap; + UINT8*ApLoopFunc; + UINTNApLoopFuncSize; + UINTNStackPages; + UINTNFuncPages; + IA32_CR0 Cr0; + + AddressMap = >AddressMap; + if (CpuMpData->UseSevEsAPMethod) { +// +// 64-bit AMD processors with SEV-ES +// +Address= BASE_4GB - 1; +ApLoopFunc = AddressMap->RelocateApLoopFuncAddressAmdSev; +ApLoopFuncSize = AddressMap->RelocateApLoopFuncSizeAmdSev; + } else { +// +// Intel processors (32-bit or 64-bit), 32-bit AMD processors, or 64-bit AMD processors without SEV-ES +// +Address= MAX_ADDRESS; +ApLoopFunc = AddressMap->RelocateApLoopFuncAddressGeneric; +ApLoopFuncSize = AddressMap->RelocateApLoopFuncSizeGeneric; + } + + // + // Avoid APs access invalid buffer data which allocated by BootServices, + // so we will allocate reserved data for AP loop code. We also need to + // allocate this buffer below 4GB due to APs may be transferred to 32bit + // protected mode on long mode DXE. + // Allocating it in advance since memory services are not available in + // Exit Boot Services callback function. + // + // ++ (TopOfApStack) + // | Stack * N | + // ++ (stack base, 4k aligned) + // | Padding | + // ++ + // | Ap Loop | + // ++ ((low address, 4k-aligned) + // + + StackPages = EFI_SIZE_TO_PAGES (CpuMpData->CpuCount * AP_SAFE_STACK_SIZE); + FuncPages = EFI_SIZE_TO_PAGES (ApLoopFuncSize); + + AllocateApLoopCodeBuffer (StackPages + FuncPages, ); + ASSERT (Address != 0); + + Cr0.UintN = AsmReadCr0 (); + if (Cr0.Bits.PG != 0) { +// +// Make sure that the buffer memory is executable if NX protection is enabled +// for EfiReservedMemoryType. +// +RemoveNxprotection (Address, EFI_PAGES_TO_SIZE (FuncPages)); + } + + mReservedTopOfApStack = (UINTN)Address + EFI_PAGES_TO_SIZE (StackPages+FuncPages); + ASSERT ((mReservedTopOfApStack & (UINTN)(CPU_STACK_ALIGNMENT - 1)) == 0); + mReservedApLoop.Data = (VOID *)(UINTN)Address; + ASSERT (mRe
Re: [edk2-devel] [PATCH 05/18] UefiCpuPkg: LoadMtrrData for all cpu in S3Resume
Reviewed-by: Ray Ni Thanks, Ray From: Tan, Dun Sent: Friday, May 10, 2024 18:08 To: devel@edk2.groups.io Cc: Ni, Ray ; Kumar, Rahul R ; Gerd Hoffmann ; Wu, Jiaxin Subject: [PATCH 05/18] UefiCpuPkg: LoadMtrrData for all cpu in S3Resume In this commit, S3Resume.c wakeup all Aps to run LoadMtrrData for all cpu before transfer to CpuS3.c in smm cpu driver. The MtrrSetting table can be restored by gEdkiiS3MtrrSettingGuid which is saved by lockbox in PEI phase. This can avoid waking up APs in CpuS3.c. Signed-off-by: Dun Tan Cc: Ray Ni Cc: Rahul Kumar Cc: Gerd Hoffmann Cc: Jiaxin Wu --- UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume.c | 49 + UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume2Pei.inf | 2 ++ 2 files changed, 51 insertions(+) diff --git a/UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume.c b/UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume.c index 4cf676fb3e..3e85eab28f 100644 --- a/UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume.c +++ b/UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume.c @@ -39,6 +39,7 @@ #include #include #include +#include #include #include @@ -938,6 +939,20 @@ S3ResumeExecuteBootScript ( CpuDeadLoop (); } +/** + Sync up the MTRR values for all processors. + + @param[in] MtrrTable Address of MTRR setting. +**/ +VOID +EFIAPI +LoadMtrrData ( + IN VOID *MtrrTable + ) +{ + MtrrSetAllMtrrs (MtrrTable); +} + /** Restores the platform to its preboot configuration for an S3 resume and jumps to the OS waking vector. @@ -990,6 +1005,7 @@ S3RestoreConfig2 ( BOOLEANInterruptStatus; IA32_CR0 Cr0; EDKII_PEI_MP_SERVICES2_PPI *MpService2Ppi; + MTRR_SETTINGS MtrrTable; TempAcpiS3Context = 0; TempEfiBootScriptExecutorVariable = 0; @@ -1082,6 +1098,39 @@ S3RestoreConfig2 ( Status = SmmAccess->Open ((EFI_PEI_SERVICES **)GetPeiServicesTablePointer (), SmmAccess, Index); } +// +// Get MP Services2 Ppi to pass it to Smm S3. +// +Status = PeiServicesLocatePpi ( + , + 0, + NULL, + (VOID **) + ); +ASSERT_EFI_ERROR (Status); + +// +// Restore MTRR setting +// +VarSize = sizeof (MTRR_SETTINGS); +Status = RestoreLockBox ( +, +, + +); +ASSERT_EFI_ERROR (Status); + +// +// Sync up the MTRR values for all processors. +// +Status = MpService2Ppi->StartupAllCPUs ( + MpService2Ppi, + (EFI_AP_PROCEDURE)LoadMtrrData, + 0, + (VOID *) + ); +ASSERT_EFI_ERROR (Status); + SmramDescriptor = (EFI_SMRAM_DESCRIPTOR *)GET_GUID_HOB_DATA (GuidHob); SmmS3ResumeState = (SMM_S3_RESUME_STATE *)(UINTN)SmramDescriptor->CpuStart; diff --git a/UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume2Pei.inf b/UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume2Pei.inf index 9c9b6f3db3..890c588aa8 100644 --- a/UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume2Pei.inf +++ b/UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume2Pei.inf @@ -67,6 +67,7 @@ LocalApicLib ReportStatusCodeLib LockBoxLib + MtrrLib [Guids] gEfiBootScriptExecutorVariableGuid## SOMETIMES_CONSUMES ## UNDEFINED # LockBox @@ -79,6 +80,7 @@ ## SOMETIMES_PRODUCES ## UNDEFINED # Install PPI ## SOMETIMES_CONSUMES ## UNDEFINED # Used to do smm communication gEdkiiS3SmmInitDoneGuid + gEdkiiS3MtrrSettingGuid [Ppis] gEfiPeiS3Resume2PpiGuid ## PRODUCES -- 2.31.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118838): https://edk2.groups.io/g/devel/message/118838 Mute This Topic: https://groups.io/mt/106018126/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH 04/18] UefiCpuPkg: Save MTRR by lockbox in CpuS3DataDxe
Reviewed-by: Ray Ni Thanks, Ray From: Tan, Dun Sent: Friday, May 10, 2024 18:08 To: devel@edk2.groups.io Cc: Ni, Ray ; Kumar, Rahul R ; Gerd Hoffmann ; Wu, Jiaxin Subject: [PATCH 04/18] UefiCpuPkg: Save MTRR by lockbox in CpuS3DataDxe Save MTRR by lockbox in CpuS3DataDxe. In S3 boot, The MTRR setting will be restored in S3Resume.c in following patches. Then S3Resume.c will wakeup all APs to load the MTRR setting. This can avoid waking up APs in CpuS3.c. Signed-off-by: Dun Tan Cc: Ray Ni Cc: Rahul Kumar Cc: Gerd Hoffmann Cc: Jiaxin Wu --- UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c | 11 +++ UefiCpuPkg/CpuS3DataDxe/CpuS3DataDxe.inf | 2 ++ 2 files changed, 13 insertions(+) diff --git a/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c b/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c index 86ce5303ca..825bb00b74 100644 --- a/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c +++ b/UefiCpuPkg/CpuS3DataDxe/CpuS3Data.c @@ -26,6 +26,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include #include +#include #include #include @@ -130,6 +131,16 @@ CpuS3DataOnEndOfDxe ( DEBUG ((DEBUG_VERBOSE, "%a\n", __func__)); MtrrGetAllMtrrs (>MtrrTable); + // + // Save MTRR in lockbox + // + Status = SaveLockBox ( + , + >MtrrTable, + sizeof (MTRR_SETTINGS) + ); + ASSERT_EFI_ERROR (Status); + // // Close event, so it will not be invoked again. // diff --git a/UefiCpuPkg/CpuS3DataDxe/CpuS3DataDxe.inf b/UefiCpuPkg/CpuS3DataDxe/CpuS3DataDxe.inf index 510133a614..a09254746b 100644 --- a/UefiCpuPkg/CpuS3DataDxe/CpuS3DataDxe.inf +++ b/UefiCpuPkg/CpuS3DataDxe/CpuS3DataDxe.inf @@ -46,9 +46,11 @@ BaseLib MtrrLib MemoryAllocationLib + LockBoxLib [Guids] gEfiEndOfDxeEventGroupGuid ## CONSUMES ## Event + gEdkiiS3MtrrSettingGuid [Protocols] gEfiMpServiceProtocolGuid ## CONSUMES -- 2.31.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118837): https://edk2.groups.io/g/devel/message/118837 Mute This Topic: https://groups.io/mt/106018124/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH 03/18] UefiCpuPkg: Add locbox lib instance in DSC
Reviewed-by: Ray Ni Thanks, Ray From: Tan, Dun Sent: Friday, May 10, 2024 18:08 To: devel@edk2.groups.io Cc: Ni, Ray ; Kumar, Rahul R ; Gerd Hoffmann ; Wu, Jiaxin Subject: [PATCH 03/18] UefiCpuPkg: Add locbox lib instance in DSC Add locbox lib instance in DSC. The SmmLockBoxDxeLib will be consumed by CpuS3DataDxe driver Signed-off-by: Dun Tan Cc: Ray Ni Cc: Rahul Kumar Cc: Gerd Hoffmann Cc: Jiaxin Wu --- UefiCpuPkg/UefiCpuPkg.dsc | 1 + 1 file changed, 1 insertion(+) diff --git a/UefiCpuPkg/UefiCpuPkg.dsc b/UefiCpuPkg/UefiCpuPkg.dsc index 3d49f72588..b113ae022f 100644 --- a/UefiCpuPkg/UefiCpuPkg.dsc +++ b/UefiCpuPkg/UefiCpuPkg.dsc @@ -68,6 +68,7 @@ UnitTestLib|UnitTestFrameworkPkg/Library/UnitTestLib/UnitTestLib.inf UnitTestPersistenceLib|UnitTestFrameworkPkg/Library/UnitTestPersistenceLibNull/UnitTestPersistenceLibNull.inf UnitTestResultReportLib|UnitTestFrameworkPkg/Library/UnitTestResultReportLib/UnitTestResultReportLibDebugLib.inf + LockBoxLib|MdeModulePkg/Library/SmmLockBoxLib/SmmLockBoxDxeLib.inf [LibraryClasses.common.SEC] PlatformSecLib|UefiCpuPkg/Library/PlatformSecLibNull/PlatformSecLibNull.inf -- 2.31.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118836): https://edk2.groups.io/g/devel/message/118836 Mute This Topic: https://groups.io/mt/106018123/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH 02/18] OvmfPkg: Save MTRR by lockbox in CpuS3DataDxe
Reviewed-by: Ray Ni Thanks, Ray From: Tan, Dun Sent: Friday, May 10, 2024 18:08 To: devel@edk2.groups.io Cc: Ard Biesheuvel ; Yao, Jiewen ; Gerd Hoffmann ; Ni, Ray ; Wu, Jiaxin Subject: [PATCH 02/18] OvmfPkg: Save MTRR by lockbox in CpuS3DataDxe Save MTRR by lockbox in CpuS3DataDxe. In S3 boot, The MTRR setting will be restored in S3Resume.c in following patches. Then S3Resume.c will wakeup all APs to load the MTRR setting. This can avoid waking up APs in CpuS3.c. Signed-off-by: Dun Tan Cc: Ard Biesheuvel Cc: Jiewen Yao Cc: Gerd Hoffmann Cc: Ray Ni Cc: Jiaxin Wu --- OvmfPkg/CpuS3DataDxe/CpuS3Data.c | 11 +++ OvmfPkg/CpuS3DataDxe/CpuS3DataDxe.inf | 2 ++ 2 files changed, 13 insertions(+) diff --git a/OvmfPkg/CpuS3DataDxe/CpuS3Data.c b/OvmfPkg/CpuS3DataDxe/CpuS3Data.c index 289048b75d..d1aba32842 100644 --- a/OvmfPkg/CpuS3DataDxe/CpuS3Data.c +++ b/OvmfPkg/CpuS3DataDxe/CpuS3Data.c @@ -26,6 +26,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include #include +#include #include #include @@ -130,6 +131,16 @@ CpuS3DataOnEndOfDxe ( DEBUG ((DEBUG_VERBOSE, "%a\n", __func__)); MtrrGetAllMtrrs (>MtrrTable); + // + // Save MTRR in lockbox + // + Status = SaveLockBox ( + , + >MtrrTable, + sizeof (MTRR_SETTINGS) + ); + ASSERT_EFI_ERROR (Status); + // // Close event, so it will not be invoked again. // diff --git a/OvmfPkg/CpuS3DataDxe/CpuS3DataDxe.inf b/OvmfPkg/CpuS3DataDxe/CpuS3DataDxe.inf index 228d5ae1b2..f5032a9222 100644 --- a/OvmfPkg/CpuS3DataDxe/CpuS3DataDxe.inf +++ b/OvmfPkg/CpuS3DataDxe/CpuS3DataDxe.inf @@ -46,9 +46,11 @@ MtrrLib UefiBootServicesTableLib UefiDriverEntryPoint + LockBoxLib [Guids] gEfiEndOfDxeEventGroupGuid ## CONSUMES ## Event + gEdkiiS3MtrrSettingGuid [Protocols] gEfiMpServiceProtocolGuid ## CONSUMES -- 2.31.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118835): https://edk2.groups.io/g/devel/message/118835 Mute This Topic: https://groups.io/mt/106018122/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH 01/18] MdeModulePkg: Add gEdkiiS3MtrrSettingGuid
Reviewed-by: Ray Ni Thanks, Ray From: Tan, Dun Sent: Friday, May 10, 2024 18:08 To: devel@edk2.groups.io Cc: Ni, Ray ; Liming Gao ; Wu, Jiaxin Subject: [PATCH 01/18] MdeModulePkg: Add gEdkiiS3MtrrSettingGuid Add gEdkiiS3MtrrSettingGuid a new GUID for s3 MTRR setting. This GUID will be used to save MTRR_SETTINGS at EndOfDxe by LockBox and restore at S3 boot PEI phase for s3 usage. Signed-off-by: Dun Tan Cc: Ray Ni Cc: Liming Gao Cc: Jiaxin Wu --- MdeModulePkg/MdeModulePkg.dec | 3 +++ 1 file changed, 3 insertions(+) diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec index f7339f0aec..2c50d90e94 100644 --- a/MdeModulePkg/MdeModulePkg.dec +++ b/MdeModulePkg/MdeModulePkg.dec @@ -465,6 +465,9 @@ gEdk2JedecSfdpSpiDxeDriverGuid = { 0xBE71701E, 0xB63C, 0x4574, { 0x9C, 0x5C, 0x36, 0x29, 0xE8, 0xEA, 0xC4, 0x14 }} gEdk2JedecSfdpSpiSmmDriverGuid = { 0x95A1E915, 0x195C, 0x477C, { 0x92, 0x6F, 0x7E, 0x24, 0x67, 0xC1, 0xB3, 0x1F }} + ## This GUID will be used to save MTRR_SETTINGS at EndOfDxe by LockBox and restore at S3 boot PEI phase for s3 usage. + gEdkiiS3MtrrSettingGuid = { 0xd77baa84, 0xb332, 0x4463, { 0x9f, 0x1d, 0xce, 0x81, 0x00, 0xfe, 0x7f, 0x35 }} + [Ppis] ## Include/Ppi/FirmwareVolumeShadowPpi.h gEdkiiPeiFirmwareVolumeShadowPpiGuid = { 0x7dfe756c, 0xed8d, 0x4d77, {0x9e, 0xc4, 0x39, 0x9a, 0x8a, 0x81, 0x51, 0x16 } } -- 2.31.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118834): https://edk2.groups.io/g/devel/message/118834 Mute This Topic: https://groups.io/mt/106018120/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH 06/18] UefiCpuPkg: Remove the duplicated mpservice locate
diff --git a/UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume.c b/UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume.c index 3e85eab28f..a8e9c92a93 100644 --- a/UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume.c +++ b/UefiCpuPkg/Universal/Acpi/S3Resume2Pei/S3Resume.c @@ -1139,7 +1139,6 @@ S3RestoreConfig2 ( SmmS3ResumeState->ReturnContext1 = (EFI_PHYSICAL_ADDRESS)(UINTN)AcpiS3Context; SmmS3ResumeState->ReturnContext2 = (EFI_PHYSICAL_ADDRESS)(UINTN)EfiBootScriptExecutorVariable; SmmS3ResumeState->ReturnStackPointer = (EFI_PHYSICAL_ADDRESS)STACK_ALIGN_DOWN (); -SmmS3ResumeState->MpService2Ppi = 0; [Ray] MpService2Ppi will be random value with this patch. Would it cause any functionality issue (e.g.: CpuS3.c incorrectly invokes StartupAllCPUs() from the random MpService2Ppi) if only patches 1~6 are applied? Maybe you can add a ZeroMem (SmmS3ResumeState, sizeof (*SmmS3ResumeState)) so the file does not need any change even after you remove the MpService2Ppi field. -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118833): https://edk2.groups.io/g/devel/message/118833 Mute This Topic: https://groups.io/mt/106018127/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH 1/1] MdeModulePkg: Load Serial driver in early DXE
Mike did not recommend the approach used by the patch. Your patch exposes a new pattern that's anti-driver-model, IMO. If you want to avoid code duplication, solve that problem in a way that does not introduce such a pattern. Please be aware that any one piece of code introduced in edk2, could be cloned to multiple similar pieces of code. So we need to be very careful. Thanks, Ray From: devel@edk2.groups.io on behalf of Borzeszkowski, Alan Sent: Wednesday, May 8, 2024 21:24 To: Ni, Ray ; devel@edk2.groups.io Subject: Re: [edk2-devel] [PATCH 1/1] MdeModulePkg: Load Serial driver in early DXE We have considered that; however, we aim to avoid maintaining our own implementation of functions that communicate with UART. Please see discussion over previous approach: https://edk2.groups.io/g/devel/topic/104469297#115731 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118788): https://edk2.groups.io/g/devel/message/118788 Mute This Topic: https://groups.io/mt/105959587/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH v1 02/14] EmulatorPkg: : Add Hash2DxeCrypto to EmulatorPkg
Reviewed-by: Ray Ni Thanks, Ray From: Doug Flick Sent: Wednesday, May 8, 2024 23:29 To: devel@edk2.groups.io Cc: Andrew Fish ; Ni, Ray Subject: [PATCH v1 02/14] EmulatorPkg: : Add Hash2DxeCrypto to EmulatorPkg From: Doug Flick This patch adds Hash2DxeCrypto to EmulatorPkg. The Hash2DxeCrypto is used to provide the hashing protocol services. Cc: Andrew Fish Cc: Ray Ni Signed-off-by: Doug Flick [MSFT] --- EmulatorPkg/EmulatorPkg.dsc | 9 +++-- EmulatorPkg/EmulatorPkg.fdf | 5 + 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/EmulatorPkg/EmulatorPkg.dsc b/EmulatorPkg/EmulatorPkg.dsc index 0a66294cb768..1c356bc8c732 100644 --- a/EmulatorPkg/EmulatorPkg.dsc +++ b/EmulatorPkg/EmulatorPkg.dsc @@ -128,10 +128,11 @@ [LibraryClasses] FileHandleLib|MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf ImagePropertiesRecordLib|MdeModulePkg/Library/ImagePropertiesRecordLib/ImagePropertiesRecordLib.inf RngLib|MdeModulePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.inf - -!if $(SECURE_BOOT_ENABLE) == TRUE IntrinsicLib|CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf + BaseCryptLib|CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf + +!if $(SECURE_BOOT_ENABLE) == TRUE PlatformSecureLib|SecurityPkg/Library/PlatformSecureLibNull/PlatformSecureLibNull.inf AuthVariableLib|SecurityPkg/Library/AuthVariableLib/AuthVariableLib.inf SecureBootVariableLib|SecurityPkg/Library/SecureBootVariableLib/SecureBootVariableLib.inf @@ -402,6 +403,10 @@ [Components] # Rng Protocol producer # SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf + # + # Hash2 Protocol producer + # + SecurityPkg/Hash2DxeCrypto/Hash2DxeCrypto.inf !if $(SECURE_BOOT_ENABLE) == TRUE SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf diff --git a/EmulatorPkg/EmulatorPkg.fdf b/EmulatorPkg/EmulatorPkg.fdf index d756c144d94d..73d5b0068d3f 100644 --- a/EmulatorPkg/EmulatorPkg.fdf +++ b/EmulatorPkg/EmulatorPkg.fdf @@ -198,6 +198,11 @@ [FV.FvRecovery] # INF SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf +# +# Hash2 Protocol producer +# +INF SecurityPkg/Hash2DxeCrypto/Hash2DxeCrypto.inf + # # Secure Boot Key Enroll # -- 2.34.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118787): https://edk2.groups.io/g/devel/message/118787 Mute This Topic: https://groups.io/mt/105983240/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH v2 01/13] EmulatorPkg: : Add RngDxe to EmulatorPkg
Reviewed-by: Ray Ni Thanks, Ray From: devel@edk2.groups.io on behalf of Doug Flick via groups.io Sent: Thursday, May 9, 2024 13:56 To: devel@edk2.groups.io Cc: Andrew Fish ; Ni, Ray Subject: [edk2-devel] [PATCH v2 01/13] EmulatorPkg: : Add RngDxe to EmulatorPkg From: Doug Flick This patch adds RngDxe to EmulatorPkg. The RngDxe is used to provide random number generation services to the UEFI firmware. Cc: Andrew Fish Cc: Ray Ni Signed-off-by: Doug Flick [MSFT] --- EmulatorPkg/EmulatorPkg.dsc | 9 +++-- EmulatorPkg/EmulatorPkg.fdf | 6 +- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/EmulatorPkg/EmulatorPkg.dsc b/EmulatorPkg/EmulatorPkg.dsc index 5fa1ed345a33..0a66294cb768 100644 --- a/EmulatorPkg/EmulatorPkg.dsc +++ b/EmulatorPkg/EmulatorPkg.dsc @@ -127,9 +127,9 @@ [LibraryClasses] ShellLib|ShellPkg/Library/UefiShellLib/UefiShellLib.inf FileHandleLib|MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf ImagePropertiesRecordLib|MdeModulePkg/Library/ImagePropertiesRecordLib/ImagePropertiesRecordLib.inf - -!if $(SECURE_BOOT_ENABLE) == TRUE RngLib|MdeModulePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.inf + +!if $(SECURE_BOOT_ENABLE) == TRUE IntrinsicLib|CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLibCrypto.inf PlatformSecureLib|SecurityPkg/Library/PlatformSecureLibNull/PlatformSecureLibNull.inf @@ -398,6 +398,11 @@ [Components] EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.inf EmulatorPkg/TimerDxe/Timer.inf + # + # Rng Protocol producer + # + SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf + !if $(SECURE_BOOT_ENABLE) == TRUE SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf !endif diff --git a/EmulatorPkg/EmulatorPkg.fdf b/EmulatorPkg/EmulatorPkg.fdf index 5420756eaa6f..d756c144d94d 100644 --- a/EmulatorPkg/EmulatorPkg.fdf +++ b/EmulatorPkg/EmulatorPkg.fdf @@ -193,6 +193,11 @@ [FV.FvRecovery] INF MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenuApp.inf INF MdeModulePkg/Universal/DriverSampleDxe/DriverSampleDxe.inf +# +# Rng Protocol producer +# +INF SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf + # # Secure Boot Key Enroll # @@ -320,4 +325,3 @@ [Rule.Common.UEFI_APPLICATION.BINARY] UISTRING="$(MODULE_NAME)" Optional VERSION STRING="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER) } - -- 2.34.1 -=-=-=-=-=-= Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118717): https://edk2.groups.io/g/devel/message/118717 Mute This Topic: https://groups.io/mt/105996579/1712937 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [ray...@intel.com] -=-=-=-=-=-= -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118786): https://edk2.groups.io/g/devel/message/118786 Mute This Topic: https://groups.io/mt/105996579/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH] MdeModulePkg: Update GCD attribute conversion to support SP attribute
Reviewed-by: Ray Ni Thanks, Ray From: Lin, Du Sent: Thursday, May 9, 2024 12:04 To: devel@edk2.groups.io Cc: Lin, Du ; Liming Gao ; Ni, Ray Subject: [PATCH] MdeModulePkg: Update GCD attribute conversion to support SP attribute Add a new entry into GCD attribute conversion table to convert EFI_RESOURCE_ATTRIBUTE_SPECIAL_PURPOSE to EFI_MEMORY_SP. Cc: Liming Gao Cc: Ray Ni Signed-off-by: Du Lin --- MdeModulePkg/Core/Dxe/Gcd/Gcd.c | 1 + 1 file changed, 1 insertion(+) diff --git a/MdeModulePkg/Core/Dxe/Gcd/Gcd.c b/MdeModulePkg/Core/Dxe/Gcd/Gcd.c index fe1bbd6974..99364508cd 100644 --- a/MdeModulePkg/Core/Dxe/Gcd/Gcd.c +++ b/MdeModulePkg/Core/Dxe/Gcd/Gcd.c @@ -92,6 +92,7 @@ GCD_ATTRIBUTE_CONVERSION_ENTRY mAttributeConversionTable[] = { { EFI_RESOURCE_ATTRIBUTE_TESTED, EFI_MEMORY_TESTED, FALSE }, { EFI_RESOURCE_ATTRIBUTE_PERSISTABLE, EFI_MEMORY_NV, TRUE }, { EFI_RESOURCE_ATTRIBUTE_MORE_RELIABLE, EFI_MEMORY_MORE_RELIABLE, TRUE }, + { EFI_RESOURCE_ATTRIBUTE_SPECIAL_PURPOSE, EFI_MEMORY_SP, TRUE }, { 0, 0, FALSE } }; -- 2.44.0.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118784): https://edk2.groups.io/g/devel/message/118784 Mute This Topic: https://groups.io/mt/105995670/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH 1/1] MdeModulePkg: Load Serial driver in early DXE
Why not implement a customized SerialPortLib and use MdeModulePkg/Universal/SerialDxe/SerialDxe.inf? Thanks, Ray From: Borzeszkowski, Alan Sent: Tuesday, May 7, 2024 21:09 To: devel@edk2.groups.io Cc: Borzeszkowski, Alan ; Gao, Zhichao ; Ni, Ray ; Kinney, Michael D Subject: [PATCH 1/1] MdeModulePkg: Load Serial driver in early DXE For the purpose of UEFI debug prints enablement in early DXE, Serial driver should load earlier. To comply with EDK2 specification and maximize code reuse, new driver entrypoint was created and separate .inf file was added. Cc: Zhichao Gao Cc: Ray Ni Cc: Michael D Kinney Signed-off-by: Alan Borzeszkowski --- .../PciSioSerialDxe/PciSioSerialDxeEarly.inf | 81 MdeModulePkg/Bus/Pci/PciSioSerialDxe/Serial.c | 184 ++ .../Bus/Pci/PciSioSerialDxe/SerialIo.c| 16 +- MdeModulePkg/MdeModulePkg.dsc | 1 + 4 files changed, 245 insertions(+), 37 deletions(-) create mode 100644 MdeModulePkg/Bus/Pci/PciSioSerialDxe/PciSioSerialDxeEarly.inf diff --git a/MdeModulePkg/Bus/Pci/PciSioSerialDxe/PciSioSerialDxeEarly.inf b/MdeModulePkg/Bus/Pci/PciSioSerialDxe/PciSioSerialDxeEarly.inf new file mode 100644 index 00..1b88f7a1cc --- /dev/null +++ b/MdeModulePkg/Bus/Pci/PciSioSerialDxe/PciSioSerialDxeEarly.inf @@ -0,0 +1,81 @@ +## @file +# Serial driver for standard UARTS on a SIO chip or PCI/PCIE card. +# +# Produces the Serial I/O protocol for standard UARTS using Super I/O or PCI I/O. +# +# This is Early DXE version of Serial driver. It's intended use is for debug purposes +# in early DXE. There is added dependency on either Super I/O Protocol or PCI I/O Protocol. +# +# Copyright (c) 2007 - 2024, Intel Corporation. All rights reserved. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION= 0x00010005 + BASE_NAME = PciSioSerialDxeEarly + MODULE_UNI_FILE= PciSioSerialDxe.uni + FILE_GUID = E47C4BFB-9CCC-47B6-A3C1-79C3FBF8B6C8 + MODULE_TYPE= DXE_DRIVER + VERSION_STRING = 1.0 + ENTRY_POINT= DxePciSioSerialDriverEntrypoint + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 EBC +# +# DRIVER_BINDING= gSerialControllerDriver +# COMPONENT_NAME= gPciSioSerialComponentName +# COMPONENT_NAME2 = gPciSioSerialComponentName2 +# + +[Sources] + ComponentName.c + SerialIo.c + Serial.h + Serial.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + +[LibraryClasses] + PcdLib + ReportStatusCodeLib + UefiBootServicesTableLib + MemoryAllocationLib + BaseMemoryLib + DevicePathLib + UefiLib + UefiDriverEntryPoint + DebugLib + IoLib + +[Guids] + gEfiUartDevicePathGuid## SOMETIMES_CONSUMES ## GUID + +[Protocols] + gEfiSioProtocolGuid ## TO_START + gEfiDevicePathProtocolGuid## TO_START + gEfiPciIoProtocolGuid ## TO_START + gEfiSerialIoProtocolGuid ## BY_START + gEfiDevicePathProtocolGuid## BY_START + +[FeaturePcd] + gEfiMdeModulePkgTokenSpaceGuid.PcdSerialUseHalfHandshake|FALSE ## CONSUMES + +[Pcd] + gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate|115200## CONSUMES + gEfiMdePkgTokenSpaceGuid.PcdUartDefaultDataBits|8 ## CONSUMES + gEfiMdePkgTokenSpaceGuid.PcdUartDefaultParity|1 ## CONSUMES + gEfiMdePkgTokenSpaceGuid.PcdUartDefaultStopBits|1 ## CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdSerialClockRate|1843200 ## CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdPciSerialParameters ## CONSUMES + +[UserExtensions.TianoCore."ExtraFiles"] + PciSioSerialDxeExtra.uni + +[Depex] + gEfiSioProtocolGuid OR gEfiPciIoProtocolGuid diff --git a/MdeModulePkg/Bus/Pci/PciSioSerialDxe/Serial.c b/MdeModulePkg/Bus/Pci/PciSioSerialDxe/Serial.c index 8b1ce70118..cc77d12748 100644 --- a/MdeModulePkg/Bus/Pci/PciSioSerialDxe/Serial.c +++ b/MdeModulePkg/Bus/Pci/PciSioSerialDxe/Serial.c @@ -156,6 +156,7 @@ InitializePciSioSerial ( /** Return whether the controller is a SIO serial controller. + @param This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. @param Controller The controller handle. @retval EFI_SUCCESS The controller is a SIO serial controller. @@ -163,7 +164,8 @@ InitializePciSioSerial ( **/ EFI_STATUS IsSioSerialController ( - EFI_HANDLE Controller + IN EFI_DRIVER_BINDING_PROTOCOL *This, + EFI_HANDLE Controller ) { EFI_STATUSStatus; @@ -178,7 +180,7 @@ IsSioSerialController (
Re: [edk2-devel] [PATCH v2] MdeModulePkg/PciBusDxe: plug device hierarchy leak upon bridge hot-unplug
Neo, I don't think your change is needed because of the following existing logic where RemoveAllPciDeviceOnBridge() is called to destroy/free all PCI nodes. if (Operation == EfiPciHotplugRequestRemove) { if (*NumberOfChildren == 0) { // // Remove all devices on the bridge // RemoveAllPciDeviceOnBridge (RootBridgeHandle, Bridge); return EFI_SUCCESS; } Thanks, Ray From: Hsueh, Hong-Chih (Neo) Sent: Wednesday, May 1, 2024 2:24 To: Laszlo Ersek ; devel@edk2.groups.io ; Ni, Ray Cc: Ding, Feng (Sunnyvale) ; He, Jiangang ; Chang, Abner ; gaolim...@byosoft.com.cn Subject: Re: [PATCH v2] MdeModulePkg/PciBusDxe: plug device hierarchy leak upon bridge hot-unplug [AMD Official Use Only - General] Hi @ray...@intel.com<mailto:ray...@intel.com>, Sorry you bother you, may I have your feedback for this patch? If it looks good to you could you help to give me an R-b ? Thank you. Regards, Neo From: Laszlo Ersek Sent: Sunday, February 25, 2024 7:59 AM To: Hsueh, Hong-Chih (Neo) ; devel@edk2.groups.io Cc: Ding, Feng (Sunnyvale) ; He, Jiangang ; Chang, Abner ; ray...@intel.com ; gaolim...@byosoft.com.cn Subject: Re: [PATCH v2] MdeModulePkg/PciBusDxe: plug device hierarchy leak upon bridge hot-unplug Caution: This message originated from an External Source. Use proper caution when opening attachments, clicking links, or responding. On 2/22/24 17:28, Neo Hsueh wrote: > A USB4 or TBT bridge can be plugged or unplugged on USB4 port. The actions > require PciHotPlugRequestNotify to add a root bridge or remove a root bridge > completely. > In the plug-unplug-plug scenerio, PciHotPlugRequestNotify will return with > no-action on second plug because bridge tree shows configured. > Destroy Pci Device Tree in function PciHotPlugRequestNotify for unplug event > to fix this issue. > > Cc: Feng Ding > Cc: Jiangang He > Signed-off-by: Neo Hsueh > --- > MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumerator.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumerator.c > b/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumerator.c > index 3f8c6e6da7..2b7af60e0a 100644 > --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumerator.c > +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumerator.c > @@ -2103,6 +2103,8 @@ PciHotPlugRequestNotify ( >} > } > > +DestroyPciDeviceTree (Bridge); > + > // > // End for > // This looks convincing to me, but I don't now nearly enough about PciBusDxe internals (resource management in particular) to confidently approve this patch. I can give an Acked-by: Laszlo Ersek but the patch should not be merged until Ray provides an R-b. Laszlo -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118656): https://edk2.groups.io/g/devel/message/118656 Mute This Topic: https://groups.io/mt/104511503/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH 3/3] MdeModulePkg: Add Standalone MM Lockbox Driver.
Reviewed-by: Ray Ni Thanks, Ray From: Xie, Yuanhao Sent: Tuesday, May 7, 2024 14:09 To: devel@edk2.groups.io Cc: Liming Gao ; Wu, Jiaxin ; Ni, Ray ; Xie, Yuanhao Subject: [PATCH 3/3] MdeModulePkg: Add Standalone MM Lockbox Driver. The Lockbox Driver allows sensitive data to be securely stored in a designated area, thus protected against unauthorized access. This patch adds a Standalone MM Lockbox Driver with main modifications: 1. Separating shared code between the Standalone MM driver and the DXE MM Driver. 2. Utilizing services from the SMM Services Table (gSmst) as opposed to relying on Boot Services. Cc: Liming Gao Cc: Jiaxin Wu Cc: Ray Ni Signed-off-by: Yuanhao Xie --- MdeModulePkg/MdeModulePkg.dsc | 1 + MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBoxStandaloneMm.c| 84 MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBoxStandaloneMm.inf | 56 MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBoxStandaloneMm.uni | 14 ++ MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBoxStandaloneMmExtra.uni | 14 ++ 5 files changed, 169 insertions(+) diff --git a/MdeModulePkg/MdeModulePkg.dsc b/MdeModulePkg/MdeModulePkg.dsc index 6bed9205ea..f0f02f180f 100644 --- a/MdeModulePkg/MdeModulePkg.dsc +++ b/MdeModulePkg/MdeModulePkg.dsc @@ -500,6 +500,7 @@ MdeModulePkg/Universal/ReportStatusCodeRouter/Smm/ReportStatusCodeRouterSmm.inf MdeModulePkg/Universal/ReportStatusCodeRouter/Smm/ReportStatusCodeRouterStandaloneMm.inf MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBox.inf + MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBoxStandaloneMm.inf MdeModulePkg/Library/SmmMemoryAllocationProfileLib/SmmMemoryAllocationProfileLib.inf MdeModulePkg/Library/PiSmmCoreMemoryAllocationLib/PiSmmCoreMemoryAllocationProfileLib.inf MdeModulePkg/Library/PiSmmCoreMemoryAllocationLib/PiSmmCoreMemoryAllocationLib.inf diff --git a/MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBoxStandaloneMm.c b/MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBoxStandaloneMm.c new file mode 100644 index 00..503be7efa8 --- /dev/null +++ b/MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBoxStandaloneMm.c @@ -0,0 +1,84 @@ +/** @file + LockBox MM driver. + +Copyright (c) 2024, Intel Corporation. All rights reserved. + +SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "SmmLockBoxCommon.h" + +/** + This function is an abstraction layer for implementation specific Mm buffer validation routine. + + @param Buffer The buffer start address to be checked. + @param Length The buffer length to be checked. + + @retval TRUE This buffer is valid per processor architecture and not overlap with SMRAM. + @retval FALSE This buffer is not valid per processor architecture or overlap with SMRAM. +**/ +BOOLEAN +IsBufferOutsideMmValid ( + IN EFI_PHYSICAL_ADDRESS Buffer, + IN UINT64Length + ) +{ + return MmIsBufferOutsideMmValid (Buffer, Length); +} + +/** + Entry Point for LockBox MM driver. + + @param[in] ImageHandle Image handle of this driver. + @param[in] SystemTable A Pointer to the EFI System Table. + + @retval EFI_SUCEESS + @return Others Some error occurs. +**/ +EFI_STATUS +EFIAPI +SmmLockBoxStandaloneMmEntryPoint ( + IN EFI_HANDLE ImageHandle, + IN EFI_MM_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + EFI_HANDLE DispatchHandle; + VOID*Registration; + + // + // Register LockBox communication handler + // + Status = gMmst->MmiHandlerRegister ( +SmmLockBoxHandler, +, + +); + ASSERT_EFI_ERROR (Status); + + // + // Register SMM Ready To Lock Protocol notification + // + Status = gMmst->MmRegisterProtocolNotify ( +, +SmmReadyToLockEventNotify, + +); + ASSERT_EFI_ERROR (Status); + return Status; +} diff --git a/MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBoxStandaloneMm.inf b/MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBoxStandaloneMm.inf new file mode 100644 index 00..544c87790c --- /dev/null +++ b/MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBoxStandaloneMm.inf @@ -0,0 +1,56 @@ +## @file +# LockBox MM driver. +# +# Copyright (c) 2024, Intel Corporation. All rights reserved. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION= 0x00010005 + BASE_NAME = SmmLockBoxStandaloneMm + MODULE_UNI_FILE= SmmLockBoxStandaloneMm.
Re: [edk2-devel] [PATCH 2/3] MdeModulePkg: Refactors SmmLockBox.c.
Reviewed-by: Ray Ni Thanks, Ray From: Xie, Yuanhao Sent: Tuesday, May 7, 2024 14:09 To: devel@edk2.groups.io Cc: Liming Gao ; Wu, Jiaxin ; Ni, Ray ; Xie, Yuanhao Subject: [PATCH 2/3] MdeModulePkg: Refactors SmmLockBox.c. The Lockbox Driver allows sensitive data to be securely stored in a designated area, thus protected against unauthorized access. This patch does not introduce any functional modifications. It refactors the existing logic into a common component to facilitates the integration of the Standalone MM Lockbox Driver in an upcoming patch Cc: Liming Gao Cc: Jiaxin Wu Cc: Ray Ni Signed-off-by: Yuanhao Xie --- MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBox.c | 361 - MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBox.inf | 4 +++- MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBoxCommon.c | 384 MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBoxCommon.h | 148 4 files changed, 547 insertions(+), 350 deletions(-) diff --git a/MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBox.c b/MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBox.c index c1e15c596b..2774979c34 100644 --- a/MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBox.c +++ b/MdeModulePkg/Universal/LockBox/SmmLockBox/SmmLockBox.c @@ -9,7 +9,7 @@ SmmLockBoxHandler(), SmmLockBoxRestore(), SmmLockBoxUpdate(), SmmLockBoxSave() will receive untrusted input and do basic validation. -Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved. +Copyright (c) 2010 - 2024, Intel Corporation. All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent @@ -31,360 +31,24 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include -BOOLEAN mLocked = FALSE; +#include "SmmLockBoxCommon.h" /** - Dispatch function for SMM lock box save. + This function is an abstraction layer for implementation specific Mm buffer validation routine. - Caution: This function may receive untrusted input. - Restore buffer and length are external input, so this function will validate - it is in SMRAM. + @param Buffer The buffer start address to be checked. + @param Length The buffer length to be checked. - @param LockBoxParameterSave parameter of lock box save + @retval TRUE This buffer is valid per processor architecture and not overlap with SMRAM. + @retval FALSE This buffer is not valid per processor architecture or overlap with SMRAM. **/ -VOID -SmmLockBoxSave ( - IN EFI_SMM_LOCK_BOX_PARAMETER_SAVE *LockBoxParameterSave +BOOLEAN +IsBufferOutsideMmValid ( + IN EFI_PHYSICAL_ADDRESS Buffer, + IN UINT64Length ) { - EFI_STATUS Status; - EFI_SMM_LOCK_BOX_PARAMETER_SAVE TempLockBoxParameterSave; - - // - // Sanity check - // - if (mLocked) { -DEBUG ((DEBUG_ERROR, "SmmLockBox Locked!\n")); -LockBoxParameterSave->Header.ReturnStatus = (UINT64)EFI_ACCESS_DENIED; -return; - } - - CopyMem (, LockBoxParameterSave, sizeof (EFI_SMM_LOCK_BOX_PARAMETER_SAVE)); - - // - // Sanity check - // - if (!SmmIsBufferOutsideSmmValid ((UINTN)TempLockBoxParameterSave.Buffer, (UINTN)TempLockBoxParameterSave.Length)) { -DEBUG ((DEBUG_ERROR, "SmmLockBox Save address in SMRAM or buffer overflow!\n")); -LockBoxParameterSave->Header.ReturnStatus = (UINT64)EFI_ACCESS_DENIED; -return; - } - - // - // The SpeculationBarrier() call here is to ensure the above range check for - // the CommBuffer have been completed before calling into SaveLockBox(). - // - SpeculationBarrier (); - - // - // Save data - // - Status = SaveLockBox ( - , - (VOID *)(UINTN)TempLockBoxParameterSave.Buffer, - (UINTN)TempLockBoxParameterSave.Length - ); - LockBoxParameterSave->Header.ReturnStatus = (UINT64)Status; - return; -} - -/** - Dispatch function for SMM lock box set attributes. - - @param LockBoxParameterSetAttributes parameter of lock box set attributes -**/ -VOID -SmmLockBoxSetAttributes ( - IN EFI_SMM_LOCK_BOX_PARAMETER_SET_ATT
Re: [edk2-devel] [PATCH 1/3] StandaloneMmPkg: Add LockBox Dependency DXE Driver
+#include [Ray] Can you check if BaseLib is really needed? +#include + +/** + It attempts to install the gEfiLockBoxProtocolGuid protocol into the system's DXE database + with NULL as the protocol interface to mark the protocol as handled in the system or to + act as a trigger. [Ray] "mark the protocol as handled in the system or to act as a trigger", I don't quite understand it. -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118653): https://edk2.groups.io/g/devel/message/118653 Mute This Topic: https://groups.io/mt/105955699/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH v4 14/14] UefiCpuPkg/PiSmmCpuDxeSmm: Remove SmBases relocation logic
Reviewed-by: Ray Ni Thanks, Ray From: Wu, Jiaxin Sent: Friday, April 26, 2024 20:17 To: devel@edk2.groups.io Cc: Ni, Ray ; Zeng, Star ; Gerd Hoffmann ; Kumar, Rahul R Subject: [PATCH v4 14/14] UefiCpuPkg/PiSmmCpuDxeSmm: Remove SmBases relocation logic This patch is to remove legacy SmBase relocation in PiSmmCpuDxeSmm Driver. The responsibility for SmBase relocation has been transferred to the SmmRelocationInit interface, which now handles the following tasks: 1. Relocates the SmBase for each processor. 2. Generates the gSmmBaseHobGuid HOB. As a result of this change, the PiSmmCpuDxeSmm driver's role in SMM environment setup is simplified to: 1. Utilize the gSmmBaseHobGuid to determine the SmBase. 2. Perform the ExecuteFirstSmiInit() to do early SMM initialization. Cc: Ray Ni Cc: Zeng Star Cc: Gerd Hoffmann Cc: Rahul Kumar Signed-off-by: Jiaxin Wu --- UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c| 21 +- UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/Semaphore.c | 42 UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmmInit.nasm | 96 UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c| 10 +- UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c | 334 +++ UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h | 103 + UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf | 4 - UefiCpuPkg/PiSmmCpuDxeSmm/SmmMpPerf.h| 2 +- UefiCpuPkg/PiSmmCpuDxeSmm/SmramSaveState.c | 69 -- UefiCpuPkg/PiSmmCpuDxeSmm/X64/Semaphore.c| 69 -- UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmInit.nasm | 146 11 files changed, 40 insertions(+), 856 deletions(-) delete mode 100644 UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/Semaphore.c delete mode 100644 UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmmInit.nasm delete mode 100644 UefiCpuPkg/PiSmmCpuDxeSmm/X64/Semaphore.c delete mode 100644 UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmInit.nasm diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c b/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c index b14c289a27..d67fb49890 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c @@ -639,27 +639,14 @@ InitializeCpuProcedure ( // InitializeCpuBeforeRebase (IsBsp); } if (IsBsp) { -DEBUG ((DEBUG_INFO, "SmmRestoreCpu: mSmmRelocated is %d\n", mSmmRelocated)); - // -// Check whether Smm Relocation is done or not. -// If not, will do the SmmBases Relocation here!!! +// Issue SMI IPI (All Excluding Self SMM IPI + BSP SMM IPI) to execute first SMI init. // -if (!mSmmRelocated) { - // - // Restore SMBASE for BSP and all APs - // - SmmRelocateBases (); -} else { - // - // Issue SMI IPI (All Excluding Self SMM IPI + BSP SMM IPI) to execute first SMI init. - // - ExecuteFirstSmiInit (); -} +ExecuteFirstSmiInit (); } // // Skip initialization if mAcpiCpuData is not valid // @@ -978,13 +965,13 @@ InitSmmS3ResumeState ( SmmS3ResumeState->SmmS3StackBase = (EFI_PHYSICAL_ADDRESS)(UINTN)AllocatePages (EFI_SIZE_TO_PAGES ((UINTN)SmmS3ResumeState->SmmS3StackSize)); if (SmmS3ResumeState->SmmS3StackBase == 0) { SmmS3ResumeState->SmmS3StackSize = 0; } -SmmS3ResumeState->SmmS3Cr0 = mSmmCr0; +SmmS3ResumeState->SmmS3Cr0 = (UINT32)AsmReadCr0 (); SmmS3ResumeState->SmmS3Cr3 = Cr3; -SmmS3ResumeState->SmmS3Cr4 = mSmmCr4; +SmmS3ResumeState->SmmS3Cr4 = (UINT32)AsmReadCr4 (); if (sizeof (UINTN) == sizeof (UINT64)) { SmmS3ResumeState->Signature = SMM_S3_RESUME_SMM_64; } diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/Semaphore.c b/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/Semaphore.c deleted file mode 100644 index a9fcc89dda..00 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/Semaphore.c +++ /dev/null @@ -1,42 +0,0 @@ -/** @file -Semaphore mechanism to indicate to the BSP that an AP has exited SMM -after SMBASE relocation. - -Copyright (c) 2009 - 2015, Intel Corporation. All rights reserved. -SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - -#include "PiSmmCpuDxeSmm.h" - -UINTN mSmmRelocationOriginalAddress; -volatile BOOLEAN *mRebasedFlag; - -/** - Hook return address of SMM Save State so that semaphore code - can be executed immediately after AP exits SMM to indicate to - the BSP that an AP has exited SMM after SMBASE relocation. - - @param[in] CpuIndex The processor index. - @param[in] RebasedFlag A pointer to a flag that is set to TRUE - immediately after AP exits SMM. - -**/ -VOID -SemaphoreHook ( - IN UINTN CpuIndex, - IN volatile BOOLEAN *RebasedFlag - ) -{ - SMRAM_SAVE_STATE_MAP *CpuState; - - mRebasedFlag = RebasedFlag; - - CpuState = (SMRAM_SAVE_STATE_MAP *)(UINTN)(SMM_DEFAULT_SMBASE + SMRAM_SAVE_STATE_MAP_OFFSET); - mSmmRelocationOriginalAddress = (UINTN)HookReturnFromSmm ( - CpuIndex, -
Re: [edk2-devel] [PATCH v4 06/14] UefiCpuPkg/SmmRelocationLib: Remove unnecessary CpuIndex
Reviewed-by: Ray Ni Thanks, Ray From: Wu, Jiaxin Sent: Friday, April 26, 2024 20:17 To: devel@edk2.groups.io Cc: Ni, Ray ; Zeng, Star ; Gerd Hoffmann ; Kumar, Rahul R Subject: [PATCH v4 06/14] UefiCpuPkg/SmmRelocationLib: Remove unnecessary CpuIndex This patch is to remove unnecessary CpuIndex. Cc: Ray Ni Cc: Zeng Star Cc: Gerd Hoffmann Cc: Rahul Kumar Signed-off-by: Jiaxin Wu --- UefiCpuPkg/Library/SmmRelocationLib/Ia32/Semaphore.c | 3 --- .../Library/SmmRelocationLib/InternalSmmRelocationLib.h | 5 - UefiCpuPkg/Library/SmmRelocationLib/SmmRelocationLib.c | 12 +++- UefiCpuPkg/Library/SmmRelocationLib/SmramSaveStateConfig.c | 3 --- UefiCpuPkg/Library/SmmRelocationLib/X64/Semaphore.c | 3 --- 5 files changed, 3 insertions(+), 23 deletions(-) diff --git a/UefiCpuPkg/Library/SmmRelocationLib/Ia32/Semaphore.c b/UefiCpuPkg/Library/SmmRelocationLib/Ia32/Semaphore.c index ba329d6ba2..5d9eea3de9 100644 --- a/UefiCpuPkg/Library/SmmRelocationLib/Ia32/Semaphore.c +++ b/UefiCpuPkg/Library/SmmRelocationLib/Ia32/Semaphore.c @@ -15,28 +15,25 @@ volatile BOOLEAN *mRebasedFlag; /** Hook return address of SMM Save State so that semaphore code can be executed immediately after AP exits SMM to indicate to the BSP that an AP has exited SMM after SMBASE relocation. - @param[in] CpuIndex The processor index. @param[in] RebasedFlag A pointer to a flag that is set to TRUE immediately after AP exits SMM. **/ VOID SemaphoreHook ( - IN UINTN CpuIndex, IN volatile BOOLEAN *RebasedFlag ) { SMRAM_SAVE_STATE_MAP *CpuState; mRebasedFlag = RebasedFlag; CpuState = (SMRAM_SAVE_STATE_MAP *)(UINTN)(SMM_DEFAULT_SMBASE + SMRAM_SAVE_STATE_MAP_OFFSET); mSmmRelocationOriginalAddress = (UINTN)HookReturnFromSmm ( - CpuIndex, CpuState, (UINT64)(UINTN), (UINT64)(UINTN) ); } diff --git a/UefiCpuPkg/Library/SmmRelocationLib/InternalSmmRelocationLib.h b/UefiCpuPkg/Library/SmmRelocationLib/InternalSmmRelocationLib.h index ede61b956f..d1387f2dfb 100644 --- a/UefiCpuPkg/Library/SmmRelocationLib/InternalSmmRelocationLib.h +++ b/UefiCpuPkg/Library/SmmRelocationLib/InternalSmmRelocationLib.h @@ -81,12 +81,10 @@ SmmRelocationSemaphoreComplete ( Hook the code executed immediately after an RSM instruction on the currently executing CPU. The mode of code executed immediately after RSM must be detected, and the appropriate hook must be selected. Always clear the auto HALT restart flag if it is set. - @param[in] CpuIndex The processor index for the currently - executing CPU. @param[in,out] CpuState Pointer to SMRAM Save State Map for the currently executing CPU. @param[in] NewInstructionPointer32 Instruction pointer to use if resuming to 32-bit mode from 64-bit SMM. @param[in] NewInstructionPointerInstruction pointer to use if resuming to @@ -96,29 +94,26 @@ SmmRelocationSemaphoreComplete ( **/ UINT64 EFIAPI HookReturnFromSmm ( - IN UINTN CpuIndex, IN OUT SMRAM_SAVE_STATE_MAP *CpuState, IN UINT64NewInstructionPointer32, IN UINT64NewInstructionPointer ); /** Hook return address of SMM Save State so that semaphore code can be executed immediately after AP exits SMM to indicate to the BSP that an AP has exited SMM after SMBASE relocation. - @param[in] CpuIndex The processor index. @param[in] RebasedFlag A pointer to a flag that is set to TRUE immediately after AP exits SMM. **/ VOID SemaphoreHook ( - IN UINTN CpuIndex, IN volatile BOOLEAN *RebasedFlag ); /** This function fixes up the address of the global variable or function diff --git a/UefiCpuPkg/Library/SmmRelocationLib/SmmRelocationLib.c b/UefiCpuPkg/Library/SmmRelocationLib/SmmRelocationLib.c index 86df66a280..7e65bbf929 100644 --- a/UefiCpuPkg/Library/SmmRelocationLib/SmmRelocationLib.c +++ b/UefiCpuPkg/Library/SmmRelocationLib/SmmRelocationLib.c @@ -29,15 +29,10 @@ UINT64 mSmBase; // // SmBase Rebased flag for current CPU // volatile BOOLEAN mRebased; -// -// CpuIndex for current CPU -// -UINTN mCpuIndex; - /** This function will get the SmBase for CpuIndex. @param[in] CpuIndexThe processor index. @param[in] SmmRelocationStart The start address of Smm relocated memory in SMRAM. @@ -153,11 +148,11 @@ SmmInitHandler ( // // Hook return after RSM to set SMM re-based flag // SMM re-based flag
Re: [edk2-devel] [PATCH v4 05/14] UefiCpuPkg/SmmRelocationLib: Remove unnecessary global variable
Reviewed-by: Ray Ni Thanks, Ray From: Wu, Jiaxin Sent: Friday, April 26, 2024 20:17 To: devel@edk2.groups.io Cc: Ni, Ray ; Zeng, Star ; Gerd Hoffmann ; Kumar, Rahul R Subject: [PATCH v4 05/14] UefiCpuPkg/SmmRelocationLib: Remove unnecessary global variable This patch aims on mProcessorInfo global variable, which can be defined as local variable in SmmRelocateBases(). With this patch, no need to allocate the memory for all CPUs to store the Processor Info. Cc: Ray Ni Cc: Zeng Star Cc: Gerd Hoffmann Cc: Rahul Kumar Signed-off-by: Jiaxin Wu --- .../Library/SmmRelocationLib/SmmRelocationLib.c| 88 -- 1 file changed, 32 insertions(+), 56 deletions(-) diff --git a/UefiCpuPkg/Library/SmmRelocationLib/SmmRelocationLib.c b/UefiCpuPkg/Library/SmmRelocationLib/SmmRelocationLib.c index 3694a07cbb..86df66a280 100644 --- a/UefiCpuPkg/Library/SmmRelocationLib/SmmRelocationLib.c +++ b/UefiCpuPkg/Library/SmmRelocationLib/SmmRelocationLib.c @@ -14,15 +14,10 @@ #include "InternalSmmRelocationLib.h" UINTN mMaxNumberOfCpus = 1; UINTN mNumberOfCpus= 1; -// -// Record all Processors Info -// -EFI_PROCESSOR_INFORMATION *mProcessorInfo = NULL; - // // IDT used during SMM Init // IA32_DESCRIPTOR gcSmmInitIdtr; @@ -34,10 +29,15 @@ UINT64 mSmBase; // // SmBase Rebased flag for current CPU // volatile BOOLEAN mRebased; +// +// CpuIndex for current CPU +// +UINTN mCpuIndex; + /** This function will get the SmBase for CpuIndex. @param[in] CpuIndexThe processor index. @param[in] SmmRelocationStart The start address of Smm relocated memory in SMRAM. @@ -138,37 +138,26 @@ VOID EFIAPI SmmInitHandler ( VOID ) { - UINT32 ApicId; - UINTN Index; - // // Update SMM IDT entries' code segment and load IDT // AsmWriteIdtr (); - ApicId = GetApicId (); - for (Index = 0; Index < mNumberOfCpus; Index++) { -if (ApicId == (UINT32)mProcessorInfo[Index].ProcessorId) { - // - // Configure SmBase. - // - ConfigureSmBase (mSmBase); - - // - // Hook return after RSM to set SMM re-based flag - // SMM re-based flag can't be set before RSM, because SMM save state context might be override - // by next AP flow before it take effect. - // - SemaphoreHook (Index, ); - return; -} - } + // + // Configure SmBase. + // + ConfigureSmBase (mSmBase); - ASSERT (FALSE); + // + // Hook return after RSM to set SMM re-based flag + // SMM re-based flag can't be set before RSM, because SMM save state context might be override + // by next AP flow before it take effect. + // + SemaphoreHook (mCpuIndex, ); } /** Relocate SmmBases for each processor. Execute on first boot and all S3 resumes @@ -185,17 +174,19 @@ SmmRelocateBases ( IN EDKII_PEI_MP_SERVICES2_PPI *MpServices2, IN EFI_PHYSICAL_ADDRESSSmmRelocationStart, IN UINTN TileSize ) { - UINT8 BakBuf[BACK_BUF_SIZE]; - SMRAM_SAVE_STATE_MAP BakBuf2; - SMRAM_SAVE_STATE_MAP *CpuStatePtr; - UINT8 *U8Ptr; - UINTN Index; - UINTN BspIndex; - UINT32BspApicId; + EFI_STATUS Status; + UINT8 BakBuf[BACK_BUF_SIZE]; + SMRAM_SAVE_STATE_MAP BakBuf2; + SMRAM_SAVE_STATE_MAP *CpuStatePtr; + UINT8 *U8Ptr; + UINTN Index; + UINTN BspIndex; + UINT32 BspApicId; + EFI_PROCESSOR_INFORMATION ProcessorInfo; // // Make sure the reserved size is large enough for procedure SmmInitTemplate. // ASSERT (sizeof (BakBuf) >= gcSmmInitSize); @@ -230,14 +221,18 @@ SmmRelocateBases ( // Relocate SM bases for all APs // This is APs' 1st SMI - rebase will be done here, and APs' default SMI handler will be overridden by gcSmmInitTemplate // BspIndex = (UINTN)-1; for (Index = 0; Index < mNumberOfCpus; Index++) { -if (BspApicId != (UINT32)mProcessorInfo[Index].ProcessorId) { - mRebased = FALSE; - mSmBase = GetSmBase (Index, SmmRelocationStart, TileSize); - SendSmiIpi ((UINT32)mProcessorInfo[Index].ProcessorId); +Status = MpServices2->GetProcessorInfo (MpServices2, Index | CPU_V2_EXTENDED_TOPOLOGY, ); +ASSERT_EFI_ERROR (Status); + +if (BspApicId != (UINT32)ProcessorInfo.ProcessorId) { + mRebased = FALSE; + mSmBase = GetSmBase (Index, SmmRelocationStart, TileSize); + mCpuIndex = Index; + SendSmiIpi ((UINT32)ProcessorInfo.ProcessorId); // // Wait for this AP to finish its 1st SMI // while (!mRebased) { } @@ -443,11 +438,10 @@ SmmRelocationInit ( UINTN TileSize; UINT64SmmRelocationSize; EFI_PHYSICAL_ADDRESS SmmRelocationStart; UINTN SmmStackSize; UINT8
Re: [edk2-devel] [PATCH] UefiCpuPkg/PiSmmCpuDxeSmm: Handle the NULL gMpInformation2HobGuid
Reviewed-by: Ray Ni Thanks, Ray From: Attar, AbdulLateef (Abdul Lateef) Sent: Tuesday, April 30, 2024 15:45 To: Ni, Ray ; devel@edk2.groups.io Cc: Laszlo Ersek ; Kumar, Rahul R ; Gerd Hoffmann Subject: Re: [PATCH] UefiCpuPkg/PiSmmCpuDxeSmm: Handle the NULL gMpInformation2HobGuid Hi Ray, Some of AMD platform doesnt use CpuMpPeim. Also this patch helps not to enforce the platform to brinup all AP's in PEI phase. Thanks AbduL On 30-04-2024 11:17, Ni, Ray wrote: Caution: This message originated from an External Source. Use proper caution when opening attachments, clicking links, or responding. Abdul, Does Amd PEI include the CpuMpPeim? If it includes the PEIM, the MpInformation2Hob should be in the HOB database. Thanks, Ray From: Abdul Lateef Attar <mailto:abdullateef.at...@amd.com> Sent: Monday, April 29, 2024 19:17 To: devel@edk2.groups.io<mailto:devel@edk2.groups.io> <mailto:devel@edk2.groups.io> Cc: Abdul Lateef Attar <mailto:abdullateef.at...@amd.com>; Ni, Ray <mailto:ray...@intel.com>; Laszlo Ersek <mailto:ler...@redhat.com>; Kumar, Rahul R <mailto:rahul.r.ku...@intel.com>; Gerd Hoffmann <mailto:kra...@redhat.com> Subject: [PATCH] UefiCpuPkg/PiSmmCpuDxeSmm: Handle the NULL gMpInformation2HobGuid If gMpInformation2HobGuid HOB is NULL, then fall back to an older way of collecting CPU information from the MP services library. Cc: Ray Ni <mailto:ray...@intel.com> Cc: Laszlo Ersek <mailto:ler...@redhat.com> Cc: Rahul Kumar <mailto:rahul1.ku...@intel.com> Cc: Gerd Hoffmann <mailto:kra...@redhat.com> Signed-off-by: Abdul Lateef Attar <mailto:abdullateef.at...@amd.com> --- UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c | 87 +++- UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf | 3 +- 2 files changed, 87 insertions(+), 3 deletions(-) diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c index 499f979d34..74e494f332 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c @@ -3,7 +3,7 @@ Agent Module to load other modules to deploy SMM Entry Vector for X86 CPU. Copyright (c) 2009 - 2023, Intel Corporation. All rights reserved. Copyright (c) 2017, AMD Incorporated. All rights reserved. -Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved. +Copyright (C) 2023 - 2024 Advanced Micro Devices, Inc. All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent @@ -750,6 +750,85 @@ MpInformation2HobCompare ( return 0; } +/** + Extract NumberOfCpus, MaxNumberOfCpus and EFI_PROCESSOR_INFORMATION for all CPU from gEfiMpServiceProtocolGuid. + + @param[out] NumberOfCpus Pointer to NumberOfCpus. + @param[out] MaxNumberOfCpusPointer to MaxNumberOfCpus. + + @retval ProcessorInfo Pointer to EFI_PROCESSOR_INFORMATION buffer. +**/ +EFI_PROCESSOR_INFORMATION * +GetMpInformationFromMpServices ( + OUT UINTN *NumberOfCpus, + OUT UINTN *MaxNumberOfCpus + ) +{ + EFI_STATUS Status; + UINTN Index; + UINTN NumberOfEnabledProcessors; + UINTN NumberOfProcessors; + EFI_MP_SERVICES_PROTOCOL *MpService; + EFI_PROCESSOR_INFORMATION *ProcessorInfo; + + if ((NumberOfCpus == NULL) || (MaxNumberOfCpus == NULL)) { +ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER); +return NULL; + } + + ProcessorInfo= NULL; + *NumberOfCpus= 0; + *MaxNumberOfCpus = 0; + + /// Get the MP Services Protocol + Status = gBS->LocateProtocol (, NULL, (VOID **)); + if (EFI_ERROR (Status)) { +ASSERT_EFI_ERROR (Status); +return NULL; + } + + /// Get the number of processors + Status = MpService->GetNumberOfProcessors (MpService, , ); + if (EFI_ERROR (Status)) { +ASSERT_EFI_ERROR (Status); +return NULL; + } + + ASSERT (NumberOfProcessors <= PcdGet32 (PcdCpuMaxLogicalProcessorNumber)); + + /// Allocate buffer for processor information + ProcessorInfo = AllocateZeroPool (sizeof (EFI_PROCESSOR_INFORMATION) * NumberOfProcessors); + if (ProcessorInfo == NULL) { +ASSERT_EFI_ERROR (EFI_OUT_OF_RESOURCES); +return NULL; + } + + /// Get processor information + for (Index = 0; Index < NumberOfProcessors; Index++) { +Status = MpService->GetProcessorInfo (MpService, Index | CPU_V2_EXTENDED_TOPOLOGY, [Index]); +if (EFI_ERROR (Status)) { + FreePool (ProcessorInfo); + DEBUG ((DEBUG_ERROR, "%a: Failed to get processor information for processor %d\n", __func__, Index)); + ASSERT_EFI_ERROR (Status); + return NULL; +} + } + + *NumberOfCpus = NumberOfEnabledProcessors; + + ASSERT (*NumberOfCpus <= PcdGet32 (PcdCpuMaxLogicalProcessorNumber)); + // + // If support CPU hot plug, we need to allocate resources for possibly
Re: [edk2-devel] [PATCH v4 00/14] Add SmmRelocationLib
Jiaxin, You need to add the missing Reviewed-by for each patch if the patch doesn't change in V4. Can you reply to this mail to list what patches have already got Reviewed-by from whom? Thanks, Ray From: Wu, Jiaxin Sent: Friday, April 26, 2024 20:17 To: devel@edk2.groups.io Cc: Ni, Ray ; Zeng, Star ; Gerd Hoffmann ; Kumar, Rahul R ; Dong, Guo ; Rhodes, Sean ; Lu, James ; Guo, Gua ; Ard Biesheuvel ; Yao, Jiewen ; Abdul Lateef Attar ; Abner Chang ; Tom Lendacky Subject: [PATCH v4 00/14] Add SmmRelocationLib PR: https://github.com/tianocore/edk2/pull/5546 Intel plans to separate the smbase relocation logic from PiSmmCpuDxeSmm driver, and the related behavior will be moved to the new interface defined by the SmmRelocationLib class. The SmmRelocationLib class provides the SmmRelocationInit() interface for platform to do the smbase relocation, which shall provide below 2 functionalities: 1. Relocate smbases for each processor. 2. Create the gSmmBaseHobGuid HOB. With SmmRelocationLib, PiSmmCpuDxeSmm driver (which runs at a later phase) can be simplfied as below for SMM init: 1. Consume the gSmmBaseHobGuid HOB for the relocated smbases for each Processor. 2. Execute the early SMM Init. Cc: Ray Ni Cc: Zeng Star Cc: Gerd Hoffmann Cc: Rahul Kumar Cc: Guo Dong Cc: Sean Rhodes Cc: James Lu Cc: Gua Guo Cc: Ard Biesheuvel Cc: Jiewen Yao Cc: Abdul Lateef Attar Cc: Abner Chang Cc: Tom Lendacky Signed-off-by: Jiaxin Wu Jiaxin Wu (14): UefiCpuPkg: Add SmmRelocationLib class UefiCpuPkg/SmmRelocationLib: Add SmmRelocationLib library instance UefiCpuPkg/SmmRelocationLib: Rename global variables UefiCpuPkg/SmmRelocationLib: Avoid unnecessary memory allocation UefiCpuPkg/SmmRelocationLib: Remove unnecessary global variable UefiCpuPkg/SmmRelocationLib: Remove unnecessary CpuIndex UefiCpuPkg/SmmRelocationLib: Add library instance for AMD OvmfPkg/SmmRelocationLib: Add library instance for OVMF OvmfPkg/PlatformInitLib: Create gEfiSmmSmramMemoryGuid OvmfPkg: Refine SmmAccess implementation OvmfPkg/SmmCpuFeaturesLib: Check Smbase Relocation is done or not OvmfPkg/PlatformPei: Relocate SmBases in PEI phase UefiPayloadPkg/UefiPayloadPkg.dsc: Include SmmRelocationLib UefiCpuPkg/PiSmmCpuDxeSmm: Remove SmBases relocation logic OvmfPkg/AmdSev/AmdSevX64.dsc | 1 + OvmfPkg/CloudHv/CloudHvX64.dsc | 1 + OvmfPkg/Library/PlatformInitLib/MemDetect.c| 135 +++-- .../Library/PlatformInitLib/PlatformInitLib.inf| 6 +- .../Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c | 33 +- .../Library/SmmRelocationLib}/Ia32/Semaphore.c | 13 +- .../Library/SmmRelocationLib}/Ia32/SmmInit.nasm| 83 +++- .../SmmRelocationLib/InternalSmmRelocationLib.h| 127 + .../Library/SmmRelocationLib/SmmRelocationLib.c| 549 + .../Library/SmmRelocationLib/SmmRelocationLib.inf | 60 +++ .../SmmRelocationLib/SmramSaveStateConfig.c| 100 .../Library/SmmRelocationLib}/X64/Semaphore.c | 13 +- .../Library/SmmRelocationLib}/X64/SmmInit.nasm | 85 +++- OvmfPkg/Microvm/MicrovmX64.dsc | 1 + OvmfPkg/OvmfPkgIa32.dsc| 1 + OvmfPkg/OvmfPkgIa32X64.dsc | 1 + OvmfPkg/OvmfPkgX64.dsc | 1 + OvmfPkg/PlatformPei/Platform.c | 3 + OvmfPkg/PlatformPei/Platform.h | 5 + OvmfPkg/PlatformPei/PlatformPei.inf| 5 +- OvmfPkg/PlatformPei/SmmRelocation.c| 80 +++ OvmfPkg/SmmAccess/SmmAccess2Dxe.c | 4 +- OvmfPkg/SmmAccess/SmmAccess2Dxe.inf| 5 + OvmfPkg/SmmAccess/SmmAccessPei.c | 116 ++--- OvmfPkg/SmmAccess/SmmAccessPei.inf | 11 +- OvmfPkg/SmmAccess/SmramInternal.c | 72 +-- OvmfPkg/SmmAccess/SmramInternal.h | 19 +- UefiCpuPkg/Include/Library/SmmRelocationLib.h | 42 ++ .../SmmRelocationLib/AmdSmmRelocationLib.inf | 60 +++ .../SmmRelocationLib/AmdSmramSaveStateConfig.c | 125 + .../SmmRelocationLib}/Ia32/Semaphore.c | 13 +- .../SmmRelocationLib}/Ia32/SmmInit.nasm| 83 +++- .../SmmRelocationLib/InternalSmmRelocationLib.h| 127 + .../Library/SmmRelocationLib/SmmRelocationLib.c| 549 + .../Library/SmmRelocationLib/SmmRelocationLib.inf | 61 +++ .../SmmRelocationLib/SmramSaveStateConfig.c| 136 + .../SmmRelocationLib}/X64/Semaphore.c | 13 +- .../SmmRelocationLib}/X64/SmmInit.nasm | 85 +++- UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c | 21 +- UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c | 10 +- UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c | 334 ++--- UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h | 103 +--- UefiCpuPkg/PiSmmCpuDxeSmm
Re: [edk2-devel] [PATCH v4 02/14] UefiCpuPkg/SmmRelocationLib: Add SmmRelocationLib library instance
I've given Reviewed-by for the v3 version. What extra changes did you make so that you need me to review it again? Thanks, Ray From: Wu, Jiaxin Sent: Friday, April 26, 2024 20:17 To: devel@edk2.groups.io Cc: Ni, Ray ; Zeng, Star ; Gerd Hoffmann ; Kumar, Rahul R Subject: [PATCH v4 02/14] UefiCpuPkg/SmmRelocationLib: Add SmmRelocationLib library instance This patch just separates the smbase relocation logic from PiSmmCpuDxeSmm driver, and moves to the SmmRelocationInit interface. It maintains the original implementation of most functions and leaves the definitions of global variables intact. Further refinements to the code are planned for subsequent patches. Platform shall consume the interface for the smbase relocation if need SMM support. Note: Before using SmmRelocationLib, the PiSmmCpuDxeSmm driver allocates the SMRAM to be used for SMI handler and Save state area of each processor from Smst->AllocatePages(). With SmmRelocationLib, the SMRAM allocation for SMI handlers and Save state areas is moved to early PEI phase (Smst->AllocatePages() service is not available). So, the allocation is done by splitting the SMRAM out of the SMRAM regions reported from gEfiSmmSMramMemoryGuid. So, Platform must produce the gEfiSmmSMramMemoryGuid HOB for SmmRelocationLib usage. Cc: Ray Ni Cc: Zeng Star Cc: Gerd Hoffmann Cc: Rahul Kumar Signed-off-by: Jiaxin Wu --- .../SmmRelocationLib}/Ia32/Semaphore.c | 10 +- .../SmmRelocationLib}/Ia32/SmmInit.nasm| 67 ++- .../SmmRelocationLib/InternalSmmRelocationLib.h| 132 + .../Library/SmmRelocationLib/SmmRelocationLib.c| 600 + .../Library/SmmRelocationLib/SmmRelocationLib.inf | 61 +++ .../SmmRelocationLib/SmramSaveStateConfig.c| 139 + .../SmmRelocationLib}/X64/Semaphore.c | 10 +- .../SmmRelocationLib}/X64/SmmInit.nasm | 69 ++- UefiCpuPkg/UefiCpuPkg.dsc | 1 + 9 files changed, 1066 insertions(+), 23 deletions(-) copy UefiCpuPkg/{PiSmmCpuDxeSmm => Library/SmmRelocationLib}/Ia32/Semaphore.c (79%) copy UefiCpuPkg/{PiSmmCpuDxeSmm => Library/SmmRelocationLib}/Ia32/SmmInit.nasm (53%) create mode 100644 UefiCpuPkg/Library/SmmRelocationLib/InternalSmmRelocationLib.h create mode 100644 UefiCpuPkg/Library/SmmRelocationLib/SmmRelocationLib.c create mode 100644 UefiCpuPkg/Library/SmmRelocationLib/SmmRelocationLib.inf create mode 100644 UefiCpuPkg/Library/SmmRelocationLib/SmramSaveStateConfig.c copy UefiCpuPkg/{PiSmmCpuDxeSmm => Library/SmmRelocationLib}/X64/Semaphore.c (84%) copy UefiCpuPkg/{PiSmmCpuDxeSmm => Library/SmmRelocationLib}/X64/SmmInit.nasm (64%) diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/Semaphore.c b/UefiCpuPkg/Library/SmmRelocationLib/Ia32/Semaphore.c similarity index 79% copy from UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/Semaphore.c copy to UefiCpuPkg/Library/SmmRelocationLib/Ia32/Semaphore.c index a9fcc89dda..ba329d6ba2 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/Semaphore.c +++ b/UefiCpuPkg/Library/SmmRelocationLib/Ia32/Semaphore.c @@ -1,15 +1,15 @@ /** @file -Semaphore mechanism to indicate to the BSP that an AP has exited SMM -after SMBASE relocation. + Semaphore mechanism to indicate to the BSP that an AP has exited SMM + after SMBASE relocation. -Copyright (c) 2009 - 2015, Intel Corporation. All rights reserved. -SPDX-License-Identifier: BSD-2-Clause-Patent + Copyright (c) 2024, Intel Corporation. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent **/ -#include "PiSmmCpuDxeSmm.h" +#include "InternalSmmRelocationLib.h" UINTN mSmmRelocationOriginalAddress; volatile BOOLEAN *mRebasedFlag; /** diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmmInit.nasm b/UefiCpuPkg/Library/SmmRelocationLib/Ia32/SmmInit.nasm similarity index 53% copy from UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmmInit.nasm copy to UefiCpuPkg/Library/SmmRelocationLib/Ia32/SmmInit.nasm index b5e77a1a5b..3d845e9e16 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmmInit.nasm +++ b/UefiCpuPkg/Library/SmmRelocationLib/Ia32/SmmInit.nasm @@ -1,7 +1,7 @@ ;-- ; -; Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved. +; Copyright (c) 2024, Intel Corporation. All rights reserved. ; SPDX-License-Identifier: BSD-2-Clause-Patent ; ; Module Name: ; ; SmmInit.nasm @@ -27,15 +27,70 @@ global ASM_PFX(gcSmmInitSize) global ASM_PFX(gcSmmInitTemplate) %define PROTECT_MODE_CS 0x8 %define PROTECT_MODE_DS 0x20 -SECTION .text +SECTION .data -ASM_PFX(gcSmiInitGdtr): +NullSeg: DQ 0 ; reserved by architecture +CodeSeg32: +DW -1 ; LimitLow +DW 0 ; BaseLow +DB 0 ; BaseMid +DB 0x9b +DB 0xcf
Re: [edk2-devel] [Patch V2 1/1] UefiCpuPkg/SmmCpuSyncLib: Add MM_STANDALONE tag.
Reviewed-by: Ray Ni Thanks, Ray From: Xie, Yuanhao Sent: Monday, April 29, 2024 8:03 To: devel@edk2.groups.io Cc: Xie, Yuanhao ; Dong, Eric ; Ni, Ray ; Kumar, Rahul R ; Gerd Hoffmann ; Wu, Jiaxin Subject: [Patch V2 1/1] UefiCpuPkg/SmmCpuSyncLib: Add MM_STANDALONE tag. Declares in the .inf file that the current component is an MM_STANDALONE Signed-off-by: Yuanhao Xie Cc: Eric Dong Cc: Ray Ni Cc: Rahul Kumar Cc: Gerd Hoffmann Cc: Jiaxin Wu Reviewed-by: Jiaxin Wu --- UefiCpuPkg/Library/SmmCpuSyncLib/SmmCpuSyncLib.inf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/UefiCpuPkg/Library/SmmCpuSyncLib/SmmCpuSyncLib.inf b/UefiCpuPkg/Library/SmmCpuSyncLib/SmmCpuSyncLib.inf index 6b0d49c30a..2199b7948d 100644 --- a/UefiCpuPkg/Library/SmmCpuSyncLib/SmmCpuSyncLib.inf +++ b/UefiCpuPkg/Library/SmmCpuSyncLib/SmmCpuSyncLib.inf @@ -3,7 +3,7 @@ # # This is SMM CPU Synchronization lib used for SMM CPU sync operations. # -# Copyright (c) 2023, Intel Corporation. All rights reserved. +# Copyright (c) 2023 - 2024, Intel Corporation. All rights reserved. # SPDX-License-Identifier: BSD-2-Clause-Patent # ## @@ -13,7 +13,7 @@ BASE_NAME = SmmCpuSyncLib FILE_GUID = 1ca1bc1a-16a4-46ef-956a-ca500fd3381f MODULE_TYPE= DXE_SMM_DRIVER - LIBRARY_CLASS = SmmCpuSyncLib|DXE_SMM_DRIVER + LIBRARY_CLASS = SmmCpuSyncLib|DXE_SMM_DRIVER MM_STANDALONE [Sources] SmmCpuSyncLib.c -- 2.39.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118413): https://edk2.groups.io/g/devel/message/118413 Mute This Topic: https://groups.io/mt/105792384/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH] UefiCpuPkg/PiSmmCpuDxeSmm: Handle the NULL gMpInformation2HobGuid
Abdul, Does Amd PEI include the CpuMpPeim? If it includes the PEIM, the MpInformation2Hob should be in the HOB database. Thanks, Ray From: Abdul Lateef Attar Sent: Monday, April 29, 2024 19:17 To: devel@edk2.groups.io Cc: Abdul Lateef Attar ; Ni, Ray ; Laszlo Ersek ; Kumar, Rahul R ; Gerd Hoffmann Subject: [PATCH] UefiCpuPkg/PiSmmCpuDxeSmm: Handle the NULL gMpInformation2HobGuid If gMpInformation2HobGuid HOB is NULL, then fall back to an older way of collecting CPU information from the MP services library. Cc: Ray Ni Cc: Laszlo Ersek Cc: Rahul Kumar Cc: Gerd Hoffmann Signed-off-by: Abdul Lateef Attar --- UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c | 87 +++- UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf | 3 +- 2 files changed, 87 insertions(+), 3 deletions(-) diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c index 499f979d34..74e494f332 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c @@ -3,7 +3,7 @@ Agent Module to load other modules to deploy SMM Entry Vector for X86 CPU. Copyright (c) 2009 - 2023, Intel Corporation. All rights reserved. Copyright (c) 2017, AMD Incorporated. All rights reserved. -Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved. +Copyright (C) 2023 - 2024 Advanced Micro Devices, Inc. All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent @@ -750,6 +750,85 @@ MpInformation2HobCompare ( return 0; } +/** + Extract NumberOfCpus, MaxNumberOfCpus and EFI_PROCESSOR_INFORMATION for all CPU from gEfiMpServiceProtocolGuid. + + @param[out] NumberOfCpus Pointer to NumberOfCpus. + @param[out] MaxNumberOfCpusPointer to MaxNumberOfCpus. + + @retval ProcessorInfo Pointer to EFI_PROCESSOR_INFORMATION buffer. +**/ +EFI_PROCESSOR_INFORMATION * +GetMpInformationFromMpServices ( + OUT UINTN *NumberOfCpus, + OUT UINTN *MaxNumberOfCpus + ) +{ + EFI_STATUS Status; + UINTN Index; + UINTN NumberOfEnabledProcessors; + UINTN NumberOfProcessors; + EFI_MP_SERVICES_PROTOCOL *MpService; + EFI_PROCESSOR_INFORMATION *ProcessorInfo; + + if ((NumberOfCpus == NULL) || (MaxNumberOfCpus == NULL)) { +ASSERT_EFI_ERROR (EFI_INVALID_PARAMETER); +return NULL; + } + + ProcessorInfo= NULL; + *NumberOfCpus= 0; + *MaxNumberOfCpus = 0; + + /// Get the MP Services Protocol + Status = gBS->LocateProtocol (, NULL, (VOID **)); + if (EFI_ERROR (Status)) { +ASSERT_EFI_ERROR (Status); +return NULL; + } + + /// Get the number of processors + Status = MpService->GetNumberOfProcessors (MpService, , ); + if (EFI_ERROR (Status)) { +ASSERT_EFI_ERROR (Status); +return NULL; + } + + ASSERT (NumberOfProcessors <= PcdGet32 (PcdCpuMaxLogicalProcessorNumber)); + + /// Allocate buffer for processor information + ProcessorInfo = AllocateZeroPool (sizeof (EFI_PROCESSOR_INFORMATION) * NumberOfProcessors); + if (ProcessorInfo == NULL) { +ASSERT_EFI_ERROR (EFI_OUT_OF_RESOURCES); +return NULL; + } + + /// Get processor information + for (Index = 0; Index < NumberOfProcessors; Index++) { +Status = MpService->GetProcessorInfo (MpService, Index | CPU_V2_EXTENDED_TOPOLOGY, [Index]); +if (EFI_ERROR (Status)) { + FreePool (ProcessorInfo); + DEBUG ((DEBUG_ERROR, "%a: Failed to get processor information for processor %d\n", __func__, Index)); + ASSERT_EFI_ERROR (Status); + return NULL; +} + } + + *NumberOfCpus = NumberOfEnabledProcessors; + + 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; + } + + return ProcessorInfo; +} + /** Extract NumberOfCpus, MaxNumberOfCpus and EFI_PROCESSOR_INFORMATION for all CPU from MpInformation2 HOB. @@ -784,7 +863,11 @@ GetMpInformation ( HobCount = 0; FirstMpInfo2Hob = GetFirstGuidHob (); - ASSERT (FirstMpInfo2Hob != NULL); + if (FirstMpInfo2Hob == NULL) { +DEBUG ((DEBUG_INFO, "%a: [INFO] gMpInformation2HobGuid HOB not found.\n", __func__)); +return GetMpInformationFromMpServices (NumberOfCpus, MaxNumberOfCpus); + } + GuidHob = FirstMpInfo2Hob; while (GuidHob != NULL) { MpInformation2HobData = GET_GUID_HOB_DATA (GuidHob); diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf index a018954ed7..db99a63c5a 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf @@ -6,7 +6,7 @@ # # Copyright (c) 2009 - 2023,
Re: [edk2-devel] [PATCH v2] MdePkg: Add MmUnblockMemoryLib to MdeLibs.dsc
Reviewed-by: Ray Ni Thanks, Ray From: Zhang, Hongbin1 Sent: Monday, April 29, 2024 14:24 To: devel@edk2.groups.io Cc: Zhang, Hongbin1 ; Kinney, Michael D ; Ni, Ray ; Liming Gao ; Liu, Zhiguang ; Wu, Jiaxin ; Xie, Yuanhao Subject: [PATCH v2] MdePkg: Add MmUnblockMemoryLib to MdeLibs.dsc MdeLibs.dsc.inc included some default libraries provided by MdePkg. Platform can include MdeLibs.dsc.inc file to avoid some potential incompatible changes to platform dsc file in future. Cc: Michael D Kinney Cc: Ray Ni Cc: Liming Gao Cc: Zhiguang Liu Cc: Jiaxin Wu Cc: Yuanhao Xie --- MdePkg/MdeLibs.dsc.inc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MdePkg/MdeLibs.dsc.inc b/MdePkg/MdeLibs.dsc.inc index d782dbf4ff..ddd27115f5 100644 --- a/MdePkg/MdeLibs.dsc.inc +++ b/MdePkg/MdeLibs.dsc.inc @@ -5,7 +5,7 @@ # by using "!include MdePkg/MdeLibs.dsc.inc" to specify the library instances # of some EDKII basic/common library classes. # -# Copyright (c) 2021 - 2022, Intel Corporation. All rights reserved. +# Copyright (c) 2021 - 2024, Intel Corporation. All rights reserved. # #SPDX-License-Identifier: BSD-2-Clause-Patent # @@ -18,3 +18,4 @@ SmmCpuRendezvousLib|MdePkg/Library/SmmCpuRendezvousLibNull/SmmCpuRendezvousLibNull.inf SafeIntLib|MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf SynchronizationLib|MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.inf + MmUnblockMemoryLib|MdePkg/Library/MmUnblockMemoryLib/MmUnblockMemoryLibNull.inf -- 2.37.0.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118408): https://edk2.groups.io/g/devel/message/118408 Mute This Topic: https://groups.io/mt/105796510/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH v1] Maintainers.txt: Update StandaloneMmPkg and UefiCpuPkg Reviewer
Reviewed-by: Ray Ni Thanks, Ray From: Wu, Jiaxin Sent: Monday, April 29, 2024 13:32 To: devel@edk2.groups.io Cc: Ni, Ray ; Ard Biesheuvel ; Sami Mujawar ; Kumar, Rahul R ; Gerd Hoffmann Subject: [PATCH v1] Maintainers.txt: Update StandaloneMmPkg and UefiCpuPkg Reviewer This is to update StandaloneMmPkg and UefiCpuPkg Reviewer. Cc: Ray Ni Cc: Ard Biesheuvel Cc: Sami Mujawar Cc: Rahul Kumar Cc: Gerd Hoffmann Signed-off-by: Jiaxin Wu --- Maintainers.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Maintainers.txt b/Maintainers.txt index 7d9cdca611..6fccbb6788 100644 --- a/Maintainers.txt +++ b/Maintainers.txt @@ -624,17 +624,19 @@ W: https://github.com/tianocore/tianocore.github.io/wiki/SourceLevelDebugPkg StandaloneMmPkg F: StandaloneMmPkg/ M: Ard Biesheuvel [ardbiesheuvel] M: Sami Mujawar [samimujawar] M: Ray Ni [niruiyu] +R: Jiaxin Wu [jiaxinwu] UefiCpuPkg F: UefiCpuPkg/ W: https://github.com/tianocore/tianocore.github.io/wiki/UefiCpuPkg M: Ray Ni [niruiyu] R: Rahul Kumar [rahul1-kumar] R: Gerd Hoffmann [kraxel] +R: Jiaxin Wu [jiaxinwu] UefiCpuPkg: Sec related modules F: UefiCpuPkg/SecCore/ F: UefiCpuPkg/ResetVector/ R: Catharine West [catharine-intl] -- 2.16.2.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118407): https://edk2.groups.io/g/devel/message/118407 Mute This Topic: https://groups.io/mt/105795833/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH v1] UefiCpuPkg/Library: Cleanup debug message in LmceSupport
Reviewed-by: Ray Ni Thanks, Ray From: Wu, Jiaxin Sent: Monday, April 29, 2024 13:31 To: devel@edk2.groups.io Cc: Ni, Ray ; Zeng, Star ; Gerd Hoffmann ; Kumar, Rahul R Subject: [PATCH v1] UefiCpuPkg/Library: Cleanup debug message in LmceSupport ProcessorNumber 0 is not always BSP. Debug message based on 0 of ProcessorNumber is incorrect. This patch is to clean the debug message in LmceSupport directly. Cc: Ray Ni Cc: Zeng Star Cc: Gerd Hoffmann Cc: Rahul Kumar Signed-off-by: Jiaxin Wu --- UefiCpuPkg/Library/CpuCommonFeaturesLib/MachineCheck.c | 5 + 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/UefiCpuPkg/Library/CpuCommonFeaturesLib/MachineCheck.c b/UefiCpuPkg/Library/CpuCommonFeaturesLib/MachineCheck.c index d8b070d9f1..cb569769a1 100644 --- a/UefiCpuPkg/Library/CpuCommonFeaturesLib/MachineCheck.c +++ b/UefiCpuPkg/Library/CpuCommonFeaturesLib/MachineCheck.c @@ -1,9 +1,9 @@ /** @file Machine Check features. - Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved. + Copyright (c) 2017 - 2024, Intel Corporation. All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include "CpuCommonFeatures.h" @@ -287,13 +287,10 @@ LmceSupport ( if (!McaSupport (ProcessorNumber, CpuInfo, ConfigData)) { return FALSE; } McgCap.Uint64 = AsmReadMsr64 (MSR_IA32_MCG_CAP); - if (ProcessorNumber == 0) { -DEBUG ((DEBUG_INFO, "LMCE enable = %x\n", (BOOLEAN)(McgCap.Bits.MCG_LMCE_P != 0))); - } return (BOOLEAN)(McgCap.Bits.MCG_LMCE_P != 0); } /** -- 2.16.2.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118406): https://edk2.groups.io/g/devel/message/118406 Mute This Topic: https://groups.io/mt/105795776/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH v1] UefiCpuPkg/Library: Support to get processor extended info
Reviewed-by: Ray Ni Thanks, Ray From: Wu, Jiaxin Sent: Tuesday, April 30, 2024 11:33 To: devel@edk2.groups.io Cc: Ni, Ray ; Zeng, Star ; Gerd Hoffmann ; Kumar, Rahul R Subject: [PATCH v1] UefiCpuPkg/Library: Support to get processor extended info Intel has some features need to use processor extended information under CPU feature InitializeFunc(), so add code to support it: This patch is to add CPU_V2_EXTENDED_TOPOLOGY to get processor extended info. Cc: Ray Ni Cc: Zeng Star Cc: Gerd Hoffmann Cc: Rahul Kumar Signed-off-by: Jiaxin Wu --- UefiCpuPkg/Library/RegisterCpuFeaturesLib/DxeRegisterCpuFeaturesLib.c | 4 ++-- UefiCpuPkg/Library/RegisterCpuFeaturesLib/PeiRegisterCpuFeaturesLib.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/DxeRegisterCpuFeaturesLib.c b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/DxeRegisterCpuFeaturesLib.c index e635cade5d..d799b7f5d1 100644 --- a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/DxeRegisterCpuFeaturesLib.c +++ b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/DxeRegisterCpuFeaturesLib.c @@ -1,9 +1,9 @@ /** @file CPU Register Table Library functions. - Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved. + Copyright (c) 2017 - 2024, Intel Corporation. All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include @@ -99,11 +99,11 @@ GetProcessorInformation ( CpuFeaturesData = GetCpuFeaturesData (); MpServices = CpuFeaturesData->MpService.Protocol; Status = MpServices->GetProcessorInfo ( MpServices, - ProcessorNumber, + ProcessorNumber | CPU_V2_EXTENDED_TOPOLOGY, ProcessorInfoBuffer ); return Status; } diff --git a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/PeiRegisterCpuFeaturesLib.c b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/PeiRegisterCpuFeaturesLib.c index d4c528b3e9..1db6adc280 100644 --- a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/PeiRegisterCpuFeaturesLib.c +++ b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/PeiRegisterCpuFeaturesLib.c @@ -1,9 +1,9 @@ /** @file CPU Register Table Library functions. - Copyright (c) 2016 - 2020, Intel Corporation. All rights reserved. + Copyright (c) 2016 - 2024, Intel Corporation. All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include @@ -137,11 +137,11 @@ GetProcessorInformation ( CpuFeaturesData = GetCpuFeaturesData (); CpuMp2Ppi = CpuFeaturesData->MpService.Ppi; Status = CpuMp2Ppi->GetProcessorInfo ( CpuMp2Ppi, -ProcessorNumber, +ProcessorNumber | CPU_V2_EXTENDED_TOPOLOGY, ProcessorInfoBuffer ); return Status; } -- 2.16.2.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118405): https://edk2.groups.io/g/devel/message/118405 Mute This Topic: https://groups.io/mt/105815222/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH v3 00/13] Add SmmRelocationLib
Thanks, Ray From: Gerd Hoffmann Sent: Thursday, April 25, 2024 14:58 To: Ni, Ray Cc: Wu, Jiaxin ; devel@edk2.groups.io ; Zeng, Star ; Kumar, Rahul R ; Dong, Guo ; Rhodes, Sean ; Lu, James ; Guo, Gua ; Ard Biesheuvel ; Yao, Jiewen ; Abdul Lateef Attar ; Abner Chang ; Tom Lendacky Subject: Re: [edk2-devel] [PATCH v3 00/13] Add SmmRelocationLib Hi, > That means the SMMRevId is 0_xx64h for AMD64 processor. But I am not > sure what the value is for AMD32 processor. Maybe 0 according to the > OVMF logic. The smm emulation in the linux kernel uses 0 and 0x64. [Ray] OK. that supports the OVMF instance's logic. But I'd like Tom or any other AMD guys to provide spec that says 0 for AMD32. > But, I am very suspicious about the logic in AMD's version as below: > --- AMD's version > SmmSaveStateRegisterLma = (UINT8)EFI_MM_SAVE_STATE_REGISTER_LMA_32BIT; > > LMAValue = (UINT32)AsmReadMsr64 (EFER_ADDRESS) & LMA; > if (LMAValue) { > SmmSaveStateRegisterLma = (UINT8)EFI_MM_SAVE_STATE_REGISTER_LMA_64BIT; > } > --- > The above logic detects the current CPU mode and 64bit save state area layout > is used if it's running in 64bit. > But if a AMD64 CPU runs in 32bit mode, the above logic causes the > 32bit save state area layout is used. It's not right! The save state > area layout does not depend on the CPU running mode, but whether it's > a legacy CPU or a 64-capable CPU. Well, that is not entirely clear to me. Could it be 64-bit processors support both 32-bit and 64-bit format, for backward compatibility reasons? [Ray] The CPU uses a fixed save state area layout no matter it runs in 32bit or 64bit. The 64bit cpu only uses the 64bit format, no matter it runs in 32bit or 64bit. So OvmfPkgIa32 builds could use the 32-bit format, OvmfPkgX64 builds use the 64-bit format, everything works fine? [Ray] For OVMF, it depends on how the virtual cpu is defined by QEMU implementation. If the underline CPU is a AMD64 cpu, the CPU supports running in 32bit or 64bit modes. But no matter it runs in 32bit or 64bit, the save state area layout always follows the 64bit format. The tricky corner case is OvmfPkgIa32X64, where (after applying this series) 32-bit PEI should setup things for 64-bit SMM/DXE, and checking the current processor mode will not give use the result we need. > Jiaxin, I agree that the confusion should be cleaned up by AMD > experts. Let's not change any existing behavior. Agree. Tom? take care, Gerd -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118310): https://edk2.groups.io/g/devel/message/118310 Mute This Topic: https://groups.io/mt/105593568/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH 1/1] UefiCpuPkg/SmmCpuSyncLib: Add MM_STANDALONE tag.
-# Copyright (c) 2023, Intel Corporation. All rights reserved. +# Copyright (c) 2024, Intel Corporation. All rights reserved. Yuanhao, why did you change the copyright year from 2023 to 2024? You can either leave it unchanged, or change it to "2023 - 2024". # SPDX-License-Identifier: BSD-2-Clause-Patent # ## @@ -13,7 +13,7 @@ BASE_NAME = SmmCpuSyncLib FILE_GUID = 1ca1bc1a-16a4-46ef-956a-ca500fd3381f MODULE_TYPE= DXE_SMM_DRIVER - LIBRARY_CLASS = SmmCpuSyncLib|DXE_SMM_DRIVER + LIBRARY_CLASS = SmmCpuSyncLib|DXE_SMM_DRIVER MM_STANDALONE [Sources] SmmCpuSyncLib.c -- 2.39.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118269): https://edk2.groups.io/g/devel/message/118269 Mute This Topic: https://groups.io/mt/105685282/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH 2/2] StandaloneMmPkg: Initialize 'WillReturn' variable
Reviewed-by: Ray Ni Thanks, Ray From: Liu, Zhiguang Sent: Thursday, April 25, 2024 12:40 To: devel@edk2.groups.io Cc: Liu, Zhiguang ; Liming Gao ; Wu, Jiaxin ; Ni, Ray ; Laszlo Ersek ; Ard Biesheuvel ; Sami Mujawar Subject: [PATCH 2/2] StandaloneMmPkg: Initialize 'WillReturn' variable The local variable 'WillReturn' was being used without prior initialization in some code paths. This patch ensures that 'WillReturn' is properly initialized to prevent undefined behavior. Cc: Liming Gao Cc: Jiaxin Wu Cc: Ray Ni Cc: Laszlo Ersek Cc: Ard Biesheuvel Cc: Sami Mujawar Signed-off-by: Zhiguang Liu --- StandaloneMmPkg/Core/Mmi.c | 1 + 1 file changed, 1 insertion(+) diff --git a/StandaloneMmPkg/Core/Mmi.c b/StandaloneMmPkg/Core/Mmi.c index e035245c87..fb205df490 100644 --- a/StandaloneMmPkg/Core/Mmi.c +++ b/StandaloneMmPkg/Core/Mmi.c @@ -174,6 +174,7 @@ MmiManage ( EFI_STATUS Status; mMmiManageCallingDepth++; + WillReturn = FALSE; Status = EFI_NOT_FOUND; ReturnStatus = Status; if (HandlerType == NULL) { -- 2.31.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118268): https://edk2.groups.io/g/devel/message/118268 Mute This Topic: https://groups.io/mt/105725160/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH 1/2] MdeModulePkg/SMM: Initialize 'WillReturn' variable
Reviewed-by: Ray Ni Thanks, Ray From: Liu, Zhiguang Sent: Thursday, April 25, 2024 12:40 To: devel@edk2.groups.io Cc: Liu, Zhiguang ; Liming Gao ; Wu, Jiaxin ; Ni, Ray ; Laszlo Ersek Subject: [PATCH 1/2] MdeModulePkg/SMM: Initialize 'WillReturn' variable The local variable 'WillReturn' was being used without prior initialization in some code paths. This patch ensures that 'WillReturn' is properly initialized to prevent undefined behavior. Cc: Liming Gao Cc: Jiaxin Wu Cc: Ray Ni Cc: Laszlo Ersek Signed-off-by: Zhiguang Liu --- MdeModulePkg/Core/PiSmmCore/Smi.c | 1 + 1 file changed, 1 insertion(+) diff --git a/MdeModulePkg/Core/PiSmmCore/Smi.c b/MdeModulePkg/Core/PiSmmCore/Smi.c index a84a1f48d3..6b56fa5f69 100644 --- a/MdeModulePkg/Core/PiSmmCore/Smi.c +++ b/MdeModulePkg/Core/PiSmmCore/Smi.c @@ -152,6 +152,7 @@ SmiManage ( PERF_FUNCTION_BEGIN (); mSmiManageCallingDepth++; + WillReturn = FALSE; Status = EFI_NOT_FOUND; ReturnStatus = Status; if (HandlerType == NULL) { -- 2.31.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118267): https://edk2.groups.io/g/devel/message/118267 Mute This Topic: https://groups.io/mt/105725159/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH v3 00/13] Add SmmRelocationLib
I checked the AMD64 Architecture Programmer's Manual and it says below: --- AMD64 manual --- SMM-revision Level—Bits 15:0. Specifies the version of SMM supported by the processor. The SMM-revision level is of the form 0_xx64h, where xx starts with 00 and is incremented for later revisions to the SMM mechanism. --- That means the SMMRevId is 0_xx64h for AMD64 processor. But I am not sure what the value is for AMD32 processor. Maybe 0 according to the OVMF logic. --- OVMF's logic --- AMD_SMRAM_SAVE_STATE_MAP *CpuSaveState; CpuSaveState = (AMD_SMRAM_SAVE_STATE_MAP *)(UINTN)(SMM_DEFAULT_SMBASE + SMRAM_SAVE_STATE_MAP_OFFSET); if ((CpuSaveState->x86.SMMRevId & 0x) == 0) { CpuSaveState->x86.SMBASE = (UINT32)SmBase; } else { CpuSaveState->x64.SMBASE = (UINT32)SmBase; } -- But, I am very suspicious about the logic in AMD's version as below: --- AMD's version SmmSaveStateRegisterLma = (UINT8)EFI_MM_SAVE_STATE_REGISTER_LMA_32BIT; LMAValue = (UINT32)AsmReadMsr64 (EFER_ADDRESS) & LMA; if (LMAValue) { SmmSaveStateRegisterLma = (UINT8)EFI_MM_SAVE_STATE_REGISTER_LMA_64BIT; } --- The above logic detects the current CPU mode and 64bit save state area layout is used if it's running in 64bit. But if a AMD64 CPU runs in 32bit mode, the above logic causes the 32bit save state area layout is used. It's not right! The save state area layout does not depend on the CPU running mode, but whether it's a legacy CPU or a 64-capable CPU. Jiaxin, I agree that the confusion should be cleaned up by AMD experts. Let's not change any existing behavior. Thanks, Ray From: Wu, Jiaxin Sent: Thursday, April 25, 2024 8:54 To: Gerd Hoffmann Cc: devel@edk2.groups.io ; Ni, Ray ; Zeng, Star ; Kumar, Rahul R ; Dong, Guo ; Rhodes, Sean ; Lu, James ; Guo, Gua ; Ard Biesheuvel ; Yao, Jiewen ; Abdul Lateef Attar ; Abner Chang ; Tom Lendacky Subject: RE: [edk2-devel] [PATCH v3 00/13] Add SmmRelocationLib > > > > AMD version is not work for IA32X64 ovmf. > > > > I checked the detailed: CpuSaveState->x64 is always used for OVMF no > matter IA32 or X64, while AMD is not, which is decided by the MSR > EFER_ADDRESS LMA bit check. > > Hmm, probably because only PEI runs in 32-bit mode whereas DXE and SMM > run in 64-bit mode, so 32-bit PEI has to prepare things for the 64-bit > SMM. > > > There is a potential issue/open in OVMF why need use the X64 > > CpuSaveState for IA32. Before this open resolved, I still prefer to > > keep use the ovmf specific lib instance. > > Yes, lets stick to the ovmf version for now, and maybe remove it later > when fixing the ia32 ovmf builds. > Ok, no problem. -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118266): https://edk2.groups.io/g/devel/message/118266 Mute This Topic: https://groups.io/mt/105593568/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] MdeModulePkg: Fix MAT SplitRecord() Logic introduce one bug and will cause SUT reset when boot to windows
So this is just junk unallocated memory that we are reporting as a type it *could* be if an allocation occurs to minimize failures of ExitBootServices. Which is questionable. But in terms of attributes, I would expect we either have this unallocated memory marked the same as the bin type or better, mark it RP if we can (Taylor is making a change to set RP on free memory by default, so we would have this in the page table, but we would need to decide what we tell the OS). [Ray] When reviewing today's logic of memory protection through page table, I feel that it was designed improperly in the beginning. My rough thought is: * All memory is RP initially (as you said Taylor will do that) * Allocated memory is mapped as either RO or XD, depending on code/data. Or RP if it's a guard page. Maybe I am not aware of some limitations of the above idea. The limitations prevented the initial design be in this way. Or what Taylor will do aligns to the idea? Thanks, Ray -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118006): https://edk2.groups.io/g/devel/message/118006 Mute This Topic: https://groups.io/mt/105477564/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH v3 00/13] Add SmmRelocationLib
Jiaxin, I see Abdul from AMD has given R-B. I assume that's sufficient for merging this patch. Thanks, Ray From: Wu, Jiaxin Sent: Thursday, April 18, 2024 16:03 To: devel@edk2.groups.io ; Wu, Jiaxin Cc: Ni, Ray ; Zeng, Star ; Gerd Hoffmann ; Kumar, Rahul R ; Dong, Guo ; Rhodes, Sean ; Lu, James ; Guo, Gua ; Ard Biesheuvel ; Yao, Jiewen ; Abdul Lateef Attar ; Abner Chang ; Tom Lendacky Subject: RE: [edk2-devel] [PATCH v3 00/13] Add SmmRelocationLib Hi Tom & Abner, Could you help check & review AMD related patch? > UefiCpuPkg/SmmRelocationLib: Add library instance for AMD Thanks, Jiaxin > -Original Message- > From: devel@edk2.groups.io On Behalf Of Wu, > Jiaxin > Sent: Thursday, April 18, 2024 2:56 PM > To: devel@edk2.groups.io > Cc: Ni, Ray ; Zeng, Star ; Gerd > Hoffmann ; Kumar, Rahul R ; > Dong, Guo ; Rhodes, Sean ; > Lu, James ; Guo, Gua ; Ard > Biesheuvel ; Yao, Jiewen > ; Abdul Lateef Attar ; > Abner Chang ; Tom Lendacky > > Subject: [edk2-devel] [PATCH v3 00/13] Add SmmRelocationLib > > PR: https://github.com/tianocore/edk2/pull/5546 > > Intel plans to separate the smbase relocation logic from > PiSmmCpuDxeSmm driver, and the related behavior will be > moved to the new interface defined by the SmmRelocationLib > class. > > The SmmRelocationLib class provides the SmmRelocationInit() > interface for platform to do the smbase relocation, which > shall provide below 2 functionalities: > 1. Relocate smbases for each processor. > 2. Create the gSmmBaseHobGuid HOB. > > With SmmRelocationLib, PiSmmCpuDxeSmm driver (which runs at > a later phase) can be simplfied as below for SMM init: > 1. Consume the gSmmBaseHobGuid HOB for the relocated smbases > for each Processor. > 2. Execute the early SMM Init. > > Cc: Ray Ni > Cc: Zeng Star > Cc: Gerd Hoffmann > Cc: Rahul Kumar > Cc: Guo Dong > Cc: Sean Rhodes > Cc: James Lu > Cc: Gua Guo > Cc: Ard Biesheuvel > Cc: Jiewen Yao > Cc: Abdul Lateef Attar > Cc: Abner Chang > Cc: Tom Lendacky > Signed-off-by: Jiaxin Wu > > Jiaxin Wu (13): > UefiCpuPkg: Add SmmRelocationLib class > UefiCpuPkg/SmmRelocationLib: Add SmmRelocationLib library instance > UefiCpuPkg/SmmRelocationLib: Rename global variables > UefiCpuPkg/SmmRelocationLib: Avoid unnecessary memory allocation > UefiCpuPkg/SmmRelocationLib: Remove unnecessary global variable > UefiCpuPkg/SmmRelocationLib: Add library instance for AMD > OvmfPkg/SmmRelocationLib: Add library instance for OVMF > OvmfPkg/PlatformInitLib: Create gEfiSmmSmramMemoryGuid > OvmfPkg: Refine SmmAccess implementation > OvmfPkg/SmmCpuFeaturesLib: Check Smbase Relocation is done or not > OvmfPkg/PlatformPei: Relocate SmBases in PEI phase > UefiPayloadPkg/UefiPayloadPkg.dsc: Include SmmRelocationLib > UefiCpuPkg/PiSmmCpuDxeSmm: Remove SmBases relocation logic > > OvmfPkg/AmdSev/AmdSevX64.dsc | 1 + > OvmfPkg/CloudHv/CloudHvX64.dsc | 1 + > OvmfPkg/Library/PlatformInitLib/MemDetect.c| 104 ++-- > .../Library/PlatformInitLib/PlatformInitLib.inf| 6 +- > .../Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c | 33 +- > .../Library/SmmRelocationLib}/Ia32/Semaphore.c | 13 +- > .../Library/SmmRelocationLib}/Ia32/SmmInit.nasm| 83 +++- > .../SmmRelocationLib/InternalSmmRelocationLib.h| 127 + > .../Library/SmmRelocationLib/SmmRelocationLib.c| 549 > + > .../Library/SmmRelocationLib/SmmRelocationLib.inf | 60 +++ > .../SmmRelocationLib/SmramSaveStateConfig.c| 100 > .../Library/SmmRelocationLib}/X64/Semaphore.c | 13 +- > .../Library/SmmRelocationLib}/X64/SmmInit.nasm | 85 +++- > OvmfPkg/Microvm/MicrovmX64.dsc | 1 + > OvmfPkg/OvmfPkgIa32.dsc| 1 + > OvmfPkg/OvmfPkgIa32X64.dsc | 1 + > OvmfPkg/OvmfPkgX64.dsc | 1 + > OvmfPkg/PlatformPei/Platform.c | 3 + > OvmfPkg/PlatformPei/Platform.h | 5 + > OvmfPkg/PlatformPei/PlatformPei.inf| 5 +- > OvmfPkg/PlatformPei/SmmRelocation.c| 80 +++ > OvmfPkg/SmmAccess/SmmAccess2Dxe.c | 4 +- > OvmfPkg/SmmAccess/SmmAccess2Dxe.inf| 5 + > OvmfPkg/SmmAccess/SmmAccessPei.c | 88 +--- > OvmfPkg/SmmAccess/SmmAccessPei.inf | 7 +- > OvmfPkg/SmmAccess/SmramInternal.c | 73 +-- > OvmfPkg/SmmAccess/SmramInternal.h | 18 +- > UefiCpuPkg/Include/Library/SmmRelocationLib.h | 42 ++ > .../SmmRelocationLib/
Re: [edk2-devel] [PATCH v3 13/13] UefiCpuPkg/PiSmmCpuDxeSmm: Remove SmBases relocation logic
+ // + // Check whether the Required TileSize is enough. + // + if (TileSize > SIZE_8KB) { +DEBUG ((DEBUG_ERROR, "The Range of Smbase in SMRAM is not enough -- Required TileSize = 0x%08x, Actual TileSize = 0x%08x\n", TileSize, SIZE_8KB)); +FreePool (mCpuHotPlugData.SmBase); +FreePool (gSmmCpuPrivate->ProcessorInfo); +CpuDeadLoop (); +return RETURN_BUFFER_TOO_SMALL; } [Ray] Can you move the "TileSize" check just below the original TileSize calculation logic? Others look good to me. -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#117967): https://edk2.groups.io/g/devel/message/117967 Mute This Topic: https://groups.io/mt/105593584/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH v3 05/13] UefiCpuPkg/SmmRelocationLib: Remove unnecessary global variable
UINT64 EFIAPI HookReturnFromSmm ( - IN UINTN CpuIndex, IN OUT SMRAM_SAVE_STATE_MAP *CpuState, IN UINT64NewInstructionPointer32, IN UINT64NewInstructionPointer ) { diff --git a/UefiCpuPkg/Library/SmmRelocationLib/X64/Semaphore.c b/UefiCpuPkg/Library/SmmRelocationLib/X64/Semaphore.c index 53f3084363..cd6778e3fc 100644 --- a/UefiCpuPkg/Library/SmmRelocationLib/X64/Semaphore.c +++ b/UefiCpuPkg/Library/SmmRelocationLib/X64/Semaphore.c @@ -26,18 +26,16 @@ SmmRelocationSemaphoreComplete32 ( /** Hook return address of SMM Save State so that semaphore code can be executed immediately after AP exits SMM to indicate to the BSP that an AP has exited SMM after SMBASE relocation. - @param[in] CpuIndex The processor index. @param[in] RebasedFlag A pointer to a flag that is set to TRUE immediately after AP exits SMM. **/ VOID SemaphoreHook ( - IN UINTN CpuIndex, IN volatile BOOLEAN *RebasedFlag ) { SMRAM_SAVE_STATE_MAP *CpuState; UINTN TempValue; @@ -49,11 +47,10 @@ SemaphoreHook ( 4 ); CpuState = (SMRAM_SAVE_STATE_MAP *)(UINTN)(SMM_DEFAULT_SMBASE + SMRAM_SAVE_STATE_MAP_OFFSET); mSmmRelocationOriginalAddress = HookReturnFromSmm ( -CpuIndex, CpuState, (UINT64)(UINTN), (UINT64)(UINTN) ); [Ray] Can you split the removal of CpuIndex parameter in a new patch? Others look good to me. -- 2.16.2.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#117962): https://edk2.groups.io/g/devel/message/117962 Mute This Topic: https://groups.io/mt/105593573/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH v3 04/13] UefiCpuPkg/SmmRelocationLib: Avoid unnecessary memory allocation
Reviewed-by: Ray Ni Thanks, Ray From: Wu, Jiaxin Sent: Thursday, April 18, 2024 14:55 To: devel@edk2.groups.io Cc: Ni, Ray ; Zeng, Star ; Gerd Hoffmann ; Kumar, Rahul R Subject: [PATCH v3 04/13] UefiCpuPkg/SmmRelocationLib: Avoid unnecessary memory allocation Since SMM relocation is performed serially for each CPU, there is no need to allocate buffers for all CPUs to store the SmBase address in mSmBase and the Rebased flag in mRebased. A defined global variable is sufficient. This patch focuses on the mSmBase and mRebased global variables to prevent unnecessary memory allocation for these variables. Cc: Ray Ni Cc: Zeng Star Cc: Gerd Hoffmann Cc: Rahul Kumar Signed-off-by: Jiaxin Wu --- .../Library/SmmRelocationLib/SmmRelocationLib.c| 201 + 1 file changed, 90 insertions(+), 111 deletions(-) diff --git a/UefiCpuPkg/Library/SmmRelocationLib/SmmRelocationLib.c b/UefiCpuPkg/Library/SmmRelocationLib/SmmRelocationLib.c index ca98f06a05..3694a07cbb 100644 --- a/UefiCpuPkg/Library/SmmRelocationLib/SmmRelocationLib.c +++ b/UefiCpuPkg/Library/SmmRelocationLib/SmmRelocationLib.c @@ -25,31 +25,57 @@ EFI_PROCESSOR_INFORMATION *mProcessorInfo = NULL; // IDT used during SMM Init // IA32_DESCRIPTOR gcSmmInitIdtr; // -// Smbase for all CPUs +// Smbase for current CPU // -UINT64 *mSmBase = NULL; +UINT64 mSmBase; // -// SmBase Rebased flag for all CPUs +// SmBase Rebased flag for current CPU // -volatile BOOLEAN *mRebased; +volatile BOOLEAN mRebased; + +/** + This function will get the SmBase for CpuIndex. + + @param[in] CpuIndexThe processor index. + @param[in] SmmRelocationStart The start address of Smm relocated memory in SMRAM. + @param[in] TileSizeThe total size required for a CPU save state, any + additional CPU-specific context and the size of code + for the SMI entry point. + + @retval The value of SmBase for CpuIndex. + +**/ +UINTN +GetSmBase ( + IN UINTN CpuIndex, + IN EFI_PHYSICAL_ADDRESS SmmRelocationStart, + IN UINTN TileSize + ) +{ + return (UINTN)(SmmRelocationStart) + CpuIndex * TileSize - SMM_HANDLER_OFFSET; +} /** This function will create SmBase for all CPUs. - @param[in] SmBasePointer to SmBase for all CPUs. + @param[in] SmmRelocationStart The start address of Smm relocated memory in SMRAM. + @param[in] TileSizeThe total size required for a CPU save state, any + additional CPU-specific context and the size of code + for the SMI entry point. @retval EFI_SUCCESS Create SmBase for all CPUs successfully. @retval OthersFailed to create SmBase for all CPUs. **/ EFI_STATUS CreateSmmBaseHob ( - IN UINT64 *SmBase + IN EFI_PHYSICAL_ADDRESS SmmRelocationStart, + IN UINTN TileSize ) { UINTN Index; SMM_BASE_HOB_DATA *SmmBaseHobData; UINT32 CpuCount; @@ -90,11 +116,11 @@ CreateSmmBaseHob ( DEBUG ((DEBUG_INFO, "CreateSmmBaseHob - SmmBaseHobData[%d]->NumberOfProcessors: %d\n", HobCount, SmmBaseHobData->NumberOfProcessors)); for (Index = 0; Index < SmmBaseHobData->NumberOfProcessors; Index++) { // // Calculate the new SMBASE address // - SmmBaseHobData->SmBase[Index] = SmBase[Index + CpuCount]; + SmmBaseHobData->SmBase[Index] = GetSmBase (Index + CpuCount, SmmRelocationStart, TileSize); DEBUG ((DEBUG_INFO, "CreateSmmBaseHob - SmmBaseHobData[%d]->SmBase[%d]: 0x%08x\n", HobCount, Index, SmmBaseHobData->SmBase[Index])); } CpuCount += NumberOfProcessorsInHob; HobCount++; @@ -126,18 +152,18 @@ SmmInitHandler ( for (Index = 0; Index < mNumberOfCpus; Index++) { if (ApicId == (UINT32)mProcessorInfo[Index].ProcessorId) { // // Configure SmBase. // - ConfigureSmBase (mSmBase[Index]); + ConfigureSmBase (mSmBase); // // Hook return after RSM to set SMM re-based flag // SMM re-based flag can't be set before RSM, because SMM save state context might be override // by next AP flow before it take effect. // - SemaphoreHook (Index, [Index]); + SemaphoreHook (Index, ); return; } } ASSERT (FALSE); @@ -145,14 +171,22 @@ SmmInitHandler ( /** Relocate SmmBases for each processor. Execute on first boot and all S3 resumes + @param[in] MpServices2 Pointer to this instance of the MpServices. + @param[in] SmmRelocationStart The start address of Smm relocated memory in SMRAM. + @param[in] TileSizeThe total size required for a CPU save state, any + additional CPU-specific context and the size of code +
Re: [edk2-devel] [PATCH v3 03/13] UefiCpuPkg/SmmRelocationLib: Rename global variables
Reviewed-by: Ray Ni Thanks, Ray From: Wu, Jiaxin Sent: Thursday, April 18, 2024 14:55 To: devel@edk2.groups.io Cc: Ni, Ray ; Zeng, Star ; Gerd Hoffmann ; Kumar, Rahul R Subject: [PATCH v3 03/13] UefiCpuPkg/SmmRelocationLib: Rename global variables This patch aims to rename global variables for clearer association with Smm Init, ensuring their names are distinct from those used in the PiSmmCpuDxeSmm Driver. Cc: Ray Ni Cc: Zeng Star Cc: Gerd Hoffmann Cc: Rahul Kumar Signed-off-by: Jiaxin Wu --- .../Library/SmmRelocationLib/Ia32/SmmInit.nasm | 18 +++ .../SmmRelocationLib/InternalSmmRelocationLib.h| 8 +++ .../Library/SmmRelocationLib/SmmRelocationLib.c| 26 +++--- .../Library/SmmRelocationLib/X64/SmmInit.nasm | 18 +++ 4 files changed, 35 insertions(+), 35 deletions(-) diff --git a/UefiCpuPkg/Library/SmmRelocationLib/Ia32/SmmInit.nasm b/UefiCpuPkg/Library/SmmRelocationLib/Ia32/SmmInit.nasm index 3d845e9e16..8916cb7d06 100644 --- a/UefiCpuPkg/Library/SmmRelocationLib/Ia32/SmmInit.nasm +++ b/UefiCpuPkg/Library/SmmRelocationLib/Ia32/SmmInit.nasm @@ -16,15 +16,15 @@ extern ASM_PFX(SmmInitHandler) extern ASM_PFX(mRebasedFlag) extern ASM_PFX(mSmmRelocationOriginalAddress) -global ASM_PFX(gPatchSmmCr3) -global ASM_PFX(gPatchSmmCr4) -global ASM_PFX(gPatchSmmCr0) +global ASM_PFX(gPatchSmmInitCr3) +global ASM_PFX(gPatchSmmInitCr4) +global ASM_PFX(gPatchSmmInitCr0) global ASM_PFX(gPatchSmmInitStack) -global ASM_PFX(gcSmiInitGdtr) +global ASM_PFX(gcSmmInitGdtr) global ASM_PFX(gcSmmInitSize) global ASM_PFX(gcSmmInitTemplate) %define PROTECT_MODE_CS 0x8 %define PROTECT_MODE_DS 0x20 @@ -81,11 +81,11 @@ CodeSeg64: DB 0x9b DB 0xaf; LimitHigh DB 0 ; BaseHigh GDT_SIZE equ $ - NullSeg -ASM_PFX(gcSmiInitGdtr): +ASM_PFX(gcSmmInitGdtr): DW GDT_SIZE - 1 DD NullSeg SECTION .text @@ -98,22 +98,22 @@ ASM_PFX(SmmStartup): cpuid mov ebx, edx; rdmsr will change edx. keep it in ebx. and ebx, BIT20 ; extract NX capability bit shr ebx, 9 ; shift bit to IA32_EFER.NXE[BIT11] position mov eax, strict dword 0 ; source operand will be patched -ASM_PFX(gPatchSmmCr3): +ASM_PFX(gPatchSmmInitCr3): mov cr3, eax -o32 lgdt[cs:ebp + (ASM_PFX(gcSmiInitGdtr) - ASM_PFX(SmmStartup))] +o32 lgdt[cs:ebp + (ASM_PFX(gcSmmInitGdtr) - ASM_PFX(SmmStartup))] mov eax, strict dword 0 ; source operand will be patched -ASM_PFX(gPatchSmmCr4): +ASM_PFX(gPatchSmmInitCr4): mov cr4, eax mov ecx, 0xc080 ; IA32_EFER MSR rdmsr or eax, ebx; set NXE bit if NX is available wrmsr mov eax, strict dword 0 ; source operand will be patched -ASM_PFX(gPatchSmmCr0): +ASM_PFX(gPatchSmmInitCr0): mov di, PROTECT_MODE_DS mov cr0, eax jmp PROTECT_MODE_CS : dword @32bit BITS 32 diff --git a/UefiCpuPkg/Library/SmmRelocationLib/InternalSmmRelocationLib.h b/UefiCpuPkg/Library/SmmRelocationLib/InternalSmmRelocationLib.h index a9d3f271a9..ede61b956f 100644 --- a/UefiCpuPkg/Library/SmmRelocationLib/InternalSmmRelocationLib.h +++ b/UefiCpuPkg/Library/SmmRelocationLib/InternalSmmRelocationLib.h @@ -30,17 +30,17 @@ #include #include #include #include -extern IA32_DESCRIPTOR gcSmiInitGdtr; +extern IA32_DESCRIPTOR gcSmmInitGdtr; extern CONST UINT16 gcSmmInitSize; extern CONST UINT8 gcSmmInitTemplate[]; -X86_ASSEMBLY_PATCH_LABEL gPatchSmmCr0; -X86_ASSEMBLY_PATCH_LABEL gPatchSmmCr3; -X86_ASSEMBLY_PATCH_LABEL gPatchSmmCr4; +X86_ASSEMBLY_PATCH_LABEL gPatchSmmInitCr0; +X86_ASSEMBLY_PATCH_LABEL gPatchSmmInitCr3; +X86_ASSEMBLY_PATCH_LABEL gPatchSmmInitCr4; X86_ASSEMBLY_PATCH_LABEL gPatchSmmInitStack; // // The size 0x20 must be bigger than // the size of template code of SmmInit. Currently, diff --git a/UefiCpuPkg/Library/SmmRelocationLib/SmmRelocationLib.c b/UefiCpuPkg/Library/SmmRelocationLib/SmmRelocationLib.c index 13e62b662d..ca98f06a05 100644 --- a/UefiCpuPkg/Library/SmmRelocationLib/SmmRelocationLib.c +++ b/UefiCpuPkg/Library/SmmRelocationLib/SmmRelocationLib.c @@ -22,11 +22,11 @@ UINTN mNumberOfCpus= 1; EFI_PROCESSOR_INFORMATION *mProcessorInfo = NULL; // // IDT used during SMM Init // -IA32_DESCRIPTOR gcSmiIdtr; +IA32_DESCRIPTOR gcSmmInitIdtr; // // Smbase for all CPUs // UINT64 *mSmBase = NULL; @@ -118,11 +118,11 @@ SmmInitHandler ( UINTN Index; // // Update SMM IDT entries' code segment and load IDT // - AsmWriteIdtr (); + AsmWriteIdtr (); ApicId = GetApicId (); for (Index = 0; Index < mNumberOfCpus; Index++) { if (ApicId == (UINT32)mProcessorInfo[Index].ProcessorId) { // @@ -167,13 +167,13 @@ SmmRelocateBa
Re: [edk2-devel] [PATCH v3 02/13] UefiCpuPkg/SmmRelocationLib: Add SmmRelocationLib library instance
Reviewed-by: Ray Ni Thanks, Ray From: Wu, Jiaxin Sent: Thursday, April 18, 2024 14:55 To: devel@edk2.groups.io Cc: Ni, Ray ; Zeng, Star ; Gerd Hoffmann ; Kumar, Rahul R Subject: [PATCH v3 02/13] UefiCpuPkg/SmmRelocationLib: Add SmmRelocationLib library instance This patch just separates the smbase relocation logic from PiSmmCpuDxeSmm driver, and moves to the SmmRelocationInit interface. It maintains the original implementation of most functions and leaves the definitions of global variables intact. Further refinements to the code are planned for subsequent patches. Platform shall consume the interface for the smbase relocation if need SMM support. Note: Before using SmmRelocationLib, the PiSmmCpuDxeSmm driver allocates the SMRAM to be used for SMI handler and Save state area of each processor from Smst->AllocatePages(). With SmmRelocationLib, the SMRAM allocation for SMI handlers and Save state areas is moved to early PEI phase (Smst->AllocatePages() service is not available). So, the allocation is done by splitting the SMRAM out of the SMRAM regions reported from gEfiSmmSMramMemoryGuid. So, Platform must produce the gEfiSmmSMramMemoryGuid HOB for SmmRelocationLib usage. Cc: Ray Ni Cc: Zeng Star Cc: Gerd Hoffmann Cc: Rahul Kumar Signed-off-by: Jiaxin Wu --- .../SmmRelocationLib}/Ia32/Semaphore.c | 10 +- .../SmmRelocationLib}/Ia32/SmmInit.nasm| 67 ++- .../SmmRelocationLib/InternalSmmRelocationLib.h| 132 + .../Library/SmmRelocationLib/SmmRelocationLib.c| 600 + .../Library/SmmRelocationLib/SmmRelocationLib.inf | 61 +++ .../SmmRelocationLib/SmramSaveStateConfig.c| 139 + .../SmmRelocationLib}/X64/Semaphore.c | 10 +- .../SmmRelocationLib}/X64/SmmInit.nasm | 69 ++- UefiCpuPkg/UefiCpuPkg.dsc | 1 + 9 files changed, 1066 insertions(+), 23 deletions(-) copy UefiCpuPkg/{PiSmmCpuDxeSmm => Library/SmmRelocationLib}/Ia32/Semaphore.c (79%) copy UefiCpuPkg/{PiSmmCpuDxeSmm => Library/SmmRelocationLib}/Ia32/SmmInit.nasm (53%) create mode 100644 UefiCpuPkg/Library/SmmRelocationLib/InternalSmmRelocationLib.h create mode 100644 UefiCpuPkg/Library/SmmRelocationLib/SmmRelocationLib.c create mode 100644 UefiCpuPkg/Library/SmmRelocationLib/SmmRelocationLib.inf create mode 100644 UefiCpuPkg/Library/SmmRelocationLib/SmramSaveStateConfig.c copy UefiCpuPkg/{PiSmmCpuDxeSmm => Library/SmmRelocationLib}/X64/Semaphore.c (84%) copy UefiCpuPkg/{PiSmmCpuDxeSmm => Library/SmmRelocationLib}/X64/SmmInit.nasm (64%) diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/Semaphore.c b/UefiCpuPkg/Library/SmmRelocationLib/Ia32/Semaphore.c similarity index 79% copy from UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/Semaphore.c copy to UefiCpuPkg/Library/SmmRelocationLib/Ia32/Semaphore.c index a9fcc89dda..ba329d6ba2 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/Semaphore.c +++ b/UefiCpuPkg/Library/SmmRelocationLib/Ia32/Semaphore.c @@ -1,15 +1,15 @@ /** @file -Semaphore mechanism to indicate to the BSP that an AP has exited SMM -after SMBASE relocation. + Semaphore mechanism to indicate to the BSP that an AP has exited SMM + after SMBASE relocation. -Copyright (c) 2009 - 2015, Intel Corporation. All rights reserved. -SPDX-License-Identifier: BSD-2-Clause-Patent + Copyright (c) 2024, Intel Corporation. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent **/ -#include "PiSmmCpuDxeSmm.h" +#include "InternalSmmRelocationLib.h" UINTN mSmmRelocationOriginalAddress; volatile BOOLEAN *mRebasedFlag; /** diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmmInit.nasm b/UefiCpuPkg/Library/SmmRelocationLib/Ia32/SmmInit.nasm similarity index 53% copy from UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmmInit.nasm copy to UefiCpuPkg/Library/SmmRelocationLib/Ia32/SmmInit.nasm index b5e77a1a5b..3d845e9e16 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmmInit.nasm +++ b/UefiCpuPkg/Library/SmmRelocationLib/Ia32/SmmInit.nasm @@ -1,7 +1,7 @@ ;-- ; -; Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved. +; Copyright (c) 2024, Intel Corporation. All rights reserved. ; SPDX-License-Identifier: BSD-2-Clause-Patent ; ; Module Name: ; ; SmmInit.nasm @@ -27,15 +27,70 @@ global ASM_PFX(gcSmmInitSize) global ASM_PFX(gcSmmInitTemplate) %define PROTECT_MODE_CS 0x8 %define PROTECT_MODE_DS 0x20 -SECTION .text +SECTION .data -ASM_PFX(gcSmiInitGdtr): +NullSeg: DQ 0 ; reserved by architecture +CodeSeg32: +DW -1 ; LimitLow +DW 0 ; BaseLow +DB 0 ; BaseMid +DB 0x9b +DB 0xcf; LimitHigh +DB 0 ; BaseHigh +ProtModeCodeSeg32: +
Re: [edk2-devel] [PATCH v2 02/10] UefiCpuPkg/SmmRelocationLib: Add SmmRelocationLib library instance
Comments below starting with [Ray] Thanks, Ray From: Wu, Jiaxin Sent: Tuesday, April 16, 2024 20:58 To: Ni, Ray ; devel@edk2.groups.io Cc: Zeng, Star ; Gerd Hoffmann ; Kumar, Rahul R Subject: RE: [PATCH v2 02/10] UefiCpuPkg/SmmRelocationLib: Add SmmRelocationLib library instance /** @@ -30,11 +30,12 @@ SemaphoreHook ( { SMRAM_SAVE_STATE_MAP *CpuState; mRebasedFlag = RebasedFlag; - CpuState = (SMRAM_SAVE_STATE_MAP *)(UINTN)(SMM_DEFAULT_SMBASE + SMRAM_SAVE_STATE_MAP_OFFSET); + CpuState = (SMRAM_SAVE_STATE_MAP *)(UINTN)(SMM_DEFAULT_SMBASE + SMRAM_SAVE_STATE_MAP_OFFSET); [Ray.1] This change is unnecessary. [Jiaxin.1] it’s not only move the code to the new lib, but also do some adaptation. For example here: the code style change to PASS the CI. If no this change, can’t pass the CI check. [Ray] Original code should also pass uncrustify checker. I guess you added one blank line above so the alignment of "=" is not required. [Ray.4] Can you evaluate what extra changes are required if allowing the lib runs in flash area? Basically all global variables cannot be modified at runtime. [Jiaxin.4] The Lib needs to depend on the MP service PPI, it shall be called during post-mem phase, global variables can’t be used? [Ray] A PEIM could run in flash in post-mem phase. If you pass the values across routines through parameters, most of the global variables can be avoided. + UINTN SmramRanges; [Ray.6] No need SmramRanges. [Jiaxin.6] replace it with DescriptorBlock ->NumberOfSmmReservedRegions directly? [Ray] yes. + // + // Increase the number of SMRAM descriptors by 1 to make room for the ALLOCATED descriptor of size EFI_PAGE_SIZE + // + NewDescriptorBlock->NumberOfSmmReservedRegions = (UINT32)(SmramRanges + 1); [Ray.9] NewBlock->NumberOfSmmReservedRegions++; [Jiaxin.9] Agree since we copied the DescriptorBlock to NewDescriptorBlock first. But I still think original is more easy to understand. [Ray] As long as you remove local variable SmramRanges, I am fine. + +DEBUG ((DEBUG_INFO, "CreateSmmBaseHob - SmmBaseHobData[%d]->ProcessorIndex: %03x\n", HobCount, SmmBaseHobData->ProcessorIndex)); +DEBUG ((DEBUG_INFO, "CreateSmmBaseHob - SmmBaseHobData[%d]->NumberOfProcessors: %03x\n", HobCount, SmmBaseHobData->NumberOfProcessors)); +for (Index = 0; Index < SmmBaseHobData->NumberOfProcessors; Index++) { + // + // Calculate the new SMBASE address + // + SmmBaseHobData->SmBase[Index] = SmBaseForAllCpus[Index + CpuCount]; [Ray.12] Please re-organize the code so that SmBaseForAllCpus array is not needed. What we need is only the Cpu0SmBase and TileSize. [Jiaxin.12] do you mean calculate the value here? --> (UINTN)(Cpu0SmBase)+ Index * TileSize - SMM_HANDLER_OFFSET ? I init the smbase value in the function of InitSmBaseForAllCpus(), the value will be used in both ConfigureSmBase & CreateSmmBaseHob. How about the ConfigureSmBase function during SmmRelocateBases()? What’s reason you think SmBaseForAllCpus is not good? [Ray] I just want to avoid unnecessary memory allocation. + + // + // Patch SMI stack for SMM base relocation + // Note: No need allocate stack for all CPUs since the relocation + // occurs serially for each CPU + // + SmmStackSize = EFI_PAGES_TO_SIZE (EFI_SIZE_TO_PAGES (PcdGet32 (PcdCpuSmmStackSize))); [Ray.15] PcdCpuSmmStackSize is configured by platform as only platform knows what kind of SMI handlers will run in SMM env. But in this case, all code is provided by this lib and stack size should be fixed, maybe simply 1 page is enough. [Jiaxin.15] agree, do you prefer this change as another patch or I just update the hard code value directly in this patch? [Ray] If the code is inherited from PiSmmCpuDxeSmm driver, you can do that change in another patch. + // + // Retrieve the Processor Info for all CPUs + // + mProcessorInfo = (EFI_PROCESSOR_INFORMATION *)AllocatePool (sizeof (EFI_PROCESSOR_INFORMATION) * mMaxNumberOfCpus); [Ray.16] mProcessorInfo is needed when programming the new SMBASE. Then can you just put the new SMBASE for every CPU in the stack top, or just patch the value in the code region? You can do that in a new patch. [Jiaxin.16] why need such behavior? I only allocate one stack for all cpus with existing design. The reason see below as I explained: [Ray] My purpose is to avoid global variables. + // + // Initialize the SmBase for all CPUs + // + Status = InitSmBaseForAllCpus (); [Ray.17] mSmBaseForAllCpus global variable is not needed. We only need Cpu0Smbase and TileSize and the two can be local variables and passed to further routines through parameters. [Jiaxin.17] let me remove the mSmBaseForAllCpus global variable. But I still think it’s not good to calculate value in different 2 places again and again (Con
Re: [edk2-devel] [PATCH v4 6/6] StandaloneMmPkg: Support to unregister MMI handler in MMI handlers
Reviewed-by: Ray Ni Thanks, Ray From: Liu, Zhiguang Sent: Tuesday, April 16, 2024 10:41 To: devel@edk2.groups.io Cc: Liu, Zhiguang ; Liming Gao ; Wu, Jiaxin ; Ni, Ray ; Laszlo Ersek ; Ard Biesheuvel ; Sami Mujawar Subject: [PATCH v4 6/6] StandaloneMmPkg: Support to unregister MMI handler in MMI handlers This patch fix a use-after-free issue where unregistering an MMI handler could lead to the deletion of the MMI_HANDLER while it is still in use by MmiManage(). The fix involves modifying MmiHandlerUnRegister() to detect whether it is being called from within the MmiManage() stack. If so, the removal of the MMI_HANDLER is deferred until MmiManage() has finished executing. Additionally, due to the possibility of recursive MmiManage() calls, the unregistration and subsequent removal of the MMI_HANDLER are ensured to occur only after the outermost MmiManage() invocation has completed. Cc: Liming Gao Cc: Jiaxin Wu Cc: Ray Ni Cc: Laszlo Ersek Cc: Ard Biesheuvel Cc: Sami Mujawar Signed-off-by: Zhiguang Liu --- StandaloneMmPkg/Core/Mmi.c | 161 +++-- 1 file changed, 136 insertions(+), 25 deletions(-) diff --git a/StandaloneMmPkg/Core/Mmi.c b/StandaloneMmPkg/Core/Mmi.c index 0de6fd17fc..e035245c87 100644 --- a/StandaloneMmPkg/Core/Mmi.c +++ b/StandaloneMmPkg/Core/Mmi.c @@ -34,11 +34,51 @@ typedef struct { LIST_ENTRYLink;// Link on MMI_ENTRY.MmiHandlers EFI_MM_HANDLER_ENTRY_POINTHandler; // The mm handler's entry point MMI_ENTRY *MmiEntry; + BOOLEAN ToRemove;// To remove this MMI_HANDLER later } MMI_HANDLER; +// +// mMmiManageCallingDepth is used to track the depth of recursive calls of MmiManage. +// +UINTN mMmiManageCallingDepth = 0; + LIST_ENTRY mRootMmiHandlerList = INITIALIZE_LIST_HEAD_VARIABLE (mRootMmiHandlerList); LIST_ENTRY mMmiEntryList = INITIALIZE_LIST_HEAD_VARIABLE (mMmiEntryList); +/** + Remove MmiHandler and free the memory it used. + If MmiEntry is empty, remove MmiEntry and free the memory it used. + + @param MmiHandler Points to MMI handler. + @param MmiEntryPoints to MMI Entry or NULL for root MMI handlers. + + @retval TRUEMmiEntry is removed. + @retval FALSE MmiEntry is not removed. +**/ +BOOLEAN +RemoveMmiHandler ( + IN MMI_HANDLER *MmiHandler, + IN MMI_ENTRY*MmiEntry + ) +{ + ASSERT (MmiHandler->ToRemove); + RemoveEntryList (>Link); + FreePool (MmiHandler); + + // + // Remove the MMI_ENTRY if all handlers have been removed. + // + if (MmiEntry != NULL) { +if (IsListEmpty (>MmiHandlers)) { + RemoveEntryList (>AllEntries); + FreePool (MmiEntry); + return TRUE; +} + } + + return FALSE; +} + /** Finds the MMI entry for the requested handler type. @@ -126,13 +166,16 @@ MmiManage ( { LIST_ENTRY *Link; LIST_ENTRY *Head; + LIST_ENTRY *EntryLink; MMI_ENTRY*MmiEntry; MMI_HANDLER *MmiHandler; - BOOLEAN SuccessReturn; + EFI_STATUS ReturnStatus; + BOOLEAN WillReturn; EFI_STATUS Status; - Status= EFI_NOT_FOUND; - SuccessReturn = FALSE; + mMmiManageCallingDepth++; + Status = EFI_NOT_FOUND; + ReturnStatus = Status; if (HandlerType == NULL) { // // Root MMI handler @@ -171,7 +214,16 @@ MmiManage ( // no additional handlers will be processed and EFI_INTERRUPT_PENDING will be returned. // if (HandlerType != NULL) { - return EFI_INTERRUPT_PENDING; + ReturnStatus = EFI_INTERRUPT_PENDING; + WillReturn = TRUE; +} else { + // + // If any other handler's result sets ReturnStatus as EFI_SUCCESS, the return status + // will be EFI_SUCCESS. + // + if (ReturnStatus != EFI_SUCCESS) { +ReturnStatus = Status; + } } break; @@ -183,10 +235,10 @@ MmiManage ( // additional handlers will be processed. // if (HandlerType != NULL) { - return EFI_SUCCESS; + WillReturn = TRUE; } -SuccessReturn = TRUE; +ReturnStatus = EFI_SUCCESS; break; case EFI_WARN_INTERRUPT_SOURCE_QUIESCED: @@ -194,7 +246,7 @@ MmiManage ( // If at least one of the handlers returns EFI_WARN_INTERRUPT_SOURCE_QUIESCED // then the function will return EFI_SUCCESS. // -SuccessReturn = TRUE; +ReturnStatus = EFI_SUCCESS; break; case EFI_WARN_INTERRUPT_SOURCE_PENDING: @@ -202,6 +254,10 @@ MmiManage ( // If all the handlers returned EFI_WARN_INTERRUPT_SOURCE_PENDING // then EFI_WARN_INTERRUPT_SOURCE_PENDING will be returned. // +if (ReturnStatus != EFI_SUCCESS) { + ReturnStatus = Status; +} + break; default: @@ -211,13 +267,76 @@ MmiManage ( ASSE
Re: [edk2-devel] [PATCH v4 5/6] MdeModulePkg/SMM: Support to unregister SMI handler in SMI handlers
Reviewed-by: Ray Ni Thanks, Ray From: Liu, Zhiguang Sent: Tuesday, April 16, 2024 10:41 To: devel@edk2.groups.io Cc: Liu, Zhiguang ; Liming Gao ; Wu, Jiaxin ; Ni, Ray ; Laszlo Ersek Subject: [PATCH v4 5/6] MdeModulePkg/SMM: Support to unregister SMI handler in SMI handlers This patch fix a use-after-free issue where unregistering an SMI handler could lead to the deletion of the SMI_HANDLER while it is still in use by SmiManage(). The fix involves modifying SmiHandlerUnRegister() to detect whether it is being called from within the SmiManage() stack. If so, the removal of the SMI_HANDLER is deferred until SmiManage() has finished executing. Additionally, due to the possibility of recursive SmiManage() calls, the unregistration and subsequent removal of the SMI_HANDLER are ensured to occur only after the outermost SmiManage() invocation has completed. Cc: Liming Gao Cc: Jiaxin Wu Cc: Ray Ni Cc: Laszlo Ersek Signed-off-by: Zhiguang Liu --- MdeModulePkg/Core/PiSmmCore/PiSmmCore.h | 1 + MdeModulePkg/Core/PiSmmCore/Smi.c | 164 2 files changed, 139 insertions(+), 26 deletions(-) diff --git a/MdeModulePkg/Core/PiSmmCore/PiSmmCore.h b/MdeModulePkg/Core/PiSmmCore/PiSmmCore.h index b8a490a8c3..60073c78b4 100644 --- a/MdeModulePkg/Core/PiSmmCore/PiSmmCore.h +++ b/MdeModulePkg/Core/PiSmmCore/PiSmmCore.h @@ -93,6 +93,7 @@ typedef struct { SMI_ENTRY *SmiEntry; VOID*Context;// for profile UINTN ContextSize; // for profile + BOOLEAN ToRemove;// To remove this SMI_HANDLER later } SMI_HANDLER; // diff --git a/MdeModulePkg/Core/PiSmmCore/Smi.c b/MdeModulePkg/Core/PiSmmCore/Smi.c index 2985f989c3..a84a1f48d3 100644 --- a/MdeModulePkg/Core/PiSmmCore/Smi.c +++ b/MdeModulePkg/Core/PiSmmCore/Smi.c @@ -8,6 +8,11 @@ #include "PiSmmCore.h" +// +// mSmiManageCallingDepth is used to track the depth of recursive calls of SmiManage. +// +UINTN mSmiManageCallingDepth = 0; + LIST_ENTRY mSmiEntryList = INITIALIZE_LIST_HEAD_VARIABLE (mSmiEntryList); SMI_ENTRY mRootSmiEntry = { @@ -79,6 +84,40 @@ SmmCoreFindSmiEntry ( return SmiEntry; } +/** + Remove SmiHandler and free the memory it used. + If SmiEntry is empty, remove SmiEntry and free the memory it used. + + @param SmiHandler Points to SMI handler. + @param SmiEntry Points to SMI Entry or NULL for root SMI handlers. + + @retval TRUESmiEntry is removed. + @retval FALSE SmiEntry is not removed. +**/ +BOOLEAN +RemoveSmiHandler ( + IN SMI_HANDLER *SmiHandler, + IN SMI_ENTRY*SmiEntry + ) +{ + ASSERT (SmiHandler->ToRemove); + RemoveEntryList (>Link); + FreePool (SmiHandler); + + // + // Remove the SMI_ENTRY if all handlers have been removed. + // + if (SmiEntry != NULL) { +if (IsListEmpty (>SmiHandlers)) { + RemoveEntryList (>AllEntries); + FreePool (SmiEntry); + return TRUE; +} + } + + return FALSE; +} + /** Manage SMI of a particular type. @@ -104,15 +143,17 @@ SmiManage ( { LIST_ENTRY *Link; LIST_ENTRY *Head; + LIST_ENTRY *EntryLink; SMI_ENTRY*SmiEntry; SMI_HANDLER *SmiHandler; - BOOLEAN SuccessReturn; + EFI_STATUS ReturnStatus; + BOOLEAN WillReturn; EFI_STATUS Status; PERF_FUNCTION_BEGIN (); - - Status= EFI_NOT_FOUND; - SuccessReturn = FALSE; + mSmiManageCallingDepth++; + Status = EFI_NOT_FOUND; + ReturnStatus = Status; if (HandlerType == NULL) { // // Root SMI handler @@ -152,7 +193,16 @@ SmiManage ( // if (HandlerType != NULL) { PERF_FUNCTION_END (); - return EFI_INTERRUPT_PENDING; + ReturnStatus = EFI_INTERRUPT_PENDING; + WillReturn = TRUE; +} else { + // + // If any other handler's result sets ReturnStatus as EFI_SUCCESS, the return status + // will be EFI_SUCCESS. + // + if (ReturnStatus != EFI_SUCCESS) { +ReturnStatus = Status; + } } break; @@ -165,10 +215,10 @@ SmiManage ( // if (HandlerType != NULL) { PERF_FUNCTION_END (); - return EFI_SUCCESS; + WillReturn = TRUE; } -SuccessReturn = TRUE; +ReturnStatus = EFI_SUCCESS; break; case EFI_WARN_INTERRUPT_SOURCE_QUIESCED: @@ -176,7 +226,7 @@ SmiManage ( // If at least one of the handlers returns EFI_WARN_INTERRUPT_SOURCE_QUIESCED // then the function will return EFI_SUCCESS. // -SuccessReturn = TRUE; +ReturnStatus = EFI_SUCCESS; break; case EFI_WARN_INTERRUPT_SOURCE_PENDING: @@ -184,6 +234,10 @@ SmiManage ( // If all the handlers returned EFI_WARN_INTERRUPT_SOURCE_PENDING // then EFI_WARN_INTERRUPT_SOURCE_PE
Re: [edk2-devel] [PATCH v4 00/13] Part 2 patch set to add LoongArch support into UefiCpuPkg
PR created for merge: Loongcpu by niruiyu · Pull Request #5560 · tianocore/edk2 (github.com)<https://github.com/tianocore/edk2/pull/5560> Thanks, Ray From: Chao Li Sent: Tuesday, April 16, 2024 10:42 To: devel@edk2.groups.io Cc: Ni, Ray ; Kumar, Rahul R ; Gerd Hoffmann ; Sami Mujawar ; Sunil V L ; Bibo Mao ; Dongyan Qian Subject: [PATCH v4 00/13] Part 2 patch set to add LoongArch support into UefiCpuPkg This patch set adjusted some order in UefiCpuPig alphabetically, added LoongArch libraries and drivers into UefiCpuPkg, it is a continuation of the first patch series v8 submitted at https://edk2.groups.io/g/devel/message/114526. And also separated from https://edk2.groups.io/g/devel/message/116583. This series only contents the changes for UefiCpuPkg. Patch1-Patch4: Reorder some INF files located in UefiCpuPkg alphabetically. Patch5-Patch13: Added Timer, CpuMmuLib, CpuMmuInitLib, MpInitLib, CpuDxe for LoongArch, and added some PCD and header files requested by the above libraries and drivers. Modfied modules: UefiCpuPkg BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=4726 BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=4734 PR: https://github.com/tianocore/edk2/pull/5483 V1 -> V2: 1. Removed PcdCpuMmuIsEnabled. 2. Removed API GetMemoryRegionAttributes API as it is no longer needed. 3. Patch3, added two empty line in DXE and PEI INF files. 4. Patch5, added the Status check in GetTimeInnanoSecond function. 5. Separated into two series, this is series one, and the second one is OvmfPkg. V2 -> V3: 1. Remove CpuMmuInitLib. 2. Added a new GUID HOB named PROCESSOR_RESOURCE_HOG_GUID. 3. Following Ray suggest, adjust CpuMmuLib API, rename the API name. 4. Rename the PcdCpuExceptionVectorBaseAddress to PcdLoongArch64ExceptionVectorBaseAddress. 5. Enable CpuMmio2Dxe in LoongArch. V3 -> V4: Patch 10, use flexible arrays in PROCESSOR_RESOURCE_DATA. Cc: Ray Ni Cc: Rahul Kumar Cc: Gerd Hoffmann Cc: Sami Mujawar Cc: Sunil V L Cc: Bibo Mao Cc: Dongyan Qian Chao Li (13): UefiCpuPkg/CpuTimerLib: Reorder the INF file alphabetically UefiCpuPkg/CpuExceptionHandlerLib: Reorder the INF files alphabetically UefiCpuPkg/MpInitLib: Reorder the INF files alphabetically UefiCpuPkg/CpuDxe: Reorder the INF file alphabetically UefiCpuPkg: Add LoongArch64 CPU Timer instance UefiCpuPkg: Add CPU exception library for LoongArch UefiCpuPkg: Add CpuMmuLib.h to UefiCpuPkg UefiCpuPkg: Added a new PCD named PcdLoongArchExceptionVectorBaseAddress UefiCpuPkg: Add CpuMmuLib to UefiCpuPkg UefiCpuPkg: Add a new GUID to store the processors resource UefiCpuPkg: Add multiprocessor library for LoongArch64 UefiCpuPkg: Add CpuDxe driver for LoongArch64 UefiCpuPkg/UefiCpuPkg.dsc: Add CpuMmio2Dxe.inf to LoongArch64 field UefiCpuPkg/CpuDxe/CpuDxe.inf | 39 +- UefiCpuPkg/CpuDxe/LoongArch64/CpuDxe.c| 514 ++ UefiCpuPkg/CpuDxe/LoongArch64/CpuDxe.h| 288 +++ UefiCpuPkg/CpuDxe/LoongArch64/CpuMp.c | 544 ++ UefiCpuPkg/CpuDxe/LoongArch64/Exception.c | 159 ++ .../Include/Guid/ProcessorResourceHob.h | 29 + UefiCpuPkg/Include/Library/CpuMmuLib.h| 41 + .../DxeCpuExceptionHandlerLib.inf | 37 +- .../LoongArch/DxeExceptionLib.c | 198 ++ .../LoongArch/ExceptionCommon.c | 171 ++ .../LoongArch/ExceptionCommon.h | 131 ++ .../LoongArch64/ArchExceptionHandler.c| 268 +++ .../LoongArch64/ExceptionHandlerAsm.S | 366 .../LoongArch/SecPeiExceptionLib.c| 102 ++ .../PeiCpuExceptionHandlerLib.inf | 16 +- .../SecPeiCpuExceptionHandlerLib.inf | 31 +- .../SmmCpuExceptionHandlerLib.inf | 16 +- UefiCpuPkg/Library/CpuMmuLib/CpuMmuLib.inf| 39 + UefiCpuPkg/Library/CpuMmuLib/CpuMmuLib.uni| 14 + .../Library/CpuMmuLib/LoongArch64/CpuMmu.c| 784 .../Library/CpuMmuLib/LoongArch64/Page.h | 33 + .../LoongArch64/TlbExceptionHandle.S | 51 + .../LoongArch64/TlbExceptionHandle.h | 36 + .../CpuMmuLib/LoongArch64/TlbInvalid.S| 24 + .../CpuMmuLib/LoongArch64/TlbInvalid.h| 24 + .../Library/CpuTimerLib/BaseCpuTimerLib.inf | 17 +- .../CpuTimerLib/LoongArch64/CpuTimerLib.c | 250 +++ UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf | 42 +- .../Library/MpInitLib/LoongArch64/DxeMpLib.c | 480 + .../Library/MpInitLib/LoongArch64/MpLib.c | 1626 + .../Library/MpInitLib/LoongArch64/MpLib.h | 350 .../Library/MpInitLib/LoongArch64/PeiMpLib.c | 381 UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf | 40 +- UefiCpuPkg/UefiCpuPkg.dec | 13 + UefiCpuPkg/UefiCpuPkg.dsc |7 + 35 files changed, 7082 insertions(+), 79 deletions(-) create mode 100644 UefiCpuPkg/CpuDxe/LoongArch64/CpuDxe.c create mode 100644 Ue
Re: [edk2-devel] [PATCH v2 03/10] UefiCpuPkg/SmmRelocationLib: Add library instance for AMD
Acked-by: Ray Ni Thanks, Ray From: Wu, Jiaxin Sent: Monday, April 15, 2024 21:30 To: devel@edk2.groups.io Cc: Abdul Lateef Attar ; Abner Chang ; Tom Lendacky ; Ni, Ray ; Zeng, Star ; Gerd Hoffmann ; Kumar, Rahul R Subject: [PATCH v2 03/10] UefiCpuPkg/SmmRelocationLib: Add library instance for AMD Due to the definition difference of SMRAM Save State, SmmBase config in SMRAM Save State for AMD is also different. This patch provides the AmdSmmRelocationLib library instance to handle the SMRAM Save State difference. Cc: Abdul Lateef Attar Cc: Abner Chang Cc: Tom Lendacky Cc: Ray Ni Cc: Zeng Star Cc: Gerd Hoffmann Cc: Rahul Kumar Signed-off-by: Jiaxin Wu --- ...mmRelocationLib.inf => AmdSmmRelocationLib.inf} | 5 +- ...SaveStateConfig.c => AmdSmramSaveStateConfig.c} | 93 ++ UefiCpuPkg/UefiCpuPkg.dsc | 1 + 3 files changed, 46 insertions(+), 53 deletions(-) copy UefiCpuPkg/Library/SmmRelocationLib/{SmmRelocationLib.inf => AmdSmmRelocationLib.inf} (89%) copy UefiCpuPkg/Library/SmmRelocationLib/{SmramSaveStateConfig.c => AmdSmramSaveStateConfig.c} (50%) diff --git a/UefiCpuPkg/Library/SmmRelocationLib/SmmRelocationLib.inf b/UefiCpuPkg/Library/SmmRelocationLib/AmdSmmRelocationLib.inf similarity index 89% copy from UefiCpuPkg/Library/SmmRelocationLib/SmmRelocationLib.inf copy to UefiCpuPkg/Library/SmmRelocationLib/AmdSmmRelocationLib.inf index 6581fa2dad..710cd1948b 100644 --- a/UefiCpuPkg/Library/SmmRelocationLib/SmmRelocationLib.inf +++ b/UefiCpuPkg/Library/SmmRelocationLib/AmdSmmRelocationLib.inf @@ -13,18 +13,18 @@ ## [Defines] INF_VERSION= 0x00010005 BASE_NAME = SmmRelocationLib - FILE_GUID = 853E97B3-790C-4EA3-945C-8F622FC47FE8 + FILE_GUID = 65C74DCD-0D09-494A-8BFF-A64226EB8054 MODULE_TYPE= PEIM VERSION_STRING = 1.0 LIBRARY_CLASS = SmmRelocationLib [Sources] InternalSmmRelocationLib.h - SmramSaveStateConfig.c + AmdSmramSaveStateConfig.c SmmRelocationLib.c [Sources.Ia32] Ia32/Semaphore.c Ia32/SmmInit.nasm @@ -40,11 +40,10 @@ [LibraryClasses] BaseLib BaseMemoryLib CpuExceptionHandlerLib - CpuLib DebugLib HobLib LocalApicLib MemoryAllocationLib PcdLib diff --git a/UefiCpuPkg/Library/SmmRelocationLib/SmramSaveStateConfig.c b/UefiCpuPkg/Library/SmmRelocationLib/AmdSmramSaveStateConfig.c similarity index 50% copy from UefiCpuPkg/Library/SmmRelocationLib/SmramSaveStateConfig.c copy to UefiCpuPkg/Library/SmmRelocationLib/AmdSmramSaveStateConfig.c index fb69b2b5c5..95a1ce8d46 100644 --- a/UefiCpuPkg/Library/SmmRelocationLib/SmramSaveStateConfig.c +++ b/UefiCpuPkg/Library/SmmRelocationLib/AmdSmramSaveStateConfig.c @@ -1,14 +1,17 @@ /** @file Config SMRAM Save State for SmmBases Relocation. + Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved. Copyright (c) 2024, Intel Corporation. All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include "InternalSmmRelocationLib.h" -#include +#include + +#define EFER_ADDRESS 0XC080ul /** Determine the mode of the CPU at the time an SMI occurs @retval EFI_MM_SAVE_STATE_REGISTER_LMA_32BIT 32 bit. @@ -18,44 +21,18 @@ UINT8 CheckMmSaveStateRegisterLma ( VOID ) { - CPUID_VERSION_INFO_EAX RegEax; - CPUID_EXTENDED_CPU_SIG_EDX RegEdx; - UINTN FamilyId; - UINTN ModelId; - UINT32 Eax; - UINT8 SmmSaveStateRegisterLma; - - // - // Determine the mode of the CPU at the time an SMI occurs - // Intel(R) 64 and IA-32 Architectures Software Developer's Manual - // Volume 3C, Section 34.4.1.1 - // - RegEax.Uint32 = GetCpuFamilyModel (); - FamilyId = RegEax.Bits.FamilyId; - ModelId = RegEax.Bits.Model; - if ((FamilyId == 0x06) || (FamilyId == 0x0f)) { -ModelId = ModelId | RegEax.Bits.ExtendedModelId << 4; - } + UINT8 SmmSaveStateRegisterLma; + UINT32 LMAValue; - RegEdx.Uint32 = 0; - AsmCpuid (CPUID_EXTENDED_FUNCTION, , NULL, NULL, NULL); - if (Eax >= CPUID_EXTENDED_CPU_SIG) { -AsmCpuid (CPUID_EXTENDED_CPU_SIG, NULL, NULL, NULL, &(RegEdx.Uint32)); - } - - SmmSaveStateRegisterLma = EFI_MM_SAVE_STATE_REGISTER_LMA_32BIT; - if (RegEdx.Bits.LM) { -SmmSaveStateRegisterLma = EFI_MM_SAVE_STATE_REGISTER_LMA_64BIT; - } + SmmSaveStateRegisterLma = EFI_SMM_SAVE_STATE_REGISTER_LMA_32BIT; - if (FamilyId == 0x06) { -if ((ModelId == 0x17) || (ModelId == 0x0f) || (ModelId == 0x1c)) { - SmmSaveStateRegisterLma = EFI_MM_SAVE_STATE_REGISTER_LMA_64BIT; -} + LMAValue = (UINT32)AsmReadMsr64 (EFER_ADDRESS) & LMA; + if (LMAValue) { +SmmSaveStateRegisterLma = EFI_SMM_SAVE_STATE_REGISTER_LMA_64BIT; } return SmmSaveStateRegi
Re: [edk2-devel] [PATCH v4 10/13] UefiCpuPkg: Add a new GUID to store the processors resource
Reviewed-by: Ray Ni Thanks, Ray From: Chao Li Sent: Tuesday, April 16, 2024 10:44 To: devel@edk2.groups.io Cc: Ni, Ray ; Kumar, Rahul R ; Gerd Hoffmann Subject: [PATCH v4 10/13] UefiCpuPkg: Add a new GUID to store the processors resource On a multi-processor system, if the BSP dose not know how many APs are online or cannot wake up the AP via broadcast, it can collect AP resouces before wakeing up the AP and add a new HOB to save the processor resouces. Cc: Ray Ni Cc: Rahul Kumar Cc: Gerd Hoffmann Signed-off-by: Chao Li --- .../Include/Guid/ProcessorResourceHob.h | 29 +++ UefiCpuPkg/UefiCpuPkg.dec | 3 ++ 2 files changed, 32 insertions(+) create mode 100644 UefiCpuPkg/Include/Guid/ProcessorResourceHob.h diff --git a/UefiCpuPkg/Include/Guid/ProcessorResourceHob.h b/UefiCpuPkg/Include/Guid/ProcessorResourceHob.h new file mode 100644 index 00..9890cc3ea9 --- /dev/null +++ b/UefiCpuPkg/Include/Guid/ProcessorResourceHob.h @@ -0,0 +1,29 @@ +/** @file + Processor resource HOB + + If BSP does not known how many cores are online or the platform cannot + wake up AP via broadcast, this HOB can be used to store the processor + resource data that may come from ACPI or FDT, etc. + + Copyright (c) 2024, Loongson Technology Corporation Limited. All rights reserved. + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef PROCESSOR_RESOURCE_HOB_H_ +#define PROCESSOR_RESOURCE_HOB_H_ + +#define PROCESSOR_RESOURCE_HOB_GUID \ + { \ +0xb855c7fe, 0xa758, 0x701f, { 0xa7, 0x30, 0x87, 0xf3, 0x9c, 0x03, 0x46, 0x7e } \ + } + +typedef struct { + UINT32NumberOfProcessor; + UINTN ApicId[]; +} PROCESSOR_RESOURCE_DATA; + +extern EFI_GUID gProcessorResourceHobGuid; + +#endif diff --git a/UefiCpuPkg/UefiCpuPkg.dec b/UefiCpuPkg/UefiCpuPkg.dec index 1b890e975c..8ca3b7a5a6 100644 --- a/UefiCpuPkg/UefiCpuPkg.dec +++ b/UefiCpuPkg/UefiCpuPkg.dec @@ -96,6 +96,9 @@ [Guids] ## Include/Guid/MpInformation2.h gMpInformation2HobGuid = { 0x417a7f64, 0xf4e9, 0x4b32, {0x84, 0x6a, 0x5c, 0xc4, 0xd8, 0x62, 0x18, 0x79 }} + ## Include/Guid/ProcessorResourceHob.h + gProcessorResourceHobGuid = { 0xb855c7fe, 0xa758, 0x701f, { 0xa7, 0x30, 0x87, 0xf3, 0x9c, 0x03, 0x46, 0x7e }} + [Protocols] ## Include/Protocol/SmmCpuService.h gEfiSmmCpuServiceProtocolGuid = { 0x1d202cab, 0xc8ab, 0x4d5c, { 0x94, 0xf7, 0x3c, 0xfc, 0xc0, 0xd3, 0xd3, 0x35 }} -- 2.27.0 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#117839): https://edk2.groups.io/g/devel/message/117839 Mute This Topic: https://groups.io/mt/105550160/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH v2 02/10] UefiCpuPkg/SmmRelocationLib: Add SmmRelocationLib library instance
Comments below starting with [Ray.xx] Thanks, Ray /** @@ -30,11 +30,12 @@ SemaphoreHook ( { SMRAM_SAVE_STATE_MAP *CpuState; mRebasedFlag = RebasedFlag; - CpuState = (SMRAM_SAVE_STATE_MAP *)(UINTN)(SMM_DEFAULT_SMBASE + SMRAM_SAVE_STATE_MAP_OFFSET); + CpuState = (SMRAM_SAVE_STATE_MAP *)(UINTN)(SMM_DEFAULT_SMBASE + SMRAM_SAVE_STATE_MAP_OFFSET); [Ray.1] This change is unnecessary. +;--- + +%include "StuffRsbNasm.inc" + +global ASM_PFX(gcSmmInitIdtr) +global ASM_PFX(gcSmmInitGdtr) + +extern ASM_PFX(SmmInitHandler) +extern ASM_PFX(mRebasedFlag) +extern ASM_PFX(mSmmRelocationOriginalAddress) + +global ASM_PFX(gPatchSmmCr3) +global ASM_PFX(gPatchSmmCr4) +global ASM_PFX(gPatchSmmCr0) +global ASM_PFX(gPatchSmmInitStack) +global ASM_PFX(gcSmmInitSize) +global ASM_PFX(gcSmmInitTemplate) [Ray.2] Can you create another patch after this patch to rename the global variables/functions to avoid using the same as PiSmmCpuDxeSmm driver? + +**/ + +#ifndef INTERNAL_SMM_RELOCATION_LIB_H_ +#define INTERNAL_SMM_RELOCATION_LIB_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include [Ray.3] Can you double confirm if all above headers are needed? + +extern UINT64 *mSmBaseForAllCpus; + +extern IA32_DESCRIPTOR gcSmmInitGdtr; +extern IA32_DESCRIPTOR gcSmmInitIdtr; +extern CONST UINT16 gcSmmInitSize; +extern CONST UINT8 gcSmmInitTemplate[]; + +X86_ASSEMBLY_PATCH_LABEL gPatchSmmCr0; +X86_ASSEMBLY_PATCH_LABEL gPatchSmmCr3; +X86_ASSEMBLY_PATCH_LABEL gPatchSmmCr4; +X86_ASSEMBLY_PATCH_LABEL gPatchSmmInitStack; [Ray.4] Can you evaluate what extra changes are required if allowing the lib runs in flash area? Basically all global variables cannot be modified at runtime. +**/ +EFI_STATUS +SplitSmramHobForSmmRelocation ( + IN UINT64SmmRelocationSize, + IN OUT EFI_PHYSICAL_ADDRESS *SmmRelocationStart + ) +{ + EFI_HOB_GUID_TYPE *GuidHob; + EFI_SMRAM_HOB_DESCRIPTOR_BLOCK *DescriptorBlock; + EFI_SMRAM_HOB_DESCRIPTOR_BLOCK *NewDescriptorBlock; + UINTN BufferSize; [Ray.5] How about Block, NewBlock, NewBlockSize? It's simpler and easy to understand. + UINTN SmramRanges; [Ray.6] No need SmramRanges. + + NewDescriptorBlock = NULL; [Ray.7] No need of this line. + + // + // Retrieve the GUID HOB data that contains the set of SMRAM descriptors + // + GuidHob = GetFirstGuidHob (); + if (GuidHob == NULL) { +return EFI_NOT_FOUND; + } + + DescriptorBlock = (EFI_SMRAM_HOB_DESCRIPTOR_BLOCK *)GET_GUID_HOB_DATA (GuidHob); + + // + // Allocate one extra EFI_SMRAM_DESCRIPTOR to describe SMRAM memory that contains a pointer + // to the Smm relocated memory. [Ray.8] "pointer" is a bit confusing. "Allocate one extra EFI_SMRAM_DESCRIPTOR to describe smram carved out for all SMBASE." + // + SmramRanges = DescriptorBlock->NumberOfSmmReservedRegions; + BufferSize = sizeof (EFI_SMRAM_HOB_DESCRIPTOR_BLOCK) + (SmramRanges * sizeof (EFI_SMRAM_DESCRIPTOR)); + + NewDescriptorBlock = (EFI_SMRAM_HOB_DESCRIPTOR_BLOCK *)BuildGuidHob ( + , + BufferSize + ); + ASSERT (NewDescriptorBlock != NULL); + if (NewDescriptorBlock == NULL) { +return EFI_DEVICE_ERROR; + } + + // + // Copy old EFI_SMRAM_HOB_DESCRIPTOR_BLOCK to new allocated region + // + CopyMem ((VOID *)NewDescriptorBlock, DescriptorBlock, BufferSize - sizeof (EFI_SMRAM_DESCRIPTOR)); + + // + // Increase the number of SMRAM descriptors by 1 to make room for the ALLOCATED descriptor of size EFI_PAGE_SIZE + // + NewDescriptorBlock->NumberOfSmmReservedRegions = (UINT32)(SmramRanges + 1); [Ray.9] NewBlock->NumberOfSmmReservedRegions++; + + ASSERT (SmramRanges >= 1); + // + // Copy last entry to the end - we assume TSEG is last entry. + // + CopyMem (>Descriptor[SmramRanges], >Descriptor[SmramRanges - 1], sizeof (EFI_SMRAM_DESCRIPTOR)); + + // + // Update the entry in the array with a size of SmmRelocationSize and put into the ALLOCATED state + // + NewDescriptorBlock->Descriptor[SmramRanges - 1].PhysicalSize = SmmRelocationSize; + NewDescriptorBlock->Descriptor[SmramRanges - 1].RegionState |= EFI_ALLOCATED; + + // + // Return the start address of Smm relocated memory in SMRAM. + // + if (SmmRelocationStart != NULL) { [Ray.10] It's a local function and we know SmmRelocationStart is never NULL. No need the if-check. +EFI_STATUS +CreateSmmBaseHob ( + IN UINT64 *SmBaseForAllCpus + ) +{ + UINTN Index; + SMM_BASE_HOB_DATA *SmmBaseHobData; + UINT32 CpuCount; + UINT32
Re: [edk2-devel] [PATCH v2 01/10] UefiCpuPkg: Add SmmRelocationLib class
Reviewed-by: Ray Ni Thanks, Ray From: Wu, Jiaxin Sent: Monday, April 15, 2024 21:30 To: devel@edk2.groups.io Cc: Ni, Ray ; Zeng, Star ; Gerd Hoffmann ; Kumar, Rahul R Subject: [PATCH v2 01/10] UefiCpuPkg: Add SmmRelocationLib class Intel plans to separate the smbase relocation logic from PiSmmCpuDxeSmm driver, and the related behavior will be moved to the new interface defined by the SmmRelocationLib class. The SmmRelocationLib class provides the SmmRelocationInit() interface for platform to do the smbase relocation, which shall provide below 2 functionalities: 1. Relocate smbases for each processor. 2. Create the gSmmBaseHobGuid HOB. With SmmRelocationLib, PiSmmCpuDxeSmm driver (which runs at a later phase) shall: 1. Consume the gSmmBaseHobGuid HOB for the relocated smbases for each Processor. 2. Execute the early SMM Init. This patch just provides the SmmRelocationLib class. Cc: Ray Ni Cc: Zeng Star Cc: Gerd Hoffmann Cc: Rahul Kumar Signed-off-by: Jiaxin Wu --- UefiCpuPkg/Include/Library/SmmRelocationLib.h | 42 +++ UefiCpuPkg/UefiCpuPkg.dec | 3 ++ 2 files changed, 45 insertions(+) create mode 100644 UefiCpuPkg/Include/Library/SmmRelocationLib.h diff --git a/UefiCpuPkg/Include/Library/SmmRelocationLib.h b/UefiCpuPkg/Include/Library/SmmRelocationLib.h new file mode 100644 index 00..999a5b46d1 --- /dev/null +++ b/UefiCpuPkg/Include/Library/SmmRelocationLib.h @@ -0,0 +1,42 @@ +/** @file + Header file for SMM Relocation Library. + + The SmmRelocationLib class provides the SmmRelocationInit() + interface for platform to do the smbase relocation, which + shall provide below 2 functionalities: + 1. Relocate SmBases for each processor. + 2. Create the SmBase HOB (gSmmBaseHobGuid). + + With SmmRelocationLib, PiSmmCpuDxeSmm driver (which runs at a later phase) + shall: + 1. Consume the gSmmBaseHobGuid for the relocated smbase for each Processor. + 2. Execute early SMM init. + + Copyright (c) 2024, Intel Corporation. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef SMM_RELOCATION_LIB_H_ +#define SMM_RELOCATION_LIB_H_ + +#include + +/** + CPU SmmBase Relocation Init. + + This function is to relocate CPU SmmBase. + + @param[in] MpServices2Pointer to this instance of the MpServices. + + @retval EFI_SUCCESS CPU SmmBase Relocated successfully. + @retval OthersCPU SmmBase Relocation failed. + +**/ +EFI_STATUS +EFIAPI +SmmRelocationInit ( + IN EDKII_PEI_MP_SERVICES2_PPI *MpServices2 + ); + +#endif diff --git a/UefiCpuPkg/UefiCpuPkg.dec b/UefiCpuPkg/UefiCpuPkg.dec index 571b59b36f..1d7890f19e 100644 --- a/UefiCpuPkg/UefiCpuPkg.dec +++ b/UefiCpuPkg/UefiCpuPkg.dec @@ -65,10 +65,13 @@ MmSaveStateLib|Include/Library/MmSaveStateLib.h ## @libraryclass Provides functions for SMM CPU Sync Operation. SmmCpuSyncLib|Include/Library/SmmCpuSyncLib.h + ## @libraryclass Provides functions for SMM Relocation Operation. + SmmRelocationLib|Include/Library/SmmRelocationLib.h + [LibraryClasses.RISCV64] ## @libraryclass Provides functions to manage MMU features on RISCV64 CPUs. ## RiscVMmuLib|Include/Library/BaseRiscVMmuLib.h -- 2.16.2.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#117815): https://edk2.groups.io/g/devel/message/117815 Mute This Topic: https://groups.io/mt/105535805/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH 1/1] MdeModulePkg/XhciDxe: Reset endpoint while USB Transaction error
Liming, Can you give a R-B? Thanks, Ray From: Cai, Xianglei Sent: Friday, April 12, 2024 9:53 To: Lewandowski, Krzysztof ; devel@edk2.groups.io ; Ni, Ray ; Liming Gao Cc: Huang, Jenny ; Shih, More Subject: RE: [PATCH 1/1] MdeModulePkg/XhciDxe: Reset endpoint while USB Transaction error @Ni, Ray<mailto:ray...@intel.com> @Liming Gao<mailto:gaolim...@byosoft.com.cn>Would you like to merge the patch to upstream? Thanks, Xianglei From: Lewandowski, Krzysztof Sent: Thursday, April 11, 2024 9:45 PM To: devel@edk2.groups.io Cc: Ni, Ray ; Liming Gao ; Huang, Jenny ; Shih, More ; Cai, Xianglei Subject: Re: [PATCH 1/1] MdeModulePkg/XhciDxe: Reset endpoint while USB Transaction error Looks good to me. Reviewed-by: Krzysztof Lewandowski mailto:krzysztof.lewandow...@intel.com>> From: Cai, Xianglei mailto:xianglei@intel.com>> Sent: Wednesday, April 10, 2024 09:02 To: devel@edk2.groups.io<mailto:devel@edk2.groups.io> mailto:devel@edk2.groups.io>> Cc: Cai, Xianglei mailto:xianglei@intel.com>>; Ni, Ray mailto:ray...@intel.com>>; Liming Gao mailto:gaolim...@byosoft.com.cn>>; Lewandowski, Krzysztof mailto:krzysztof.lewandow...@intel.com>>; Huang, Jenny mailto:jenny.hu...@intel.com>>; Shih, More mailto:more.s...@intel.com>> Subject: [PATCH 1/1] MdeModulePkg/XhciDxe: Reset endpoint while USB Transaction error https://bugzilla.tianocore.org/show_bug.cgi?id=4556 Based on XHCI spec 4.8.3, software should do the reset endpoint while USB Transaction occur. Also add the error code for USB Transaction error since UEFI spec don't have the related definition. Cc: Ray Ni mailto:ray...@intel.com>> Cc: Liming Gao mailto:gaolim...@byosoft.com.cn>> Cc: Krzysztof Lewandowski mailto:krzysztof.lewandow...@intel.com>> Cc: Jenny Huang mailto:jenny.hu...@intel.com>> Cc: More Shih mailto:more.s...@intel.com>> Signed-off-by: Xianglei Cai mailto:xianglei@intel.com>> --- MdeModulePkg/Bus/Pci/XhciDxe/Xhci.c | 2 +- MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c | 2 +- MdePkg/Include/Protocol/UsbIo.h | 21 +++-- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/MdeModulePkg/Bus/Pci/XhciDxe/Xhci.c b/MdeModulePkg/Bus/Pci/XhciDxe/Xhci.c index f4e61d223c1b..63cc29b26536 100644 --- a/MdeModulePkg/Bus/Pci/XhciDxe/Xhci.c +++ b/MdeModulePkg/Bus/Pci/XhciDxe/Xhci.c @@ -825,7 +825,7 @@ XhcTransfer ( *TransferResult = Urb->Result; *DataLength = Urb->Completed; - if ((*TransferResult == EFI_USB_ERR_STALL) || (*TransferResult == EFI_USB_ERR_BABBLE)) { + if ((*TransferResult == EFI_USB_ERR_STALL) || (*TransferResult == EFI_USB_ERR_BABBLE) || (*TransferResult == EFI_USB_ERR_TRANSACTION)) { ASSERT (Status == EFI_DEVICE_ERROR); RecoveryStatus = XhcRecoverHaltedEndpoint (Xhc, Urb); if (EFI_ERROR (RecoveryStatus)) { diff --git a/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c b/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c index 05528a478baf..e77852f62f10 100644 --- a/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c +++ b/MdeModulePkg/Bus/Pci/XhciDxe/XhciSched.c @@ -1193,7 +1193,7 @@ XhcCheckUrbResult ( goto EXIT; case TRB_COMPLETION_USB_TRANSACTION_ERROR: -CheckedUrb->Result |= EFI_USB_ERR_TIMEOUT; +CheckedUrb->Result |= EFI_USB_ERR_TRANSACTION; CheckedUrb->Finished = TRUE; DEBUG ((DEBUG_ERROR, "XhcCheckUrbResult: TRANSACTION_ERROR! Completecode = %x\n", EvtTrb->Completecode)); goto EXIT; diff --git a/MdePkg/Include/Protocol/UsbIo.h b/MdePkg/Include/Protocol/UsbIo.h index a780b4e07b44..211ef0c94156 100644 --- a/MdePkg/Include/Protocol/UsbIo.h +++ b/MdePkg/Include/Protocol/UsbIo.h @@ -50,16 +50,17 @@ typedef enum { // // USB Transfer Results // -#define EFI_USB_NOERROR 0x00 -#define EFI_USB_ERR_NOTEXECUTE 0x01 -#define EFI_USB_ERR_STALL 0x02 -#define EFI_USB_ERR_BUFFER 0x04 -#define EFI_USB_ERR_BABBLE 0x08 -#define EFI_USB_ERR_NAK 0x10 -#define EFI_USB_ERR_CRC 0x20 -#define EFI_USB_ERR_TIMEOUT 0x40 -#define EFI_USB_ERR_BITSTUFF0x80 -#define EFI_USB_ERR_SYSTEM 0x100 +#define EFI_USB_NOERROR 0x00 +#define EFI_USB_ERR_NOTEXECUTE 0x01 +#define EFI_USB_ERR_STALL0x02 +#define EFI_USB_ERR_BUFFER 0x04 +#define EFI_USB_ERR_BABBLE 0x08 +#define EFI_USB_ERR_NAK 0x10 +#define EFI_USB_ERR_CRC 0x20 +#define EFI_USB_ERR_TIMEOUT 0x40 +#define EFI_USB_ERR_BITSTUFF 0x80 +#define EFI_USB_ERR_SYSTEM 0x100 +#define EFI_USB_ERR_TRANSACTION 0x200 /** Async USB transfer callback routine. -- 2.42.0.windows.2 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent t
Re: [edk2-devel] [PATCH v3 00/13] Part 2 patch set to add LoongArch support into UefiCpuPkg
Chao, I've replied all of your patches. Only for patch "[edk2-devel] [PATCH v3 10/13] UefiCpuPkg: Add a new GUID to store the processors resource", I have one comment. Others look good to me. Thanks, Ray From: Chao Li Sent: Friday, April 12, 2024 15:32 To: devel@edk2.groups.io Cc: Ni, Ray ; Kumar, Rahul R ; Gerd Hoffmann ; Sami Mujawar ; Sunil V L ; Bibo Mao ; Dongyan Qian Subject: [PATCH v3 00/13] Part 2 patch set to add LoongArch support into UefiCpuPkg This patch set adjusted some order in UefiCpuPig alphabetically, added LoongArch libraries and drivers into UefiCpuPkg, it is a continuation of the first patch series v8 submitted at https://edk2.groups.io/g/devel/message/114526. And also separated from https://edk2.groups.io/g/devel/message/116583. This series only contents the changes for UefiCpuPkg. Patch1-Patch4: Reorder some INF files located in UefiCpuPkg alphabetically. Patch5-Patch13: Added Timer, CpuMmuLib, CpuMmuInitLib, MpInitLib, CpuDxe for LoongArch, and added some PCD and header files requested by the above libraries and drivers. Modfied modules: UefiCpuPkg BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=4726 BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=4734 PR: https://github.com/tianocore/edk2/pull/5483 V1 -> V2: 1. Removed PcdCpuMmuIsEnabled. 2. Removed API GetMemoryRegionAttributes API as it is no longer needed. 3. Patch3, added two empty line in DXE and PEI INF files. 4. Patch5, added the Status check in GetTimeInnanoSecond function. 5. Separated into two series, this is series one, and the second one is OvmfPkg. V2 -> V3: 1. Remove CpuMmuInitLib. 2. Added a new GUID HOB named PROCESSOR_RESOURCE_HOG_GUID. 3. Following Ray suggest, adjust CpuMmuLib API, rename the API name. 4. Rename the PcdCpuExceptionVectorBaseAddress to PcdLoongArch64ExceptionVectorBaseAddress. 5. Enable CpuMmio2Dxe in LoongArch. Cc: Ray Ni Cc: Rahul Kumar Cc: Gerd Hoffmann Cc: Sami Mujawar Cc: Sunil V L Cc: Bibo Mao Cc: Dongyan Qian Chao Li (13): UefiCpuPkg/CpuTimerLib: Reorder the INF file alphabetically UefiCpuPkg/CpuExceptionHandlerLib: Reorder the INF files alphabetically UefiCpuPkg/MpInitLib: Reorder the INF files alphabetically UefiCpuPkg/CpuDxe: Reorder the INF file alphabetically UefiCpuPkg: Add LoongArch64 CPU Timer instance UefiCpuPkg: Add CPU exception library for LoongArch UefiCpuPkg: Add CpuMmuLib.h to UefiCpuPkg UefiCpuPkg: Added a new PCD named PcdLoongArchExceptionVectorBaseAddress UefiCpuPkg: Add CpuMmuLib to UefiCpuPkg UefiCpuPkg: Add a new GUID to store the processors resource UefiCpuPkg: Add multiprocessor library for LoongArch64 UefiCpuPkg: Add CpuDxe driver for LoongArch64 UefiCpuPkg/UefiCpuPkg.dsc: Add CpuMmio2Dxe.inf to LoongArch64 field UefiCpuPkg/CpuDxe/CpuDxe.inf | 39 +- UefiCpuPkg/CpuDxe/LoongArch64/CpuDxe.c| 439 + UefiCpuPkg/CpuDxe/LoongArch64/CpuDxe.h| 288 +++ UefiCpuPkg/CpuDxe/LoongArch64/CpuMp.c | 544 ++ UefiCpuPkg/CpuDxe/LoongArch64/Exception.c | 159 ++ .../Include/Guid/ProcessorResourceHob.h | 29 + UefiCpuPkg/Include/Library/CpuMmuLib.h| 41 + .../DxeCpuExceptionHandlerLib.inf | 37 +- .../LoongArch/DxeExceptionLib.c | 198 ++ .../LoongArch/ExceptionCommon.c | 171 ++ .../LoongArch/ExceptionCommon.h | 131 ++ .../LoongArch64/ArchExceptionHandler.c| 268 +++ .../LoongArch64/ExceptionHandlerAsm.S | 366 .../LoongArch/SecPeiExceptionLib.c| 102 ++ .../PeiCpuExceptionHandlerLib.inf | 16 +- .../SecPeiCpuExceptionHandlerLib.inf | 31 +- .../SmmCpuExceptionHandlerLib.inf | 16 +- UefiCpuPkg/Library/CpuMmuLib/CpuMmuLib.inf| 39 + UefiCpuPkg/Library/CpuMmuLib/CpuMmuLib.uni| 14 + .../Library/CpuMmuLib/LoongArch64/CpuMmu.c| 785 .../Library/CpuMmuLib/LoongArch64/Page.h | 33 + .../LoongArch64/TlbExceptionHandle.S | 51 + .../LoongArch64/TlbExceptionHandle.h | 36 + .../CpuMmuLib/LoongArch64/TlbInvalid.S| 24 + .../CpuMmuLib/LoongArch64/TlbInvalid.h| 24 + .../Library/CpuTimerLib/BaseCpuTimerLib.inf | 17 +- .../CpuTimerLib/LoongArch64/CpuTimerLib.c | 250 +++ UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf | 42 +- .../Library/MpInitLib/LoongArch64/DxeMpLib.c | 480 + .../Library/MpInitLib/LoongArch64/MpLib.c | 1626 + .../Library/MpInitLib/LoongArch64/MpLib.h | 350 .../Library/MpInitLib/LoongArch64/PeiMpLib.c | 381 UefiCpuPkg/Library/MpInitLib/PeiMpInitLib.inf | 40 +- UefiCpuPkg/UefiCpuPkg.dec | 13 + UefiCpuPkg/UefiCpuPkg.dsc |7 + 35 files changed, 7008 insertions(+), 79 deletions(-) create mode 100644 UefiCpuPkg/CpuDxe/LoongArch64/CpuDxe.c create mode 100644 UefiCpuPkg/Cp
Re: [edk2-devel] [PATCH v3 13/13] UefiCpuPkg/UefiCpuPkg.dsc: Add CpuMmio2Dxe.inf to LoongArch64 field
Reviewed-by: Ray Ni Thanks, Ray From: Chao Li Sent: Friday, April 12, 2024 15:34 To: devel@edk2.groups.io Cc: Ni, Ray ; Kumar, Rahul R ; Gerd Hoffmann Subject: [PATCH v3 13/13] UefiCpuPkg/UefiCpuPkg.dsc: Add CpuMmio2Dxe.inf to LoongArch64 field LoongArch64 requires CpuMmio2Dxe, add it into LoongArch64 field. Cc: Ray Ni Cc: Rahul Kumar Cc: Gerd Hoffmann Signed-off-by: Chao Li --- UefiCpuPkg/UefiCpuPkg.dsc | 1 + 1 file changed, 1 insertion(+) diff --git a/UefiCpuPkg/UefiCpuPkg.dsc b/UefiCpuPkg/UefiCpuPkg.dsc index e92ceb6466..1af5a0c525 100644 --- a/UefiCpuPkg/UefiCpuPkg.dsc +++ b/UefiCpuPkg/UefiCpuPkg.dsc @@ -213,6 +213,7 @@ [Components.RISCV64] [Components.LOONGARCH64] UefiCpuPkg/Library/CpuMmuLib/CpuMmuLib.inf + UefiCpuPkg/CpuMmio2Dxe/CpuMmio2Dxe.inf [BuildOptions] *_*_*_CC_FLAGS = -D DISABLE_NEW_DEPRECATED_INTERFACES -- 2.27.0 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#117743): https://edk2.groups.io/g/devel/message/117743 Mute This Topic: https://groups.io/mt/105478504/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH v3 09/13] UefiCpuPkg: Add CpuMmuLib to UefiCpuPkg
Acked-by: Ray Ni Thanks, Ray From: Chao Li Sent: Friday, April 12, 2024 15:34 To: devel@edk2.groups.io Cc: Ni, Ray ; Kumar, Rahul R ; Gerd Hoffmann ; Baoqi Zhang ; Dongyan Qian ; Xianglai Li ; Bibo Mao Subject: [PATCH v3 09/13] UefiCpuPkg: Add CpuMmuLib to UefiCpuPkg Add a new base library named CpuMmuLib and add a LoongArch64 instance with in the library. BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=4734 Cc: Ray Ni Cc: Rahul Kumar Cc: Gerd Hoffmann Signed-off-by: Chao Li Co-authored-by: Baoqi Zhang Co-authored-by: Dongyan Qian Co-authored-by: Xianglai Li Co-authored-by: Bibo Mao Acked-by: Gerd Hoffmann --- UefiCpuPkg/Library/CpuMmuLib/CpuMmuLib.inf| 39 + UefiCpuPkg/Library/CpuMmuLib/CpuMmuLib.uni| 14 + .../Library/CpuMmuLib/LoongArch64/CpuMmu.c| 785 ++ .../Library/CpuMmuLib/LoongArch64/Page.h | 33 + .../LoongArch64/TlbExceptionHandle.S | 51 ++ .../LoongArch64/TlbExceptionHandle.h | 36 + .../CpuMmuLib/LoongArch64/TlbInvalid.S| 24 + .../CpuMmuLib/LoongArch64/TlbInvalid.h| 24 + UefiCpuPkg/UefiCpuPkg.dsc | 3 + 9 files changed, 1009 insertions(+) create mode 100644 UefiCpuPkg/Library/CpuMmuLib/CpuMmuLib.inf create mode 100644 UefiCpuPkg/Library/CpuMmuLib/CpuMmuLib.uni create mode 100644 UefiCpuPkg/Library/CpuMmuLib/LoongArch64/CpuMmu.c create mode 100644 UefiCpuPkg/Library/CpuMmuLib/LoongArch64/Page.h create mode 100644 UefiCpuPkg/Library/CpuMmuLib/LoongArch64/TlbExceptionHandle.S create mode 100644 UefiCpuPkg/Library/CpuMmuLib/LoongArch64/TlbExceptionHandle.h create mode 100644 UefiCpuPkg/Library/CpuMmuLib/LoongArch64/TlbInvalid.S create mode 100644 UefiCpuPkg/Library/CpuMmuLib/LoongArch64/TlbInvalid.h diff --git a/UefiCpuPkg/Library/CpuMmuLib/CpuMmuLib.inf b/UefiCpuPkg/Library/CpuMmuLib/CpuMmuLib.inf new file mode 100644 index 00..5eecfb4838 --- /dev/null +++ b/UefiCpuPkg/Library/CpuMmuLib/CpuMmuLib.inf @@ -0,0 +1,39 @@ +## @file +# CPU Memory Manager Unit library instance. +# +# Copyright (c) 2024 Loongson Technology Corporation Limited. All rights reserved. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION= 1.29 + BASE_NAME = CpuMmuLib + MODULE_UNI_FILE= CpuMmuLib.uni + FILE_GUID = DA8F0232-FB14-42F0-922C-63104D2C70BE + MODULE_TYPE= BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = CpuMmuLib + +# +# VALID_ARCHITECTURES = LOONGARCH64 +# + +[Sources.LoongArch64] + LoongArch64/TlbInvalid.S | GCC + LoongArch64/TlbExceptionHandle.S | GCC + LoongArch64/CpuMmu.c + LoongArch64/Page.h + LoongArch64/TlbInvalid.h + +[Packages] + MdePkg/MdePkg.dec + UefiCpuPkg/UefiCpuPkg.dec + +[LibraryClasses] + DebugLib + MemoryAllocationLib + +[Pcd.LoongArch64] + gUefiCpuPkgTokenSpaceGuid.PcdLoongArchExceptionVectorBaseAddress ## CONSUMES diff --git a/UefiCpuPkg/Library/CpuMmuLib/CpuMmuLib.uni b/UefiCpuPkg/Library/CpuMmuLib/CpuMmuLib.uni new file mode 100644 index 00..2408f2f90b --- /dev/null +++ b/UefiCpuPkg/Library/CpuMmuLib/CpuMmuLib.uni @@ -0,0 +1,14 @@ +// /** @file +// CPU Memory Manager Unit library instance. +// +// CPU Memory Manager Unit library instance. +// +// Copyright (c) 2024, Loongson Technology Corporation Limited. All rights reserved. +// +// SPDX-License-Identifier: BSD-2-Clause-Patent +// +// **/ + +#string STR_MODULE_ABSTRACT #language en-US "CPU Memory Manager Unit library instance." + +#string STR_MODULE_DESCRIPTION #language en-US "CPU Memory Manager Unit library instance." diff --git a/UefiCpuPkg/Library/CpuMmuLib/LoongArch64/CpuMmu.c b/UefiCpuPkg/Library/CpuMmuLib/LoongArch64/CpuMmu.c new file mode 100644 index 00..6d77a1221f --- /dev/null +++ b/UefiCpuPkg/Library/CpuMmuLib/LoongArch64/CpuMmu.c @@ -0,0 +1,785 @@ +/** @file + + CPU Memory Map Unit Handler Library common functions. + + Copyright (c) 2011-2020, ARM Limited. All rights reserved. + Copyright (c) 2016, Linaro Limited. All rights reserved. + Copyright (c) 2017, Intel Corporation. All rights reserved. + Copyright (c) 2023, Ventana Micro Systems Inc. All Rights Reserved. + Copyright (c) 2024 Loongson Technology Corporation Limited. All rights reserved. + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "TlbInvalid.h" +#include "TlbExceptionHandle.h" +#include "Page.h" + +/** + Check to see if mmu successfully initializes. + + @param VOID. + + @retval TRUE Initialization has been completed. + FALSE Initialization did not complete. +**/ +STATIC +BOOLEAN +MmuIsInit ( + VOID + ) +{ + if (CsrRead (LOONGARCH_CSR_PGDL) != 0) { +retur
Re: [edk2-devel] [PATCH v3 08/13] UefiCpuPkg: Added a new PCD named PcdLoongArchExceptionVectorBaseAddress
Reviewed-by: Ray Ni Thanks, Ray From: Chao Li Sent: Friday, April 12, 2024 15:34 To: devel@edk2.groups.io Cc: Ni, Ray ; Kumar, Rahul R ; Gerd Hoffmann Subject: [PATCH v3 08/13] UefiCpuPkg: Added a new PCD named PcdLoongArchExceptionVectorBaseAddress Added PcdLoongArchExceptionVectorBaseAddress use for storing the CPU exception vector base address. This PCD can be populated at build time or changed at runtime, and is used only by LoongArch. BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=4734 Cc: Ray Ni Cc: Rahul Kumar Cc: Gerd Hoffmann Signed-off-by: Chao Li Acked-by: Gerd Hoffmann --- UefiCpuPkg/UefiCpuPkg.dec | 6 ++ 1 file changed, 6 insertions(+) diff --git a/UefiCpuPkg/UefiCpuPkg.dec b/UefiCpuPkg/UefiCpuPkg.dec index ca744fab55..1b890e975c 100644 --- a/UefiCpuPkg/UefiCpuPkg.dec +++ b/UefiCpuPkg/UefiCpuPkg.dec @@ -3,6 +3,7 @@ # # Copyright (c) 2007 - 2023, Intel Corporation. All rights reserved. # Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved. +# Copyright (c) 2024, Loongson Technology Corporation Limited. All rights reserved. # # SPDX-License-Identifier: BSD-2-Clause-Patent # @@ -414,6 +415,11 @@ [PcdsFixedAtBuild.RISCV64] # 10 - 57bit mode. gUefiCpuPkgTokenSpaceGuid.PcdCpuRiscVMmuMaxSatpMode|10|UINT32|0x6021 +[PcdsFixedAtBuild.LOONGARCH64, PcdsPatchableInModule.LOONGARCH64, PcdsDynamic.LOONGARCH64, PcdsDynamicEx.LOONGARCH64] + ## This PCD Contains the pointer to a CPU exception vector base address. + # @Prompt The pointer to a CPU exception vector base address. + gUefiCpuPkgTokenSpaceGuid.PcdLoongArchExceptionVectorBaseAddress|0x0|UINT64|0x6022 + [PcdsDynamic, PcdsDynamicEx] ## Contains the pointer to a CPU S3 data buffer of structure ACPI_CPU_DATA. # @Prompt The pointer to a CPU S3 data buffer. -- 2.27.0 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#117740): https://edk2.groups.io/g/devel/message/117740 Mute This Topic: https://groups.io/mt/105478499/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH v3 07/13] UefiCpuPkg: Add CpuMmuLib.h to UefiCpuPkg
Reviewed-by: Ray Ni Thanks, Ray From: Chao Li Sent: Friday, April 12, 2024 15:34 To: devel@edk2.groups.io Cc: Ni, Ray ; Kumar, Rahul R ; Gerd Hoffmann ; Leif Lindholm ; Ard Biesheuvel ; Sami Mujawar ; Sunil V L ; Warkentin, Andrei Subject: [PATCH v3 07/13] UefiCpuPkg: Add CpuMmuLib.h to UefiCpuPkg Add a new header file CpuMmuLib.h, whitch is referenced from ArmPkg/Include/Library/ArmMmuLib.h. Currently, only support for LoongArch64 is added, and more architectures can be accommodated in the future. BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=4734 Cc: Ray Ni Cc: Rahul Kumar Cc: Gerd Hoffmann Cc: Leif Lindholm Cc: Ard Biesheuvel Cc: Sami Mujawar Cc: Sunil V L Cc: Andrei Warkentin Signed-off-by: Chao Li Acked-by: Gerd Hoffmann --- UefiCpuPkg/Include/Library/CpuMmuLib.h | 41 ++ UefiCpuPkg/UefiCpuPkg.dec | 4 +++ 2 files changed, 45 insertions(+) create mode 100644 UefiCpuPkg/Include/Library/CpuMmuLib.h diff --git a/UefiCpuPkg/Include/Library/CpuMmuLib.h b/UefiCpuPkg/Include/Library/CpuMmuLib.h new file mode 100644 index 00..e6cfbd5168 --- /dev/null +++ b/UefiCpuPkg/Include/Library/CpuMmuLib.h @@ -0,0 +1,41 @@ +/** @file + + Copyright (c) 2024 Loongson Technology Corporation Limited. All rights reserved. + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef CPU_MMU_LIB_H_ +#define CPU_MMU_LIB_H_ + +#include + +/** + Maps the memory region in the page table to the specified attributes. + + @param[in, out] PageTable The pointer to the page table to update, or pointer to NULL + if a new page table is to be created. + @param[in] PageWalkCfgThe page walk controller configure. + @param[in] BaseAddressThe base address of the memory region to set the Attributes. + @param[in] Length The length of the memory region to set the Attributes. + @param[in] Attributes The bitmask of attributes to set, which refer to UEFI SPEC + 7.2.3(EFI_BOOT_SERVICES.GetMemoryMap()). + @param[in] AttributeMask Mask of memory attributes to take into account. + + @retval EFI_SUCCESSThe Attributes was set successfully or Length is 0. + @retval EFI_INVALID_PARAMETER PageTable is NULL. + @retval EFI_UNSUPPORTED*PageTable is NULL. +**/ +EFI_STATUS +EFIAPI +MemoryRegionMap ( + IN OUT UINTN *PageTable OPTIONAL, + IN UINT64PageWalkCfg, + IN EFI_PHYSICAL_ADDRESS BaseAddress, + IN UINT64Length, + IN UINT64Attributes, + IN UINT64AttributeMask + ); + +#endif // CPU_MMU_LIB_H_ diff --git a/UefiCpuPkg/UefiCpuPkg.dec b/UefiCpuPkg/UefiCpuPkg.dec index 571b59b36f..ca744fab55 100644 --- a/UefiCpuPkg/UefiCpuPkg.dec +++ b/UefiCpuPkg/UefiCpuPkg.dec @@ -72,6 +72,10 @@ [LibraryClasses.RISCV64] ## RiscVMmuLib|Include/Library/BaseRiscVMmuLib.h +[LibraryClasses.LoongArch64] + ## @libraryclass Provides functions for the memory management unit. + CpuMmuLib|Include/Library/CpuMmuLib.h + [Guids] gUefiCpuPkgTokenSpaceGuid = { 0xac05bf33, 0x995a, 0x4ed4, { 0xaa, 0xb8, 0xef, 0x7a, 0xe8, 0xf, 0x5c, 0xb0 }} gMsegSmramGuid = { 0x5802bce4, 0x, 0x4e33, { 0xa1, 0x30, 0xeb, 0xad, 0x27, 0xf0, 0xe4, 0x39 }} -- 2.27.0 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#117739): https://edk2.groups.io/g/devel/message/117739 Mute This Topic: https://groups.io/mt/105478496/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH v3 10/13] UefiCpuPkg: Add a new GUID to store the processors resource
+ +typedef struct { + UINT32NumberOfProcessor; + UINTN *ApicId; [Ray] How about "UINTN ApicId[]"? The difference between the two is your version contains an 8-byte pointer pointing to somewhere else. My version implies the APIC ID array is just after "NumberOfProcessor". -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#117738): https://edk2.groups.io/g/devel/message/117738 Mute This Topic: https://groups.io/mt/105478501/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH v1 13/13] UefiCpuPkg/PiSmmCpuDxeSmm: Remove SmBases relocation logic
@@ -348,14 +336,10 @@ SmmInitHandler ( [Ray.1] Can you rename this function to a different name? Originally it was really a handler to initialize SMM env called from SmmInit.nasm. But today it's purely to initialize the SMM env. How about "InitializeSmm"? And "EFIAPI" is not needed as it's not called from ASEMBLY anymore. { UINT32 ApicId; UINTNIndex; BOOLEAN IsBsp; - // - // Update SMM IDT entries' code segment and load IDT - // - AsmWriteIdtr (); [Ray.2] OK. The IDTR update is needed when it's called from SmmInit.nasm as IDTR is not updated there. But it's not needed when it's called from SmmEntry.nasm as IDTR is updated there. Other changes look good to me. From: Wu, Jiaxin Sent: Wednesday, April 10, 2024 21:57 To: devel@edk2.groups.io Cc: Ni, Ray ; Zeng, Star ; Gerd Hoffmann ; Kumar, Rahul R Subject: [PATCH v1 13/13] UefiCpuPkg/PiSmmCpuDxeSmm: Remove SmBases relocation logic This patch is to remove legacy SmBase relocation in PiSmmCpuDxeSmm Driver, and the SmBase relocation behavior will be in the SmmRelocationInit interface: 1. Relocate smbases for each processor. 2. Create the gSmmBaseHobGuid HOB. Then, PiSmmCpuDxeSmm driver can be simplified to: 1. Consume the gSmmBaseHobGuid for the smbase. 2. ExecuteFirstSmiInit for early SMM Init. Cc: Ray Ni Cc: Zeng Star Cc: Gerd Hoffmann Cc: Rahul Kumar Signed-off-by: Jiaxin Wu --- UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c| 21 +- UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/Semaphore.c | 42 UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmmInit.nasm | 96 UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c| 6 +- UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c | 322 ++- UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h | 98 UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf | 4 - UefiCpuPkg/PiSmmCpuDxeSmm/SmramSaveState.c | 69 -- UefiCpuPkg/PiSmmCpuDxeSmm/X64/Semaphore.c| 69 -- UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmInit.nasm | 146 10 files changed, 30 insertions(+), 843 deletions(-) delete mode 100644 UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/Semaphore.c delete mode 100644 UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmmInit.nasm delete mode 100644 UefiCpuPkg/PiSmmCpuDxeSmm/X64/Semaphore.c delete mode 100644 UefiCpuPkg/PiSmmCpuDxeSmm/X64/SmmInit.nasm diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c b/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c index b14c289a27..d67fb49890 100644 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c @@ -639,27 +639,14 @@ InitializeCpuProcedure ( // InitializeCpuBeforeRebase (IsBsp); } if (IsBsp) { -DEBUG ((DEBUG_INFO, "SmmRestoreCpu: mSmmRelocated is %d\n", mSmmRelocated)); - // -// Check whether Smm Relocation is done or not. -// If not, will do the SmmBases Relocation here!!! +// Issue SMI IPI (All Excluding Self SMM IPI + BSP SMM IPI) to execute first SMI init. // -if (!mSmmRelocated) { - // - // Restore SMBASE for BSP and all APs - // - SmmRelocateBases (); -} else { - // - // Issue SMI IPI (All Excluding Self SMM IPI + BSP SMM IPI) to execute first SMI init. - // - ExecuteFirstSmiInit (); -} +ExecuteFirstSmiInit (); } // // Skip initialization if mAcpiCpuData is not valid // @@ -978,13 +965,13 @@ InitSmmS3ResumeState ( SmmS3ResumeState->SmmS3StackBase = (EFI_PHYSICAL_ADDRESS)(UINTN)AllocatePages (EFI_SIZE_TO_PAGES ((UINTN)SmmS3ResumeState->SmmS3StackSize)); if (SmmS3ResumeState->SmmS3StackBase == 0) { SmmS3ResumeState->SmmS3StackSize = 0; } -SmmS3ResumeState->SmmS3Cr0 = mSmmCr0; +SmmS3ResumeState->SmmS3Cr0 = (UINT32)AsmReadCr0 (); SmmS3ResumeState->SmmS3Cr3 = Cr3; -SmmS3ResumeState->SmmS3Cr4 = mSmmCr4; +SmmS3ResumeState->SmmS3Cr4 = (UINT32)AsmReadCr4 (); if (sizeof (UINTN) == sizeof (UINT64)) { SmmS3ResumeState->Signature = SMM_S3_RESUME_SMM_64; } diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/Semaphore.c b/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/Semaphore.c deleted file mode 100644 index a9fcc89dda..00 --- a/UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/Semaphore.c +++ /dev/null @@ -1,42 +0,0 @@ -/** @file -Semaphore mechanism to indicate to the BSP that an AP has exited SMM -after SMBASE relocation. - -Copyright (c) 2009 - 2015, Intel Corporation. All rights reserved. -SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - -#include "PiSmmCpuDxeSmm.h" - -UINTN mSmmRelocationOriginalAddress; -volatile BOOLEAN *mRebasedFlag; - -/** - Hook return address of SMM Save State so that semaphore code - can be executed immediately after AP exits SMM to indicate to - the BSP that an AP has exited SMM after SMBASE relocation. - - @param[in] CpuIndex The processor index. - @param[in] RebasedFlag A pointer to a flag that is set to TRUE - imm
Re: [edk2-devel] [PATCH v1 12/13] OvmfPkg/PlatformPei: Relocate SmBases in PEI phase
+STATIC CONST EFI_PEI_NOTIFY_DESCRIPTOR mMpServices2Notify = { + EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | // Flags + EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST, + , // Guid + OnMpServices2Available // Notify +}; + +VOID +InstallSmmRelocationCallback ( [Ray.1] This function name is confusing. It's like installing a callback when smm relocation happens. How about "RelocateSmBase"? + VOID + ) +{ + EFI_STATUS Status; + + Status = PeiServicesNotifyPpi (); + if (EFI_ERROR (Status)) { +DEBUG (( + DEBUG_ERROR, + "%a: failed to set up MP Services2 callback: %r\n", + __func__, + Status + )); + } +} -- 2.16.2.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#117625): https://edk2.groups.io/g/devel/message/117625 Mute This Topic: https://groups.io/mt/105442006/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH v1 11/13] OvmfPkg/SmmCpuFeaturesLib: Check Smbase Relocation is done or not
Reviewed-by: Ray Ni Thanks, Ray From: Wu, Jiaxin Sent: Wednesday, April 10, 2024 21:57 To: devel@edk2.groups.io Cc: Ard Biesheuvel ; Yao, Jiewen ; Gerd Hoffmann ; Ni, Ray Subject: [PATCH v1 11/13] OvmfPkg/SmmCpuFeaturesLib: Check Smbase Relocation is done or not Based on gSmmBaseHobGuid: If gSmmBaseHobGuid found, means SmBase info has been relocated and recorded in the SmBase array. So, this patch check smbase relocation is done or not in SmmCpuFeaturesInitializeProcessor(). With SmmRelocationLib, gSmmBaseHobGuid will be always created. Here this patch just makes the function/logic correct. The SMM Relocation logic can be totally cleaned from the SmmCpuFeaturesLib. But it will happen in the future patch set, this patch does not target to the cleanup work. Cc: Ard Biesheuvel Cc: Jiewen Yao Cc: Gerd Hoffmann Cc: Ray Ni Signed-off-by: Jiaxin Wu --- .../Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c | 33 ++ 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c b/OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c index 63822b126e..0a6f33c2b1 100644 --- a/OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c +++ b/OvmfPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c @@ -26,10 +26,16 @@ // // EFER register LMA bit // #define LMA BIT10 +// +// Indicate SmBase for each Processors has been relocated or not. If TRUE, +// means no need to do the relocation in SmmCpuFeaturesInitializeProcessor(). +// +BOOLEAN mSmmCpuFeaturesSmmRelocated; + /** The constructor function @param[in] ImageHandle The firmware allocated handle for the EFI image. @param[in] SystemTable A pointer to the EFI System Table. @@ -44,13 +50,13 @@ SmmCpuFeaturesLibConstructor ( IN EFI_SYSTEM_TABLE *SystemTable ) { // // If gSmmBaseHobGuid found, means SmBase info has been relocated and recorded - // in the SmBase array. ASSERT it's not supported in OVMF. + // in the SmBase array. // - ASSERT (GetFirstGuidHob () == NULL); + mSmmCpuFeaturesSmmRelocated = (BOOLEAN)(GetFirstGuidHob () != NULL); // // No need to program SMRRs on our virtual platform. // return EFI_SUCCESS; @@ -90,20 +96,25 @@ SmmCpuFeaturesInitializeProcessor ( ) { AMD_SMRAM_SAVE_STATE_MAP *CpuState; // - // Configure SMBASE. + // No need to configure SMBASE if SmBase relocation has been done. // - CpuState = (AMD_SMRAM_SAVE_STATE_MAP *)(UINTN)( - SMM_DEFAULT_SMBASE + - SMRAM_SAVE_STATE_MAP_OFFSET - ); - if ((CpuState->x86.SMMRevId & 0x) == 0) { -CpuState->x86.SMBASE = (UINT32)CpuHotPlugData->SmBase[CpuIndex]; - } else { -CpuState->x64.SMBASE = (UINT32)CpuHotPlugData->SmBase[CpuIndex]; + if (!mSmmCpuFeaturesSmmRelocated) { +// +// Configure SMBASE. +// +CpuState = (AMD_SMRAM_SAVE_STATE_MAP *)(UINTN)( + SMM_DEFAULT_SMBASE + + SMRAM_SAVE_STATE_MAP_OFFSET + ); +if ((CpuState->x86.SMMRevId & 0x) == 0) { + CpuState->x86.SMBASE = (UINT32)CpuHotPlugData->SmBase[CpuIndex]; +} else { + CpuState->x64.SMBASE = (UINT32)CpuHotPlugData->SmBase[CpuIndex]; +} } // // No need to program SMRRs on our virtual platform. // -- 2.16.2.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#117624): https://edk2.groups.io/g/devel/message/117624 Mute This Topic: https://groups.io/mt/105442004/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH v1 09/13] OvmfPkg/SmmAccess: Consume gEfiSmmSmramMemoryGuid
Do you think it makes sense to combine this with #10? Otherwise, with this patch the OVMF is broken. Thanks, Ray From: Wu, Jiaxin Sent: Wednesday, April 10, 2024 21:57 To: devel@edk2.groups.io Cc: Ard Biesheuvel ; Yao, Jiewen ; Gerd Hoffmann ; Ni, Ray Subject: [PATCH v1 09/13] OvmfPkg/SmmAccess: Consume gEfiSmmSmramMemoryGuid This patch refines the SmmAccess implementation: 1. SmramMap will be retrieved from the gEfiSmmSmramMemoryGuid instead of original from the TSEG Memory Base register. 2. Remove the gEfiAcpiVariableGuid creation, thus the DESCRIPTOR_INDEX definition can be also cleaned. The gEfiAcpiVariableGuid HOB will be created in the OvmfPkg/Library/PlatformInitLib/PlatformInitLib.inf. Cc: Ard Biesheuvel Cc: Jiewen Yao Cc: Gerd Hoffmann Cc: Ray Ni Signed-off-by: Jiaxin Wu --- OvmfPkg/SmmAccess/SmmAccess2Dxe.c | 4 +- OvmfPkg/SmmAccess/SmmAccess2Dxe.inf | 5 +++ OvmfPkg/SmmAccess/SmmAccessPei.c| 88 +++-- OvmfPkg/SmmAccess/SmmAccessPei.inf | 7 +-- OvmfPkg/SmmAccess/SmramInternal.c | 73 +++--- OvmfPkg/SmmAccess/SmramInternal.h | 18 +--- 6 files changed, 41 insertions(+), 154 deletions(-) diff --git a/OvmfPkg/SmmAccess/SmmAccess2Dxe.c b/OvmfPkg/SmmAccess/SmmAccess2Dxe.c index 4b9e6df37f..3371592de7 100644 --- a/OvmfPkg/SmmAccess/SmmAccess2Dxe.c +++ b/OvmfPkg/SmmAccess/SmmAccess2Dxe.c @@ -4,11 +4,11 @@ Q35 TSEG is expected to have been verified and set up by the SmmAccessPei driver. Copyright (C) 2013, 2015, Red Hat, Inc. - Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved. + Copyright (c) 2009 - 2024, Intel Corporation. All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -113,12 +113,10 @@ SmmAccess2DxeGetCapabilities ( IN OUT UINTN *SmramMapSize, IN OUT EFI_SMRAM_DESCRIPTOR*SmramMap ) { return SmramAccessGetCapabilities ( - This->LockState, - This->OpenState, SmramMapSize, SmramMap ); } diff --git a/OvmfPkg/SmmAccess/SmmAccess2Dxe.inf b/OvmfPkg/SmmAccess/SmmAccess2Dxe.inf index d86381d0fb..d9f01a13c4 100644 --- a/OvmfPkg/SmmAccess/SmmAccess2Dxe.inf +++ b/OvmfPkg/SmmAccess/SmmAccess2Dxe.inf @@ -3,10 +3,11 @@ # # Q35 TSEG is expected to have been verified and set up by the SmmAccessPei # driver. # # Copyright (C) 2013, 2015, Red Hat, Inc. +# Copyright (c) 2024 Intel Corporation. # # SPDX-License-Identifier: BSD-2-Clause-Patent # ## @@ -39,17 +40,21 @@ DebugLib PcdLib PciLib UefiBootServicesTableLib UefiDriverEntryPoint + HobLib [Protocols] gEfiSmmAccess2ProtocolGuid ## PRODUCES [FeaturePcd] gUefiOvmfPkgTokenSpaceGuid.PcdSmmSmramRequire +[Guids] + gEfiSmmSmramMemoryGuid # ALWAYS_CONSUMED + [Pcd] gUefiOvmfPkgTokenSpaceGuid.PcdQ35SmramAtDefaultSmbase gUefiOvmfPkgTokenSpaceGuid.PcdQ35TsegMbytes [Depex] diff --git a/OvmfPkg/SmmAccess/SmmAccessPei.c b/OvmfPkg/SmmAccess/SmmAccessPei.c index 0e57b7804c..9459bcc989 100644 --- a/OvmfPkg/SmmAccess/SmmAccessPei.c +++ b/OvmfPkg/SmmAccess/SmmAccessPei.c @@ -9,21 +9,19 @@ This PEIM runs from RAM, so we can write to variables with static storage duration. Copyright (C) 2013, 2015, Red Hat, Inc. - Copyright (c) 2010, Intel Corporation. All rights reserved. + Copyright (c) 2010 - 2024, Intel Corporation. All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent **/ -#include #include #include #include -#include #include #include #include #include #include @@ -62,14 +60,10 @@ SmmAccessPeiOpen ( IN EFI_PEI_SERVICES**PeiServices, IN PEI_SMM_ACCESS_PPI *This, IN UINTN DescriptorIndex ) { - if (DescriptorIndex >= DescIdxCount) { -return EFI_INVALID_PARAMETER; - } - // // According to current practice, DescriptorIndex is not considered at all, // beyond validating it. // return SmramAccessOpen (>LockState, >OpenState); @@ -100,14 +94,10 @@ SmmAccessPeiClose ( IN EFI_PEI_SERVICES**PeiServices, IN PEI_SMM_ACCESS_PPI *This, IN UINTN DescriptorIndex ) { - if (DescriptorIndex >= DescIdxCount) { -return EFI_INVALID_PARAMETER; - } - // // According to current practice, DescriptorIndex is not considered at all, // beyond validating it. // return SmramAccessClose (>LockState, >OpenState); @@ -137,14 +127,10 @@ SmmAccessPeiLock ( IN EFI_PEI_SERVICES**PeiServices, IN PEI_SMM_ACCESS_PPI *This, IN UINTN DescriptorIndex ) { - if (DescriptorIndex >= DescIdxCount) { -return EFI_INVALID_PARAMETER; - } - // // According to current practice, DescriptorIndex is not considered at all, // beyond validating it. // return SmramAccessLock (>LockState, >OpenState); @@ -176,12 +162,10 @@ SmmAccessPei
Re: [edk2-devel] [PATCH v1 10/13] OvmfPkg/PlatformInitLib: Create gEfiAcpiVariableGuid
Which patch removes this HOB creation from SmmAccess driver? Thanks, Ray From: Wu, Jiaxin Sent: Wednesday, April 10, 2024 21:57 To: devel@edk2.groups.io Cc: Ard Biesheuvel ; Yao, Jiewen ; Gerd Hoffmann ; Ni, Ray Subject: [PATCH v1 10/13] OvmfPkg/PlatformInitLib: Create gEfiAcpiVariableGuid This patch is for OVMF to create the gEfiAcpiVariableGuid since it has been removed from the SmmAccess driver. Cc: Ard Biesheuvel Cc: Jiewen Yao Cc: Gerd Hoffmann Cc: Ray Ni Signed-off-by: Jiaxin Wu --- OvmfPkg/Library/PlatformInitLib/MemDetect.c | 9 + OvmfPkg/Library/PlatformInitLib/PlatformInitLib.inf | 1 + 2 files changed, 10 insertions(+) diff --git a/OvmfPkg/Library/PlatformInitLib/MemDetect.c b/OvmfPkg/Library/PlatformInitLib/MemDetect.c index 8b98256225..f451c9d80c 100644 --- a/OvmfPkg/Library/PlatformInitLib/MemDetect.c +++ b/OvmfPkg/Library/PlatformInitLib/MemDetect.c @@ -41,10 +41,11 @@ Module Name: #include #include #include +#include #include #define MEGABYTE_SHIFT 20 VOID @@ -1050,10 +1051,11 @@ PlatformQemuInitializeRam ( UINT32 TsegSize; UINTN BufferSize; UINT8 SmramRanges; EFI_PEI_HOB_POINTERSHob; EFI_SMRAM_HOB_DESCRIPTOR_BLOCK *SmramHobDescriptorBlock; +VOID*GuidHob; TsegSize = PlatformInfoHob->Q35TsegMbytes * SIZE_1MB; PlatformAddMemoryRangeHob (BASE_1MB, PlatformInfoHob->LowMemory - TsegSize); PlatformAddReservedMemoryBaseSizeHob ( PlatformInfoHob->LowMemory - TsegSize, @@ -1080,10 +1082,17 @@ PlatformQemuInitializeRam ( SmramHobDescriptorBlock->Descriptor[0].PhysicalStart = PlatformInfoHob->LowMemory - TsegSize; SmramHobDescriptorBlock->Descriptor[0].CpuStart = PlatformInfoHob->LowMemory - TsegSize; SmramHobDescriptorBlock->Descriptor[0].PhysicalSize = EFI_PAGE_SIZE; SmramHobDescriptorBlock->Descriptor[0].RegionState = EFI_SMRAM_CLOSED | EFI_CACHEABLE | EFI_ALLOCATED; +// +// Create gEfiAcpiVariableGuid +// +GuidHob = BuildGuidHob (, sizeof (EFI_SMRAM_DESCRIPTOR)); +ASSERT (GuidHob != NULL); +CopyMem (GuidHob, >Descriptor[0], sizeof (EFI_SMRAM_DESCRIPTOR)); + // // Create second SMRAM descriptor, which is free and will be used by SMM foundation. // SmramHobDescriptorBlock->Descriptor[1].PhysicalStart = SmramHobDescriptorBlock->Descriptor[0].PhysicalStart + EFI_PAGE_SIZE; SmramHobDescriptorBlock->Descriptor[1].CpuStart = SmramHobDescriptorBlock->Descriptor[0].CpuStart + EFI_PAGE_SIZE; diff --git a/OvmfPkg/Library/PlatformInitLib/PlatformInitLib.inf b/OvmfPkg/Library/PlatformInitLib/PlatformInitLib.inf index 2bb1c0296f..21e6efa5e0 100644 --- a/OvmfPkg/Library/PlatformInitLib/PlatformInitLib.inf +++ b/OvmfPkg/Library/PlatformInitLib/PlatformInitLib.inf @@ -56,10 +56,11 @@ [LibraryClasses.X64] TdxLib [Guids] gEfiSmmSmramMemoryGuid + gEfiAcpiVariableGuid [Pcd] gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable -- 2.16.2.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#117621): https://edk2.groups.io/g/devel/message/117621 Mute This Topic: https://groups.io/mt/105442002/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH v1 08/13] OvmfPkg/PlatformInitLib: Create gEfiSmmSmramMemoryGuid
I think the commit message can have more details to help OVMF developers understand the needs of this patch. E.g.: Before using SmmRelocationLib, the PiSmmCpuDxeSmm driver allocates the SMRAM to be used for SMI handler + save state area of each processor from Smst->AllocatePages(). With SmmRelocationLib, the SMRAM allocation for SMI handlers and save state areas is moved to early PEI phase when the Smst->AllocatePages() service is not available. So, the allocation is done by splitting the SMRAM out of the SMRAM regions reported from Guid HOB (gEfiSmmSMramMemoryGuid). However, OVMF platform does not produce the GUID HOB. This patch produces the HOB.. Thanks, Ray From: Wu, Jiaxin Sent: Wednesday, April 10, 2024 21:57 To: devel@edk2.groups.io Cc: Ard Biesheuvel ; Yao, Jiewen ; Gerd Hoffmann ; Ni, Ray Subject: [PATCH v1 08/13] OvmfPkg/PlatformInitLib: Create gEfiSmmSmramMemoryGuid SmmRelocationLib instance will reserve the memory from gEfiSmmSmramMemoryGuid for the smbase relocation. So, system must produce the gEfiSmmSmramMemoryGuid. This patch is for the OVMF to produce the gEfiSmmSmramMemoryGuid HOB. Cc: Ard Biesheuvel Cc: Jiewen Yao Cc: Gerd Hoffmann Cc: Ray Ni Signed-off-by: Jiaxin Wu --- OvmfPkg/Library/PlatformInitLib/MemDetect.c| 97 +- .../Library/PlatformInitLib/PlatformInitLib.inf| 5 +- 2 files changed, 64 insertions(+), 38 deletions(-) diff --git a/OvmfPkg/Library/PlatformInitLib/MemDetect.c b/OvmfPkg/Library/PlatformInitLib/MemDetect.c index 7b6e5102ad..8b98256225 100644 --- a/OvmfPkg/Library/PlatformInitLib/MemDetect.c +++ b/OvmfPkg/Library/PlatformInitLib/MemDetect.c @@ -1,9 +1,9 @@ /**@file Memory Detection for Virtual Machines. - Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved. + Copyright (c) 2006 - 2024, Intel Corporation. All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent Module Name: MemDetect.c @@ -41,10 +41,12 @@ Module Name: #include #include #include +#include + #define MEGABYTE_SHIFT 20 VOID EFIAPI PlatformQemuUc32BaseInitialization ( @@ -1027,52 +1029,73 @@ PlatformQemuInitializeRam ( // // Determine total memory size available // PlatformGetSystemMemorySizeBelow4gb (PlatformInfoHob); - if (PlatformInfoHob->BootMode == BOOT_ON_S3_RESUME) { -// -// Create the following memory HOB as an exception on the S3 boot path. + // + // CpuMpPei saves the original contents of the borrowed area in permanent + // PEI RAM, in a backup buffer allocated with the normal PEI services. + // CpuMpPei restores the original contents ("returns" the borrowed area) at + // End-of-PEI. End-of-PEI in turn is emitted by S3Resume2Pei before + // transferring control to the OS's wakeup vector in the FACS. + // + // We expect any other PEIMs that "borrow" memory similarly to CpuMpPei to + // restore the original contents. Furthermore, we expect all such PEIMs + // (CpuMpPei included) to claim the borrowed areas by producing memory + // allocation HOBs, and to honor preexistent memory allocation HOBs when + // looking for an area to borrow. + // + QemuInitializeRamBelow1gb (PlatformInfoHob); + + if (PlatformInfoHob->SmmSmramRequire) { +UINT32 TsegSize; +UINTN BufferSize; +UINT8 SmramRanges; +EFI_PEI_HOB_POINTERSHob; +EFI_SMRAM_HOB_DESCRIPTOR_BLOCK *SmramHobDescriptorBlock; + +TsegSize = PlatformInfoHob->Q35TsegMbytes * SIZE_1MB; +PlatformAddMemoryRangeHob (BASE_1MB, PlatformInfoHob->LowMemory - TsegSize); +PlatformAddReservedMemoryBaseSizeHob ( + PlatformInfoHob->LowMemory - TsegSize, + TsegSize, + TRUE + ); + +SmramRanges = 2; +BufferSize = sizeof (EFI_SMRAM_HOB_DESCRIPTOR_BLOCK) + (SmramRanges - 1) * sizeof (EFI_SMRAM_DESCRIPTOR); + +Hob.Raw = BuildGuidHob ( +, +BufferSize +); +ASSERT (Hob.Raw); + +SmramHobDescriptorBlock = (EFI_SMRAM_HOB_DESCRIPTOR_BLOCK *)(Hob.Raw); +SmramHobDescriptorBlock->NumberOfSmmReservedRegions = SmramRanges; + // -// Normally we'd create memory HOBs only on the normal boot path. However, -// CpuMpPei specifically needs such a low-memory HOB on the S3 path as -// well, for "borrowing" a subset of it temporarily, for the AP startup -// vector. +// Create first SMRAM descriptor, which contains data structures used in S3 resume. +// One page is enough for the data structure // -// CpuMpPei saves the original contents of the borrowed area in permanent -// PEI RAM, in a backup buffer allocated with the normal PEI services. -// CpuMpPei restores the original contents ("returns" the borrowed area) at -// End-of-PEI. End-of-PEI in tur
Re: [edk2-devel] [PATCH v1 05/13] UefiCpuPkg/UefiCpuPkg.dsc: Include SmmRelocationLib in UefiCpuPkg
Please change the DSC in the earlier patch that adds the lib instance and avoid this patch. Thanks, Ray From: Wu, Jiaxin Sent: Wednesday, April 10, 2024 21:57 To: devel@edk2.groups.io Cc: Ni, Ray ; Zeng, Star ; Gerd Hoffmann ; Kumar, Rahul R Subject: [PATCH v1 05/13] UefiCpuPkg/UefiCpuPkg.dsc: Include SmmRelocationLib in UefiCpuPkg This patch just includes SmmRelocationLib in UefiCpuPkg. Cc: Ray Ni Cc: Zeng Star Cc: Gerd Hoffmann Cc: Rahul Kumar Signed-off-by: Jiaxin Wu --- UefiCpuPkg/UefiCpuPkg.dsc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/UefiCpuPkg/UefiCpuPkg.dsc b/UefiCpuPkg/UefiCpuPkg.dsc index 10b33594e5..631a850c78 100644 --- a/UefiCpuPkg/UefiCpuPkg.dsc +++ b/UefiCpuPkg/UefiCpuPkg.dsc @@ -194,10 +194,13 @@ UnitTestResultReportLib|UnitTestFrameworkPkg/Library/UnitTestResultReportLib/UnitTestResultReportLibConOut.inf } UefiCpuPkg/Library/MmSaveStateLib/AmdMmSaveStateLib.inf UefiCpuPkg/Library/MmSaveStateLib/IntelMmSaveStateLib.inf UefiCpuPkg/Library/SmmCpuFeaturesLib/AmdSmmCpuFeaturesLib.inf + UefiCpuPkg/Library/SmmRelocationLib/SmmRelocationLib.inf + UefiCpuPkg/Library/SmmRelocationLib/OvmfSmmRelocationLib.inf + UefiCpuPkg/Library/SmmRelocationLib/AmdSmmRelocationLib.inf [Components.X64] UefiCpuPkg/Library/CpuExceptionHandlerLib/UnitTest/DxeCpuExceptionHandlerLibUnitTest.inf [Components.RISCV64] -- 2.16.2.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#117612): https://edk2.groups.io/g/devel/message/117612 Mute This Topic: https://groups.io/mt/105441994/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH v1 03/13] UefiCpuPkg/SmmRelocationLib: Add library instance for OVMF
No. Please do not create a OVMF specific lib instance in UefiCpuPkg. Thanks, Ray From: Wu, Jiaxin Sent: Wednesday, April 10, 2024 21:57 To: devel@edk2.groups.io Cc: Ni, Ray ; Zeng, Star ; Ard Biesheuvel ; Yao, Jiewen ; Gerd Hoffmann ; Kumar, Rahul R Subject: [PATCH v1 03/13] UefiCpuPkg/SmmRelocationLib: Add library instance for OVMF Due to the definition difference of SMRAM Save State, SmmBase config in SMRAM Save State for OVMF is also different. This patch provides the OvmfSmmRelocationLib library instance to handle the SMRAM Save State difference. Cc: Ray Ni Cc: Zeng Star Cc: Ard Biesheuvel Cc: Jiewen Yao Cc: Gerd Hoffmann Cc: Rahul Kumar Signed-off-by: Jiaxin Wu --- .../SmmRelocationLib/OvmfSmmRelocationLib.inf | 61 .../SmmRelocationLib/OvmfSmramSaveStateConfig.c| 107 + 2 files changed, 168 insertions(+) create mode 100644 UefiCpuPkg/Library/SmmRelocationLib/OvmfSmmRelocationLib.inf create mode 100644 UefiCpuPkg/Library/SmmRelocationLib/OvmfSmramSaveStateConfig.c diff --git a/UefiCpuPkg/Library/SmmRelocationLib/OvmfSmmRelocationLib.inf b/UefiCpuPkg/Library/SmmRelocationLib/OvmfSmmRelocationLib.inf new file mode 100644 index 00..eba1129ac2 --- /dev/null +++ b/UefiCpuPkg/Library/SmmRelocationLib/OvmfSmmRelocationLib.inf @@ -0,0 +1,61 @@ +## @file +# SMM Relocation Lib for each processor. +# +# This Lib produces the SMM_BASE_HOB in HOB database which tells +# the PiSmmCpuDxeSmm driver (runs at a later phase) about the new +# SMBASE for each processor. PiSmmCpuDxeSmm driver installs the +# SMI handler at the SMM_BASE_HOB.SmBase[Index]+0x8000 for processor +# Index. +# +# Copyright (c) 2024, Intel Corporation. All rights reserved. +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION= 0x00010005 + BASE_NAME = SmmRelocationLib + FILE_GUID = 51834F51-CCE0-4743-B553-935D0C8A53FF + MODULE_TYPE= PEIM + VERSION_STRING = 1.0 + LIBRARY_CLASS = SmmRelocationLib + +[Sources] + InternalSmmRelocationLib.h + OvmfSmramSaveStateConfig.c + SmmRelocationLib.c + +[Sources.Ia32] + Ia32/Semaphore.c + Ia32/SmmInit.nasm + +[Sources.X64] + X64/Semaphore.c + X64/SmmInit.nasm + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + UefiCpuPkg/UefiCpuPkg.dec + +[LibraryClasses] + BaseLib + BaseMemoryLib + CpuExceptionHandlerLib + DebugLib + HobLib + LocalApicLib + MemoryAllocationLib + PcdLib + PeiServicesLib + +[Guids] + gSmmBaseHobGuid ## HOB ALWAYS_PRODUCED + gEfiSmmSmramMemoryGuid## CONSUMES + +[Pcd] + gUefiCpuPkgTokenSpaceGuid.PcdCpuMaxLogicalProcessorNumber + gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmStackSize ## CONSUMES + +[FeaturePcd] + gUefiCpuPkgTokenSpaceGuid.PcdCpuHotPlugSupport## CONSUMES diff --git a/UefiCpuPkg/Library/SmmRelocationLib/OvmfSmramSaveStateConfig.c b/UefiCpuPkg/Library/SmmRelocationLib/OvmfSmramSaveStateConfig.c new file mode 100644 index 00..505b1d694a --- /dev/null +++ b/UefiCpuPkg/Library/SmmRelocationLib/OvmfSmramSaveStateConfig.c @@ -0,0 +1,107 @@ +/** @file + Config SMRAM Save State for SmmBases Relocation. + + Copyright (c) 2024, Intel Corporation. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include "InternalSmmRelocationLib.h" +#include + +/** + This function configures the SmBase on the currently executing CPU. + + @param[in] CpuIndex The index of the CPU. + @param[in,out] CpuState Pointer to SMRAM Save State Map for the + currently executing CPU. On out, SmBase is + updated to the new value. + +**/ +VOID +EFIAPI +ConfigureSmBase ( + IN UINTN CpuIndex, + IN OUT SMRAM_SAVE_STATE_MAP *CpuState + ) +{ + AMD_SMRAM_SAVE_STATE_MAP *CpuSaveState; + + CpuSaveState = (AMD_SMRAM_SAVE_STATE_MAP *)CpuState; + + if ((CpuSaveState->x86.SMMRevId & 0x) == 0) { +CpuSaveState->x86.SMBASE = (UINT32)mSmBaseForAllCpus[CpuIndex]; + } else { +CpuSaveState->x64.SMBASE = (UINT32)mSmBaseForAllCpus[CpuIndex]; + } +} + +/** + This function updates the SMRAM save state on the currently executing CPU + to resume execution at a specific address after an RSM instruction. This + function must evaluate the SMRAM save state to determine the execution mode + the RSM instruction resumes and update the resume execution address with + either NewInstructionPointer32 or NewInstructionPoint. The auto HALT restart + flag in the SMRAM save state must always be cleared. This function returns + the value of the instruction pointer from the SMRAM save state that was + replaced. If this function returns 0, then the SMRAM save st
Re: [edk2-devel] [PATCH v1 02/13] UefiCpuPkg/SmmRelocationLib: Add SmmRelocationLib library instance
Not sure if "--find-copies-harder" helps to detect that the new files are copies of existing files. Can you try in next version if some comments request a new version of patch? Thanks, Ray From: Wu, Jiaxin Sent: Wednesday, April 10, 2024 21:57 To: devel@edk2.groups.io Cc: Ni, Ray ; Zeng, Star ; Gerd Hoffmann ; Kumar, Rahul R Subject: [PATCH v1 02/13] UefiCpuPkg/SmmRelocationLib: Add SmmRelocationLib library instance This patch separates the smbase relocation logic from PiSmmCpuDxeSmm driver, and moves to the SmmRelocationInit interface. Platform shall consume the interface for the smbase relocation if need SMM support. Cc: Ray Ni Cc: Zeng Star Cc: Gerd Hoffmann Cc: Rahul Kumar Signed-off-by: Jiaxin Wu --- .../Library/SmmRelocationLib/Ia32/Semaphore.c | 43 ++ .../Library/SmmRelocationLib/Ia32/SmmInit.nasm | 157 + .../SmmRelocationLib/InternalSmmRelocationLib.h| 141 + .../Library/SmmRelocationLib/SmmRelocationLib.c| 659 + .../Library/SmmRelocationLib/SmmRelocationLib.inf | 61 ++ .../SmmRelocationLib/SmramSaveStateConfig.c| 91 +++ .../Library/SmmRelocationLib/X64/Semaphore.c | 70 +++ .../Library/SmmRelocationLib/X64/SmmInit.nasm | 207 +++ 8 files changed, 1429 insertions(+) create mode 100644 UefiCpuPkg/Library/SmmRelocationLib/Ia32/Semaphore.c create mode 100644 UefiCpuPkg/Library/SmmRelocationLib/Ia32/SmmInit.nasm create mode 100644 UefiCpuPkg/Library/SmmRelocationLib/InternalSmmRelocationLib.h create mode 100644 UefiCpuPkg/Library/SmmRelocationLib/SmmRelocationLib.c create mode 100644 UefiCpuPkg/Library/SmmRelocationLib/SmmRelocationLib.inf create mode 100644 UefiCpuPkg/Library/SmmRelocationLib/SmramSaveStateConfig.c create mode 100644 UefiCpuPkg/Library/SmmRelocationLib/X64/Semaphore.c create mode 100644 UefiCpuPkg/Library/SmmRelocationLib/X64/SmmInit.nasm diff --git a/UefiCpuPkg/Library/SmmRelocationLib/Ia32/Semaphore.c b/UefiCpuPkg/Library/SmmRelocationLib/Ia32/Semaphore.c new file mode 100644 index 00..ace3221cfc --- /dev/null +++ b/UefiCpuPkg/Library/SmmRelocationLib/Ia32/Semaphore.c @@ -0,0 +1,43 @@ +/** @file + Semaphore mechanism to indicate to the BSP that an AP has exited SMM + after SMBASE relocation. + + Copyright (c) 2024, Intel Corporation. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "InternalSmmRelocationLib.h" + +UINTN mSmmRelocationOriginalAddress; +volatile BOOLEAN *mRebasedFlag; + +/** + Hook return address of SMM Save State so that semaphore code + can be executed immediately after AP exits SMM to indicate to + the BSP that an AP has exited SMM after SMBASE relocation. + + @param[in] CpuIndex The processor index. + @param[in] RebasedFlag A pointer to a flag that is set to TRUE + immediately after AP exits SMM. + +**/ +VOID +SemaphoreHook ( + IN UINTN CpuIndex, + IN volatile BOOLEAN *RebasedFlag + ) +{ + SMRAM_SAVE_STATE_MAP *CpuState; + + mRebasedFlag = RebasedFlag; + + CpuState = (SMRAM_SAVE_STATE_MAP *)(UINTN)(SMM_DEFAULT_SMBASE + SMRAM_SAVE_STATE_MAP_OFFSET); + + mSmmRelocationOriginalAddress = (UINTN)HookReturnFromSmm ( + CpuIndex, + CpuState, + (UINT64)(UINTN), + (UINT64)(UINTN) + ); +} diff --git a/UefiCpuPkg/Library/SmmRelocationLib/Ia32/SmmInit.nasm b/UefiCpuPkg/Library/SmmRelocationLib/Ia32/SmmInit.nasm new file mode 100644 index 00..cb8b030693 --- /dev/null +++ b/UefiCpuPkg/Library/SmmRelocationLib/Ia32/SmmInit.nasm @@ -0,0 +1,157 @@ +;-- ; +; Copyright (c) 2024, Intel Corporation. All rights reserved. +; SPDX-License-Identifier: BSD-2-Clause-Patent +; +; Module Name: +; +; SmmInit.nasm +; +; Abstract: +; +; Functions for relocating SMBASE's for all processors +; +;--- + +%include "StuffRsbNasm.inc" + +global ASM_PFX(gcSmiIdtr) +global ASM_PFX(gcSmiGdtr) + +extern ASM_PFX(SmmInitHandler) +extern ASM_PFX(mRebasedFlag) +extern ASM_PFX(mSmmRelocationOriginalAddress) + +global ASM_PFX(gPatchSmmCr3) +global ASM_PFX(gPatchSmmCr4) +global ASM_PFX(gPatchSmmCr0) +global ASM_PFX(gPatchSmmInitStack) +global ASM_PFX(gcSmmInitSize) +global ASM_PFX(gcSmmInitTemplate) + +%define PROTECT_MODE_CS 0x8 +%define PROTECT_MODE_DS 0x20 + +SECTION .data + +NullSeg: DQ 0 ; reserved by architecture +CodeSeg32: +DW -1 ; LimitLow +DW 0 ; BaseLow +DB 0 ; BaseMid +DB 0x9b +DB 0
Re: [edk2-devel] [PATCH v1 00/13] Add SmmRelocationLib
Jiaxin, can you kindly share a PR in GitHub so that it will be easier to review? Thanks, Ray From: Wu, Jiaxin Sent: Wednesday, April 10, 2024 21:57 To: devel@edk2.groups.io Cc: Ni, Ray ; Zeng, Star ; Gerd Hoffmann ; Kumar, Rahul R ; Dong, Guo ; Rhodes, Sean ; Lu, James ; Guo, Gua ; Ard Biesheuvel ; Yao, Jiewen Subject: [PATCH v1 00/13] Add SmmRelocationLib Intel plans to separate the smbase relocation logic from PiSmmCpuDxeSmm driver, and the related behavior will be moved to the new interface defined by the SmmRelocationLib class. The SmmRelocationLib class provides the SmmRelocationInit() interface for platform to do the smbase relocation, which shall provide below 2 functionalities: 1. Relocate smbases for each processor. 2. Create the gSmmBaseHobGuid HOB. With SmmRelocationLib, PiSmmCpuDxeSmm driver (which runs at a later phase) can be simplfied as below for SMM init: 1. Consume the gSmmBaseHobGuid HOB for the relocated smbases for each Processor. 2. Execute the early SMM Init. Cc: Ray Ni Cc: Zeng Star Cc: Gerd Hoffmann Cc: Rahul Kumar Cc: Guo Dong Cc: Sean Rhodes Cc: James Lu Cc: Gua Guo Cc: Ard Biesheuvel Cc: Jiewen Yao Signed-off-by: Jiaxin Wu Jiaxin Wu (13): UefiCpuPkg: Add SmmRelocationLib class UefiCpuPkg/SmmRelocationLib: Add SmmRelocationLib library instance UefiCpuPkg/SmmRelocationLib: Add library instance for OVMF UefiCpuPkg/SmmRelocationLib: Add library instance for AMD UefiCpuPkg/UefiCpuPkg.dsc: Include SmmRelocationLib in UefiCpuPkg UefiPayloadPkg/UefiPayloadPkg.dsc: Include SmmRelocationLib OvmfPkg: Include SmmRelocationLib in OvmfPkg OvmfPkg/PlatformInitLib: Create gEfiSmmSmramMemoryGuid OvmfPkg/SmmAccess: Consume gEfiSmmSmramMemoryGuid OvmfPkg/PlatformInitLib: Create gEfiAcpiVariableGuid OvmfPkg/SmmCpuFeaturesLib: Check Smbase Relocation is done or not OvmfPkg/PlatformPei: Relocate SmBases in PEI phase UefiCpuPkg/PiSmmCpuDxeSmm: Remove SmBases relocation logic OvmfPkg/AmdSev/AmdSevX64.dsc | 1 + OvmfPkg/CloudHv/CloudHvX64.dsc | 1 + OvmfPkg/Library/PlatformInitLib/MemDetect.c| 104 ++-- .../Library/PlatformInitLib/PlatformInitLib.inf| 6 +- .../Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.c | 33 +- OvmfPkg/Microvm/MicrovmX64.dsc | 1 + OvmfPkg/OvmfPkgIa32.dsc| 1 + OvmfPkg/OvmfPkgIa32X64.dsc | 1 + OvmfPkg/OvmfPkgX64.dsc | 1 + OvmfPkg/PlatformPei/Platform.c | 1 + OvmfPkg/PlatformPei/Platform.h | 5 + OvmfPkg/PlatformPei/PlatformPei.inf| 5 +- OvmfPkg/PlatformPei/SmmRelocation.c| 80 +++ OvmfPkg/SmmAccess/SmmAccess2Dxe.c | 4 +- OvmfPkg/SmmAccess/SmmAccess2Dxe.inf| 5 + OvmfPkg/SmmAccess/SmmAccessPei.c | 88 +-- OvmfPkg/SmmAccess/SmmAccessPei.inf | 7 +- OvmfPkg/SmmAccess/SmramInternal.c | 73 +-- OvmfPkg/SmmAccess/SmramInternal.h | 18 +- UefiCpuPkg/Include/Library/SmmRelocationLib.h | 42 ++ .../SmmRelocationLib/AmdSmmRelocationLib.inf | 61 ++ .../SmmRelocationLib/AmdSmramSaveStateConfig.c | 109 .../SmmRelocationLib}/Ia32/Semaphore.c | 13 +- .../Library/SmmRelocationLib/Ia32/SmmInit.nasm | 157 + .../SmmRelocationLib/InternalSmmRelocationLib.h| 141 + .../SmmRelocationLib/OvmfSmmRelocationLib.inf | 61 ++ .../SmmRelocationLib/OvmfSmramSaveStateConfig.c| 107 .../Library/SmmRelocationLib/SmmRelocationLib.c| 659 + .../Library/SmmRelocationLib/SmmRelocationLib.inf | 61 ++ .../SmmRelocationLib/SmramSaveStateConfig.c| 91 +++ .../SmmRelocationLib}/X64/Semaphore.c | 13 +- .../SmmRelocationLib}/X64/SmmInit.nasm | 93 ++- UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c | 21 +- UefiCpuPkg/PiSmmCpuDxeSmm/Ia32/SmmInit.nasm| 96 --- UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c | 6 +- UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c | 322 +- UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h | 98 --- UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf | 4 - UefiCpuPkg/PiSmmCpuDxeSmm/SmramSaveState.c | 69 --- UefiCpuPkg/UefiCpuPkg.dec | 3 + UefiCpuPkg/UefiCpuPkg.dsc | 3 + UefiPayloadPkg/UefiPayloadPkg.dsc | 2 + 42 files changed, 1850 insertions(+), 817 deletions(-) create mode 100644 OvmfPkg/PlatformPei/SmmRelocation.c create mode 100644 UefiCpuPkg/Include/Library/SmmRelocationLib.h create mode 100644 UefiCpuPkg/Library/SmmRelocationLib/AmdSmmRelocationLib.inf create mode 100644 UefiCpuPkg/Library/SmmRelocationLib/AmdSmramSaveStateConfig.c rename UefiCpuPkg/{PiSmmCpuDxeSmm => Library/SmmRelocation
Re: [edk2-devel] [PATCH v3 0/6] Support to unregister SMI handler in SMI handlers
Reviewed-by: Ray Ni Thanks, Ray From: devel@edk2.groups.io on behalf of Zhiguang Liu Sent: Wednesday, April 10, 2024 15:49 To: devel@edk2.groups.io Cc: Liu, Zhiguang Subject: [edk2-devel] [PATCH v3 0/6] Support to unregister SMI handler in SMI handlers Months ago, I sent patch set to fix potential issues in the usage of SMI handler unregistering SMI handler. Discussion can be found in below link: https://edk2.groups.io/g/devel/topic/103925794#114251 The conclusion was to only support SMI handler unregistering itself, and not allow SMI handler unregistering other handlers, because we thought there would be no such usage. However, recently, I find in some platform, there is kind of usage. To also support SMI handler unregistering other handlers, this patch set use a totally different design. So I revert the former ones first to make the code more readable. Thank Laszlo for bring up the initial idea for the new design. V2: Code refine based on Ray's comments Zhiguang Liu (6): Revert 2ec8f0c6407f062441b205b900038933865c7b3c Revert 049ff6c39c73edd3709c05bd0e46184320471358 Revert 17b28722008eab745ce186b72cd325944cbe6bf0 Revert ae1079b386a597108a8070652bf7cdaa4ec3dda3 MdeModulePkg/SMM: Support to unregister SMI handler in SMI handlers StandaloneMmPkg: Support to unregister MMI handler in MMI handlers MdeModulePkg/Core/PiSmmCore/PiSmmCore.h | 1 + MdeModulePkg/Core/PiSmmCore/Smi.c | 198 --- StandaloneMmPkg/Core/Mmi.c | 200 +--- 3 files changed, 292 insertions(+), 107 deletions(-) -- 2.31.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#117580): https://edk2.groups.io/g/devel/message/117580 Mute This Topic: https://groups.io/mt/105437953/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-
Re: [edk2-devel] [PATCH v2] IntelFsp2Pkg: Optional Plugin for FSP SecCore/PeiCore Rebasing
Reviewed-by: Ray Ni Thanks, Ray From: Liu, Zhiguang Sent: Wednesday, April 10, 2024 15:08 To: devel@edk2.groups.io Cc: Liu, Zhiguang ; Chiu, Chasel ; Desimone, Nathaniel L ; Duggapu, Chinni B ; Zeng, Star ; Kuo, Ted ; S, Ashraf Ali ; Susovan Mohapatra ; Ni, Ray Subject: [PATCH v2] IntelFsp2Pkg: Optional Plugin for FSP SecCore/PeiCore Rebasing Note this plugin only applies to 64-bit PSP This optional plugin is designed to execute before the FSP SecCore to rebase SecCore and PeiCore during runtime. If the FSP binary requires rebasing at runtime, this module should be included within the FSP binary. Additionally, specific patches must be applied to ensure proper functionality. In the absence of this module, manual patching of API offsets within the FSP header is necessary. To illustrate, let's consider a scenario within FSP-S where 'FspSiliconInitEntry' is the initial API to be executed post-rebase. Rather than directly inputting the 'FspSiliconInit' offset into the 'FspSiliconInitEntryOffset' field of the FSP header, the entry point of this module should be used. Furthermore, the 'FspSiliconInit' offset should be placed into 'AsmGetFspOriginalEntry', which signifies the address to which this module will jump. It is also essential to patch the image bases of SecCore and PeiCore to enable the rebasing functionality of this module. The following is an example of how to apply the necessary patches: Patch Address Patch Value PreFspSec:_ModuleEntryPoint - [0x] PreFspSec:SecCoreRelativeOffPreFspSec:AsmGetFspSecCoreImageBase - Fsp24SecCoreS:BASE PreFspSec:PeiCoreRelativeOffPreFspSec:AsmGetFspPeiCoreImageBase - PeiCore:BASE PreFspSec:SecEntryRelativeOff PreFspSec:AsmGetFspOriginalEntry - Fsp24SecCoreS:FspSiliconInitApi Cc: Chasel Chiu Cc: Nate DeSimone Cc: Duggapu Chinni B Cc: Star Zeng Cc: Ted Kuo Cc: Ashraf Ali S Cc: Susovan Mohapatra Cc: Ray Ni Signed-off-by: Zhiguang Liu --- IntelFsp2Pkg/IntelFsp2Pkg.dsc | 5 + IntelFsp2Pkg/PreFspSec/PreFspSec.c| 115 ++ IntelFsp2Pkg/PreFspSec/PreFspSec.inf | 62 ++ .../PreFspSec/X64/PreFspSecCommon.nasm| 94 ++ 4 files changed, 276 insertions(+) create mode 100644 IntelFsp2Pkg/PreFspSec/PreFspSec.c create mode 100644 IntelFsp2Pkg/PreFspSec/PreFspSec.inf create mode 100644 IntelFsp2Pkg/PreFspSec/X64/PreFspSecCommon.nasm diff --git a/IntelFsp2Pkg/IntelFsp2Pkg.dsc b/IntelFsp2Pkg/IntelFsp2Pkg.dsc index f236a7010b..a2cc29c940 100644 --- a/IntelFsp2Pkg/IntelFsp2Pkg.dsc +++ b/IntelFsp2Pkg/IntelFsp2Pkg.dsc @@ -33,6 +33,8 @@ SerialPortLib|MdePkg/Library/BaseSerialPortLibNull/BaseSerialPortLibNull.inf ReportStatusCodeLib|MdePkg/Library/BaseReportStatusCodeLibNull/BaseReportStatusCodeLibNull.inf DebugDeviceLib|IntelFsp2Pkg/Library/BaseDebugDeviceLibNull/BaseDebugDeviceLibNull.inf + PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf + PeCoffExtraActionLib|MdePkg/Library/BasePeCoffExtraActionLibNull/BasePeCoffExtraActionLibNull.inf # FSP override DebugLib|IntelFsp2Pkg/Library/BaseFspDebugLibSerialPort/BaseFspDebugLibSerialPort.inf @@ -75,6 +77,9 @@ IntelFsp2Pkg/FspSecCore/Fsp24SecCoreS.inf IntelFsp2Pkg/FspNotifyPhase/FspNotifyPhasePeim.inf +[Components.X64] + IntelFsp2Pkg/PreFspSec/PreFspSec.inf + [PcdsFixedAtBuild.common] gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x1f gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80080046 diff --git a/IntelFsp2Pkg/PreFspSec/PreFspSec.c b/IntelFsp2Pkg/PreFspSec/PreFspSec.c new file mode 100644 index 00..b3b52b8064 --- /dev/null +++ b/IntelFsp2Pkg/PreFspSec/PreFspSec.c @@ -0,0 +1,115 @@ +/** @file + + Copyright (c) 2024, Intel Corporation. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include "Guid/FspHeaderFile.h" +#include +#include +#include +#include + +/** + This fuction gets SecCore image base + + @return SecCore image base, or zero if no patch in nasm code + +**/ +UINTN +EFIAPI +AsmGetFspSecCoreImageBase ( + VOID + ); + +/** + This fuction gets PeiCore image base + + @return PeiCore image base, or zero if no patch in nasm code + +**/ +UINTN +EFIAPI +AsmGetFspPeiCoreImageBase ( + VOID + ); + +/** + Relocate Pe/Te Image + + @param[in] ImageBaseAddress Image base address + + @retval EFI_SUCCESS Image is relocated successfully + @retval OthersImage is not relocated successfully +**/ +EFI_STATUS +RelocatePeTeImage ( + UINT64 ImageBaseAddress + ) +{ + RETURN_STATUS Status; + PE_COFF_LOADER_IMAGE_CONTEXT ImageContext; + + ZeroMem (, sizeof (ImageContext)); + + ImageContext.Handle= (VOID *)ImageBaseAddress; + ImageContext.ImageRead = PeCoffLoaderImageReadFromMemory; +
Re: [edk2-devel] [PATCH 1/3] OptionRomPkg: Update the comments of GetInformation function
Pedro, I didn't notice your mail and merged the patch.:( Your comments to the commit messages are good to me. However, I am ok with the changes to the function header of an existing implementation. Thanks, Ray From: Pedro Falcato Sent: Tuesday, April 9, 2024 10:12 To: Shang, Qingyu Cc: devel@edk2.groups.io ; Ni, Ray ; Gahan Saraiya Subject: Re: [PATCH 1/3] OptionRomPkg: Update the comments of GetInformation function On Mon, Apr 8, 2024 at 10:48 AM Qingyu wrote: > > Refer to Uefi spec 2.10 section 11.11.2, add a new retval > EFI_NOT_FOUND to EFI_ADAPTER_INFORMATION_PROTOCOL.GetInformation(). > Reference: [mantis #1866] - GetInfo() of Adapter Information > Protocol should have a provision for IHV to return no data. Let's reword this commit message a bit, shall we? Something like this: Add a new return value EFI_NOT_FOUND to EFI_ADAPTER_INFORMATION_PROTOCOL.GetInformation(), according to UEFI spec 2.10 section 11.11.2. This brings the documentation up to par with UEFI 2.10. Reference: [mantis #1866] - GetInfo() of Adapter Information Protocol should have a provision for IHV to return no data. I'm not sure about the commit title too, but it's late here and I can't figure out a nice succinct description. Maybe: "OptionRomPkg/UndiRuntimeDxe: Update UndiAipGetInfo's docs to UEFI spec 2.10" > > Cc: Pedro Falcato Why was I CC'd on this? /me is confused > Cc: Ray Ni > Signed-off-by: Qingyu > Signed-off-by: Gahan Saraiya > --- > Drivers/OptionRomPkg/UndiRuntimeDxe/Undi32.h | 5 - > Drivers/OptionRomPkg/UndiRuntimeDxe/UndiAipImpl.c | 5 - > 2 files changed, 8 insertions(+), 2 deletions(-) > > diff --git a/Drivers/OptionRomPkg/UndiRuntimeDxe/Undi32.h > b/Drivers/OptionRomPkg/UndiRuntimeDxe/Undi32.h > index 31c55a8e11..665221e952 100644 > --- a/Drivers/OptionRomPkg/UndiRuntimeDxe/Undi32.h > +++ b/Drivers/OptionRomPkg/UndiRuntimeDxe/Undi32.h > @@ -350,7 +350,9 @@ VOID PxeUpdate (NIC_DATA_INSTANCE *NicPtr, PXE_SW_UNDI > *PxePtr); > >This function returns information of type InformationType from the adapter. >If an adapter does not support the requested informational type, then > - EFI_UNSUPPORTED is returned. > + EFI_UNSUPPORTED is returned. If an adapter does not contain Information for > + the requested InformationType, it fills InformationBlockSize with 0 and > + returns EFI_NOT_FOUND. > >@param[in] This A pointer to the > EFI_ADAPTER_INFORMATION_PROTOCOL instance. >@param[in] InformationTypeA pointer to an EFI_GUID that defines > the contents of InformationBlock. > @@ -360,6 +362,7 @@ VOID PxeUpdate (NIC_DATA_INSTANCE *NicPtr, PXE_SW_UNDI > *PxePtr); > >@retval EFI_SUCCESSThe InformationType information was > retrieved. >@retval EFI_UNSUPPORTEDThe InformationType is not known. > + @retval EFI_NOT_FOUND Information is not available for the > requested information type. >@retval EFI_DEVICE_ERROR The device reported an error. >@retval EFI_OUT_OF_RESOURCES The request could not be completed due > to a lack of resources. >@retval EFI_INVALID_PARAMETER This is NULL. > diff --git a/Drivers/OptionRomPkg/UndiRuntimeDxe/UndiAipImpl.c > b/Drivers/OptionRomPkg/UndiRuntimeDxe/UndiAipImpl.c > index 21151a076f..d80ce65da9 100644 > --- a/Drivers/OptionRomPkg/UndiRuntimeDxe/UndiAipImpl.c > +++ b/Drivers/OptionRomPkg/UndiRuntimeDxe/UndiAipImpl.c > @@ -18,7 +18,9 @@ EFI_GUID mSupportedInfoTypes[] = { > >This function returns information of type InformationType from the adapter. >If an adapter does not support the requested informational type, then > - EFI_UNSUPPORTED is returned. > + EFI_UNSUPPORTED is returned. If an adapter does not contain Information for > + the requested InformationType, it fills InformationBlockSize with 0 and > + returns EFI_NOT_FOUND. > >@param[in] This A pointer to the > EFI_ADAPTER_INFORMATION_PROTOCOL instance. >@param[in] InformationTypeA pointer to an EFI_GUID that defines > the contents of InformationBlock. > @@ -28,6 +30,7 @@ EFI_GUID mSupportedInfoTypes[] = { > >@retval EFI_SUCCESSThe InformationType information was > retrieved. >@retval EFI_UNSUPPORTEDThe InformationType is not known. > + @retval EFI_NOT_FOUND Information is not available for the > requested information type. >@retval EFI_DEVICE_ERROR The device reported an error. >@retval EFI_OUT_OF_RESOURCES The request could not be completed due > to a lack of resources. >@retval EFI_INVALID_PARAMETER This is NULL. In any case, since I've been meaning to say this for some tim