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:[email protected]]
Sent: Monday, October 27, 2014 5:30 PM
To: [email protected]
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 <[email protected]>
---
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-devel