/** Free AP reset vector buffer. @param[in] CpuMpData The pointer to CPU MP Data structure. **/ VOID FreeResetVector ( IN CPU_MP_DATA *CpuMpData ) { if (CpuMpData->SaveRestoreFlag) { RestoreWakeupBuffer (CpuMpData); } }
/** Notify function on End Of PEI PPI. On S3 boot, this function will restore wakeup buffer data. On normal boot, this function will flag wakeup buffer to be un-used type. @param[in] PeiServices The pointer to the PEI Services Table. @param[in] NotifyDescriptor Address of the notification descriptor data structure. @param[in] Ppi Address of the PPI that was installed. @retval EFI_SUCCESS When everything is OK. **/ EFI_STATUS EFIAPI CpuMpEndOfPeiCallback ( IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor, IN VOID *Ppi ) { EFI_STATUS Status; EFI_BOOT_MODE BootMode; CPU_MP_DATA *CpuMpData; EFI_PEI_HOB_POINTERS Hob; EFI_HOB_MEMORY_ALLOCATION *MemoryHob; DEBUG ((DEBUG_INFO, "PeiMpInitLib: CpuMpEndOfPeiCallback () invoked\n")); Status = PeiServicesGetBootMode (&BootMode); ASSERT_EFI_ERROR (Status); CpuMpData = GetCpuMpData (); if (BootMode != BOOT_ON_S3_RESUME) { // // Get the HOB list for processing // Hob.Raw = GetHobList (); // // Collect memory ranges // while (!END_OF_HOB_LIST (Hob)) { if (Hob.Header->HobType == EFI_HOB_TYPE_MEMORY_ALLOCATION) { MemoryHob = Hob.MemoryAllocation; if (MemoryHob->AllocDescriptor.MemoryBaseAddress == CpuMpData->WakeupBuffer) { // // Flag this HOB type to un-used // GET_HOB_TYPE (Hob) = EFI_HOB_TYPE_UNUSED; break; } } Hob.Raw = GET_NEXT_HOB (Hob); } } else { CpuMpData->SaveRestoreFlag = TRUE; RestoreWakeupBuffer (CpuMpData); } return EFI_SUCCESS; }
/** Free AP reset vector buffer. @param[in] CpuMpData The pointer to CPU MP Data structure. **/ VOID FreeResetVector ( IN CPU_MP_DATA *CpuMpData ) { EFI_STATUS Status; UINTN ApResetVectorSize; if (CpuMpData->SaveRestoreFlag) { RestoreWakeupBuffer (CpuMpData); } else { ApResetVectorSize = CpuMpData->AddressMap.RendezvousFunnelSize + sizeof (MP_CPU_EXCHANGE_INFO); Status = gBS->FreePages( (EFI_PHYSICAL_ADDRESS)CpuMpData->WakeupBuffer, EFI_SIZE_TO_PAGES (ApResetVectorSize) ); ASSERT_EFI_ERROR (Status); } }