Chen, 1. Because you used the FreePages () to free the un-used memory space allocated for stack per the actual processors number, please add ASSERT to make sure PcdCpuApStackSize is multiple of 4K Bytes and add the comment in DEC for this PCD. ASSERT (gApStackSize & (SIZE_4KB - 1) == 0);
2. Because you could get actual processors number, could you allocate internal CPU data buffer by actual CPUs instead of by maximum CPUs? mMpSystemData.CpuDatas = AllocateZeroPool (sizeof (CPU_DATA_BLOCK) * gMaxLogicalProcessorNumber); 3. Add ## for the following PCDs in INF file. + gUefiCpuPkgTokenSpaceGuid.PcdCpuMaxLogicalProcessorNumber ## CONSUMES + gUefiCpuPkgTokenSpaceGuid.PcdCpuApStackSize ## CONSUMES 4. The following 2 lines cannot pass VS2008, please add type case (UINT8 *) for mApStackStart. mTopOfApCommonStack = mApStackStart + gApStackSize; TopOfApStack = mApStackStart + gApStackSize; Thanks! Jeff -----Original Message----- From: Chen Fan [mailto:chen.fan.f...@cn.fujitsu.com] Sent: Monday, October 27, 2014 5:30 PM To: edk2-devel@lists.sourceforge.net Cc: Fan, Jeff; Jordan Justen Subject: [RFC PATCH v6 06/27] UefiCpuPkg/CpuDxe: introduce two PCD value introduce PCD value: PcdCpuMaxLogicalProcessorNumber and PcdCpuApStackSize, used for initialize APs stacks. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Chen Fan <chen.fan.f...@cn.fujitsu.com> --- UefiCpuPkg/CpuDxe/CpuDxe.inf | 4 ++++ UefiCpuPkg/CpuDxe/CpuMp.c | 41 ++++++++++++++++++++++++++++++++++++++++- UefiCpuPkg/UefiCpuPkg.dec | 6 ++++++ 3 files changed, 50 insertions(+), 1 deletion(-) diff --git a/UefiCpuPkg/CpuDxe/CpuDxe.inf b/UefiCpuPkg/CpuDxe/CpuDxe.inf index c2f12b7..1837560 100644 --- a/UefiCpuPkg/CpuDxe/CpuDxe.inf +++ b/UefiCpuPkg/CpuDxe/CpuDxe.inf @@ -75,6 +75,10 @@ gIdleLoopEventGuid ## CONSUMES ## Event gEfiVectorHandoffTableGuid ## SOMETIMES_CONSUMES ## SystemTable +[Pcd] + gUefiCpuPkgTokenSpaceGuid.PcdCpuMaxLogicalProcessorNumber + gUefiCpuPkgTokenSpaceGuid.PcdCpuApStackSize + [Depex] TRUE diff --git a/UefiCpuPkg/CpuDxe/CpuMp.c b/UefiCpuPkg/CpuDxe/CpuMp.c index ea403e8..611e3d5 100644 --- a/UefiCpuPkg/CpuDxe/CpuMp.c +++ b/UefiCpuPkg/CpuDxe/CpuMp.c @@ -15,9 +15,14 @@ #include "CpuDxe.h" #include "CpuMp.h" +UINTN gMaxLogicalProcessorNumber; +UINTN gApStackSize; + VOID *mCommonStack = 0; VOID *mTopOfApCommonStack = 0; +VOID *mApStackStart = 0; +volatile UINTN mNumberOfProcessors; /** Application Processor C code entry point. @@ -29,6 +34,7 @@ ApEntryPointInC ( VOID ) { + mNumberOfProcessors++; } @@ -41,5 +47,38 @@ InitializeMpSupport ( VOID ) { -} + gMaxLogicalProcessorNumber = (UINTN) PcdGet32 + (PcdCpuMaxLogicalProcessorNumber); + if (gMaxLogicalProcessorNumber < 1) { + DEBUG ((DEBUG_ERROR, "Setting PcdCpuMaxLogicalProcessorNumber should be more than zero.\n")); + return; + } + + if (gMaxLogicalProcessorNumber == 1) { + return; + } + + gApStackSize = (UINTN) PcdGet32 (PcdCpuApStackSize); + + mApStackStart = AllocatePages (EFI_SIZE_TO_PAGES + (gMaxLogicalProcessorNumber * gApStackSize)); ASSERT (mApStackStart + != NULL); + // + // the first buffer of stack size used for common stack, when the + amount of AP // more than 1, we should never free the common stack which maybe used for AP reset. + // + mCommonStack = mApStackStart; + mTopOfApCommonStack = mApStackStart + gApStackSize; mApStackStart = + mTopOfApCommonStack; + + mNumberOfProcessors = 1; + + if (mNumberOfProcessors == 1) { + FreePages (mCommonStack, EFI_SIZE_TO_PAGES (gMaxLogicalProcessorNumber * gApStackSize)); + return; + } + + if (mNumberOfProcessors < gMaxLogicalProcessorNumber) { + FreePages (mApStackStart, EFI_SIZE_TO_PAGES ((gMaxLogicalProcessorNumber - mNumberOfProcessors) * + gApStackSize)); + } +} diff --git a/UefiCpuPkg/UefiCpuPkg.dec b/UefiCpuPkg/UefiCpuPkg.dec index c6e73a9..67d7196 100644 --- a/UefiCpuPkg/UefiCpuPkg.dec +++ b/UefiCpuPkg/UefiCpuPkg.dec @@ -54,6 +54,12 @@ ## Specifies delay value in microseconds after sending out an INIT IPI. # @Prompt Configure delay value after send an INIT IPI gUefiCpuPkgTokenSpaceGuid.PcdCpuInitIpiDelayInMicroSeconds|10000|UINT32|0x30000002 + ## Specifies max supported number of Logical Processors. + # @Prompt Configure max supported number of Logical Processorss + + gUefiCpuPkgTokenSpaceGuid.PcdCpuMaxLogicalProcessorNumber|64|UINT32|0x + 00000002 ## This value specifies the Application Processor (AP) stack + size, which used for Mp Service. + # @Prompt Configure stack size for Application Processor (AP) + gUefiCpuPkgTokenSpaceGuid.PcdCpuApStackSize|0x8000|UINT32|0x00000003 [UserExtensions.TianoCore."ExtraFiles"] UefiCpuPkgExtra.uni -- 1.9.3 ------------------------------------------------------------------------------ _______________________________________________ edk2-devel mailing list edk2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/edk2-devel