/** 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); } if (CpuMpData->SaveRestoreFlag) { BackupAndPrepareWakeupBuffer (CpuMpData); } }
/** Allocate reset vector buffer. @param[in, out] CpuMpData The pointer to CPU MP Data structure. **/ VOID AllocateResetVector ( IN OUT CPU_MP_DATA *CpuMpData ) { EFI_STATUS Status; UINTN ApResetVectorSize; EFI_PHYSICAL_ADDRESS StartAddress; if (CpuMpData->SaveRestoreFlag) { BackupAndPrepareWakeupBuffer (CpuMpData); } else { ApResetVectorSize = CpuMpData->AddressMap.RendezvousFunnelSize + sizeof (MP_CPU_EXCHANGE_INFO); StartAddress = BASE_1MB; Status = gBS->AllocatePages ( AllocateMaxAddress, EfiACPIMemoryNVS, EFI_SIZE_TO_PAGES (ApResetVectorSize), &StartAddress ); ASSERT_EFI_ERROR (Status); CpuMpData->WakeupBuffer = (UINTN) StartAddress; CpuMpData->MpCpuExchangeInfo = (MP_CPU_EXCHANGE_INFO *) (UINTN) (CpuMpData->WakeupBuffer + CpuMpData->AddressMap.RendezvousFunnelSize); // // copy AP reset code in it // CopyMem ( (VOID *) CpuMpData->WakeupBuffer, (VOID *) CpuMpData->AddressMap.RendezvousFunnelAddress, CpuMpData->AddressMap.RendezvousFunnelSize ); } }