summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Fan <jeff.fan@intel.com>2016-08-24 21:58:04 +0800
committerJeff Fan <jeff.fan@intel.com>2016-08-25 16:12:37 +0800
commit5183fb3736bf2eb102474c6db19bf9a00be3d5f5 (patch)
treeb0ec9370ddd0eef04feed2c36df3598e57b9f2dd
parentc1192210604f51c8397864293b1bdc00c5242c58 (diff)
downloadedk2-5183fb3736bf2eb102474c6db19bf9a00be3d5f5.tar.gz
edk2-5183fb3736bf2eb102474c6db19bf9a00be3d5f5.tar.bz2
edk2-5183fb3736bf2eb102474c6db19bf9a00be3d5f5.zip
UefiCpuPkg/MpInitLib: Move allocating reserved memory for AP loop code
In Exit Boot Services callback function, we cannot use allocate memory services because it may change the memory map that has been gotten by OS. This fix is to move allocating reserved memory for AP loop code to InitMpGlobalData() and save the memory address in one global variable. Cc: Michael Kinney <michael.d.kinney@intel.com> Cc: Feng Tian <feng.tian@intel.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Jeff Fan <jeff.fan@intel.com> Reviewed-by: Feng Tian <feng.tian@intel.com>
-rw-r--r--UefiCpuPkg/Library/MpInitLib/DxeMpLib.c26
1 files changed, 15 insertions, 11 deletions
diff --git a/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c b/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c
index 42d320ff8a..383eec9c6b 100644
--- a/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c
+++ b/UefiCpuPkg/Library/MpInitLib/DxeMpLib.c
@@ -23,7 +23,7 @@ CPU_MP_DATA *mCpuMpData = NULL;
EFI_EVENT mCheckAllApsEvent = NULL;
EFI_EVENT mMpInitExitBootServicesEvent = NULL;
volatile BOOLEAN mStopCheckAllApsStatus = TRUE;
-
+VOID *mReservedApLoopFunc = NULL;
/**
Get the pointer to CPU MP Data structure.
@@ -258,19 +258,11 @@ MpInitExitBootServicesCallback (
)
{
CPU_MP_DATA *CpuMpData;
- VOID *ReservedApLoopFunc;
- //
- // Avoid APs access invalid buff data which allocated by BootServices,
- // so we will allocate reserved data for AP loop code.
- //
+
CpuMpData = GetCpuMpData ();
CpuMpData->PmCodeSegment = GetProtectedModeCS ();
CpuMpData->ApLoopMode = PcdGet8 (PcdCpuApLoopMode);
- ReservedApLoopFunc = AllocateReservedCopyPool (
- CpuMpData->AddressMap.RelocateApLoopFuncSize,
- CpuMpData->AddressMap.RelocateApLoopFuncAddress
- );
- WakeUpAP (CpuMpData, TRUE, 0, RelocateApLoop, ReservedApLoopFunc);
+ WakeUpAP (CpuMpData, TRUE, 0, RelocateApLoop, mReservedApLoopFunc);
DEBUG ((DEBUG_INFO, "MpInitExitBootServicesCallback() done!\n"));
}
@@ -288,6 +280,18 @@ InitMpGlobalData (
SaveCpuMpData (CpuMpData);
+ //
+ // Avoid APs access invalid buff data which allocated by BootServices,
+ // so we will allocate reserved data for AP loop code.
+ // Allocating it in advance since memory services are not available in
+ // Exit Boot Services callback function.
+ //
+ mReservedApLoopFunc = AllocateReservedCopyPool (
+ CpuMpData->AddressMap.RelocateApLoopFuncSize,
+ CpuMpData->AddressMap.RelocateApLoopFuncAddress
+ );
+ ASSERT (mReservedApLoopFunc != NULL);
+
Status = gBS->CreateEvent (
EVT_TIMER | EVT_NOTIFY_SIGNAL,
TPL_NOTIFY,