diff options
author | Chen Fan <chen.fan.fnst@cn.fujitsu.com> | 2014-11-13 18:29:01 +0000 |
---|---|---|
committer | jljusten <jljusten@Edk2> | 2014-11-13 18:29:01 +0000 |
commit | fe078dd57f5e935c28eac7348b758ca6fb5e696f (patch) | |
tree | 6d4d0dcd8ea40746f2f68f9e74cdc6a38623016c | |
parent | e4aaf764281d12cb8bfe605393a5520e00715838 (diff) | |
download | edk2-platforms-fe078dd57f5e935c28eac7348b758ca6fb5e696f.tar.xz |
UefiCpuPkg/CpuDxe: split out StartupCode from StartApsStackless()
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Chen Fan <chen.fan.fnst@cn.fujitsu.com>
Reviewed-by: Jeff Fan <jeff.fan@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16365 6f19259b-4bc3-4df7-8a09-765794883524
-rw-r--r-- | UefiCpuPkg/CpuDxe/ApStartup.c | 54 | ||||
-rw-r--r-- | UefiCpuPkg/CpuDxe/CpuMp.c | 3 | ||||
-rw-r--r-- | UefiCpuPkg/CpuDxe/CpuMp.h | 27 |
3 files changed, 66 insertions, 18 deletions
diff --git a/UefiCpuPkg/CpuDxe/ApStartup.c b/UefiCpuPkg/CpuDxe/ApStartup.c index 5477c52672..801f7f8611 100644 --- a/UefiCpuPkg/CpuDxe/ApStartup.c +++ b/UefiCpuPkg/CpuDxe/ApStartup.c @@ -238,27 +238,22 @@ STARTUP_CODE mStartupCodeTemplate = { };
+volatile STARTUP_CODE *StartupCode = NULL;
/**
- Starts the Application Processors and directs them to jump to the
- specified routine.
-
- The processor jumps to this code in flat mode, but the processor's
- stack is not initialized.
-
- @param ApEntryPoint Pointer to the Entry Point routine
+ Prepares Startup Code for APs.
+ This function prepares Startup Code for APs.
@retval EFI_SUCCESS The APs were started
@retval EFI_OUT_OF_RESOURCES Cannot allocate memory to start APs
**/
EFI_STATUS
-StartApsStackless (
- IN STACKLESS_AP_ENTRY_POINT ApEntryPoint
+PrepareAPStartupCode (
+ VOID
)
{
EFI_STATUS Status;
- volatile STARTUP_CODE *StartupCode;
IA32_DESCRIPTOR Gdtr;
EFI_PHYSICAL_ADDRESS StartAddress;
@@ -281,7 +276,7 @@ StartApsStackless ( StartupCode->GdtLimit = Gdtr.Limit;
StartupCode->GdtBase = (UINT32) Gdtr.Base;
- StartupCode->CpuDxeEntryValue = (UINTN) ApEntryPoint;
+ StartupCode->CpuDxeEntryValue = (UINTN) AsmApEntryPoint;
StartupCode->FlatJmpOffset += (UINT32) StartAddress;
@@ -290,15 +285,46 @@ StartApsStackless ( StartupCode->LongJmpOffset += (UINT32) StartAddress;
#endif
- SendInitSipiSipiAllExcludingSelf ((UINT32)(UINTN)(VOID*) StartupCode);
+ return EFI_SUCCESS;
+}
+
+/**
+ Free the code buffer of startup AP.
+
+**/
+VOID
+FreeApStartupCode (
+ VOID
+ )
+{
+ if (StartupCode != NULL) {
+ gBS->FreePages ((EFI_PHYSICAL_ADDRESS)(UINTN)(VOID*) StartupCode,
+ EFI_SIZE_TO_PAGES (sizeof (*StartupCode)));
+ }
+}
+
+/**
+ Starts the Application Processors and directs them to jump to the
+ specified routine.
+
+ The processor jumps to this code in flat mode, but the processor's
+ stack is not initialized.
+
+ @retval EFI_SUCCESS The APs were started
+
+**/
+EFI_STATUS
+StartApsStackless (
+ VOID
+ )
+{
+ SendInitSipiSipiAllExcludingSelf ((UINT32)(UINTN)(VOID*) StartupCode);
//
// Wait 100 milliseconds for APs to arrive at the ApEntryPoint routine
//
MicroSecondDelay (100 * 1000);
- gBS->FreePages (StartAddress, EFI_SIZE_TO_PAGES (sizeof (*StartupCode)));
-
return EFI_SUCCESS;
}
diff --git a/UefiCpuPkg/CpuDxe/CpuMp.c b/UefiCpuPkg/CpuDxe/CpuMp.c index 3e30d7417d..029e8d4331 100644 --- a/UefiCpuPkg/CpuDxe/CpuMp.c +++ b/UefiCpuPkg/CpuDxe/CpuMp.c @@ -1454,7 +1454,10 @@ InitializeMpSupport ( InitMpSystemData ();
+ PrepareAPStartupCode ();
+
if (mMpSystemData.NumberOfProcessors == 1) {
+ FreeApStartupCode ();
FreePages (mCommonStack, EFI_SIZE_TO_PAGES (gMaxLogicalProcessorNumber * gApStackSize));
return;
}
diff --git a/UefiCpuPkg/CpuDxe/CpuMp.h b/UefiCpuPkg/CpuDxe/CpuMp.h index a53ef52d93..2b1717d410 100644 --- a/UefiCpuPkg/CpuDxe/CpuMp.h +++ b/UefiCpuPkg/CpuDxe/CpuMp.h @@ -40,15 +40,12 @@ VOID The processor jumps to this code in flat mode, but the processor's
stack is not initialized.
- @param ApEntryPoint Pointer to the Entry Point routine
-
@retval EFI_SUCCESS The APs were started
- @retval EFI_OUT_OF_RESOURCES Cannot allocate memory to start APs
**/
EFI_STATUS
StartApsStackless (
- IN STACKLESS_AP_ENTRY_POINT ApEntryPoint
+ VOID
);
/**
@@ -603,5 +600,27 @@ ResetProcessorToIdleState ( IN CPU_DATA_BLOCK *CpuData
);
+/**
+ Prepares Startup Code for APs.
+ This function prepares Startup Code for APs.
+
+ @retval EFI_SUCCESS The APs were started
+ @retval EFI_OUT_OF_RESOURCES Cannot allocate memory to start APs
+
+**/
+EFI_STATUS
+PrepareAPStartupCode (
+ VOID
+ );
+
+/**
+ Free the code buffer of startup AP.
+
+**/
+VOID
+FreeApStartupCode (
+ VOID
+ );
+
#endif // _CPU_MP_H_
|