}\r
\r
/**\r
- Allocate reset vector buffer.\r
+ Get available EfiBootServicesCode memory below 4GB by specified size.\r
\r
- @param[in, out] CpuMpData The pointer to CPU MP Data structure.\r
-**/\r
-VOID\r
-AllocateResetVector (\r
- IN OUT CPU_MP_DATA *CpuMpData\r
- )\r
-{\r
- UINTN ApResetVectorSize;\r
+ This buffer is required to safely transfer AP from real address mode to\r
+ protected mode or long mode, due to the fact that the buffer returned by\r
+ GetWakeupBuffer() may be marked as non-executable.\r
\r
- if (CpuMpData->WakeupBuffer == (UINTN) -1) {\r
- ApResetVectorSize = CpuMpData->AddressMap.RendezvousFunnelSize +\r
- sizeof (MP_CPU_EXCHANGE_INFO);\r
-\r
- CpuMpData->WakeupBuffer = GetWakeupBuffer (ApResetVectorSize);\r
- CpuMpData->MpCpuExchangeInfo = (MP_CPU_EXCHANGE_INFO *) (UINTN)\r
- (CpuMpData->WakeupBuffer + CpuMpData->AddressMap.RendezvousFunnelSize);\r
- }\r
- BackupAndPrepareWakeupBuffer (CpuMpData);\r
-}\r
+ @param[in] BufferSize Wakeup transition buffer size.\r
\r
-/**\r
- Free AP reset vector buffer.\r
-\r
- @param[in] CpuMpData The pointer to CPU MP Data structure.\r
+ @retval other Return wakeup transition buffer address below 4GB.\r
+ @retval 0 Cannot find free memory below 4GB.\r
**/\r
-VOID\r
-FreeResetVector (\r
- IN CPU_MP_DATA *CpuMpData\r
+UINTN\r
+GetModeTransitionBuffer (\r
+ IN UINTN BufferSize\r
)\r
{\r
- RestoreWakeupBuffer (CpuMpData);\r
+ //\r
+ // PEI phase doesn't need to do such transition. So simply return 0.\r
+ //\r
+ return 0;\r
}\r
\r
/**\r