UefiCpuPkg MpInitLib: Save/restore original WakeupBuffer for DxeMpLib
Current code always allocates/frees < 1MB WakeupBuffer for DxeMpLib
until ExitBootService, but the allocation may be failed at late
phase of the boot.
This patch is to always save/restore original WakeupBuffer for
DxeMpLib, it is aligned with the solution for PeiMpLib at
9293d6e42e
, then AllocateResetVector()
and FreeResetVector() will be common and moved to MpLib.c.
Only difference is GetWakeupBuffer() that will be in PeiMpLib or
DxeMpLib respectively.
Cc: Liming Gao <liming.gao@intel.com>
Cc: Ruiyu Ni <ruiyu.ni@intel.com>
Cc: Eric Dong <eric.dong@intel.com>
Cc: Jeff Fan <jeff.fan@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Star Zeng <star.zeng@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
This commit is contained in:
@@ -795,6 +795,81 @@ TimedWaitForApFinish (
|
||||
IN UINT32 TimeLimit
|
||||
);
|
||||
|
||||
/**
|
||||
Get available system memory below 1MB by specified size.
|
||||
|
||||
@param[in] CpuMpData The pointer to CPU MP Data structure.
|
||||
**/
|
||||
VOID
|
||||
BackupAndPrepareWakeupBuffer(
|
||||
IN CPU_MP_DATA *CpuMpData
|
||||
)
|
||||
{
|
||||
CopyMem (
|
||||
(VOID *) CpuMpData->BackupBuffer,
|
||||
(VOID *) CpuMpData->WakeupBuffer,
|
||||
CpuMpData->BackupBufferSize
|
||||
);
|
||||
CopyMem (
|
||||
(VOID *) CpuMpData->WakeupBuffer,
|
||||
(VOID *) CpuMpData->AddressMap.RendezvousFunnelAddress,
|
||||
CpuMpData->AddressMap.RendezvousFunnelSize
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
Restore wakeup buffer data.
|
||||
|
||||
@param[in] CpuMpData The pointer to CPU MP Data structure.
|
||||
**/
|
||||
VOID
|
||||
RestoreWakeupBuffer(
|
||||
IN CPU_MP_DATA *CpuMpData
|
||||
)
|
||||
{
|
||||
CopyMem (
|
||||
(VOID *) CpuMpData->WakeupBuffer,
|
||||
(VOID *) CpuMpData->BackupBuffer,
|
||||
CpuMpData->BackupBufferSize
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
Allocate reset vector buffer.
|
||||
|
||||
@param[in, out] CpuMpData The pointer to CPU MP Data structure.
|
||||
**/
|
||||
VOID
|
||||
AllocateResetVector (
|
||||
IN OUT CPU_MP_DATA *CpuMpData
|
||||
)
|
||||
{
|
||||
UINTN ApResetVectorSize;
|
||||
|
||||
if (CpuMpData->WakeupBuffer == (UINTN) -1) {
|
||||
ApResetVectorSize = CpuMpData->AddressMap.RendezvousFunnelSize +
|
||||
sizeof (MP_CPU_EXCHANGE_INFO);
|
||||
|
||||
CpuMpData->WakeupBuffer = GetWakeupBuffer (ApResetVectorSize);
|
||||
CpuMpData->MpCpuExchangeInfo = (MP_CPU_EXCHANGE_INFO *) (UINTN)
|
||||
(CpuMpData->WakeupBuffer + CpuMpData->AddressMap.RendezvousFunnelSize);
|
||||
}
|
||||
BackupAndPrepareWakeupBuffer (CpuMpData);
|
||||
}
|
||||
|
||||
/**
|
||||
Free AP reset vector buffer.
|
||||
|
||||
@param[in] CpuMpData The pointer to CPU MP Data structure.
|
||||
**/
|
||||
VOID
|
||||
FreeResetVector (
|
||||
IN CPU_MP_DATA *CpuMpData
|
||||
)
|
||||
{
|
||||
RestoreWakeupBuffer (CpuMpData);
|
||||
}
|
||||
|
||||
/**
|
||||
This function will be called by BSP to wakeup AP.
|
||||
|
||||
@@ -1353,7 +1428,6 @@ MpInitLibInitialize (
|
||||
CpuMpData->CpuApStackSize = ApStackSize;
|
||||
CpuMpData->BackupBuffer = BackupBufferAddr;
|
||||
CpuMpData->BackupBufferSize = ApResetVectorSize;
|
||||
CpuMpData->SaveRestoreFlag = FALSE;
|
||||
CpuMpData->WakeupBuffer = (UINTN) -1;
|
||||
CpuMpData->CpuCount = 1;
|
||||
CpuMpData->BspNumber = 0;
|
||||
@@ -2120,41 +2194,3 @@ GetCpuMpDataFromGuidedHob (
|
||||
return CpuMpData;
|
||||
}
|
||||
|
||||
/**
|
||||
Get available system memory below 1MB by specified size.
|
||||
|
||||
@param[in] CpuMpData The pointer to CPU MP Data structure.
|
||||
**/
|
||||
VOID
|
||||
BackupAndPrepareWakeupBuffer(
|
||||
IN CPU_MP_DATA *CpuMpData
|
||||
)
|
||||
{
|
||||
CopyMem (
|
||||
(VOID *) CpuMpData->BackupBuffer,
|
||||
(VOID *) CpuMpData->WakeupBuffer,
|
||||
CpuMpData->BackupBufferSize
|
||||
);
|
||||
CopyMem (
|
||||
(VOID *) CpuMpData->WakeupBuffer,
|
||||
(VOID *) CpuMpData->AddressMap.RendezvousFunnelAddress,
|
||||
CpuMpData->AddressMap.RendezvousFunnelSize
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
Restore wakeup buffer data.
|
||||
|
||||
@param[in] CpuMpData The pointer to CPU MP Data structure.
|
||||
**/
|
||||
VOID
|
||||
RestoreWakeupBuffer(
|
||||
IN CPU_MP_DATA *CpuMpData
|
||||
)
|
||||
{
|
||||
CopyMem (
|
||||
(VOID *) CpuMpData->WakeupBuffer,
|
||||
(VOID *) CpuMpData->BackupBuffer,
|
||||
CpuMpData->BackupBufferSize
|
||||
);
|
||||
}
|
||||
|
Reference in New Issue
Block a user