summaryrefslogtreecommitdiff
path: root/UefiCpuPkg
diff options
context:
space:
mode:
authorChen Fan <chen.fan.fnst@cn.fujitsu.com>2014-11-13 18:29:01 +0000
committerjljusten <jljusten@Edk2>2014-11-13 18:29:01 +0000
commitfe078dd57f5e935c28eac7348b758ca6fb5e696f (patch)
tree6d4d0dcd8ea40746f2f68f9e74cdc6a38623016c /UefiCpuPkg
parente4aaf764281d12cb8bfe605393a5520e00715838 (diff)
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
Diffstat (limited to 'UefiCpuPkg')
-rw-r--r--UefiCpuPkg/CpuDxe/ApStartup.c54
-rw-r--r--UefiCpuPkg/CpuDxe/CpuMp.c3
-rw-r--r--UefiCpuPkg/CpuDxe/CpuMp.h27
3 files changed, 66 insertions, 18 deletions
diff --git a/UefiCpuPkg/CpuDxe/ApStartup.c b/UefiCpuPkg/CpuDxe/ApStartup.c
index 5477c5267..801f7f861 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 3e30d7417..029e8d433 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 a53ef52d9..2b1717d41 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_