/** Worker function to execute a caller provided function on all enabled APs. @param[in] Procedure A pointer to the function to be run on enabled APs of the system. **/ VOID StartupAPsWorker ( IN EFI_AP_PROCEDURE Procedure ) { EFI_STATUS Status; EFI_PEI_MP_SERVICES_PPI *CpuMpPpi; // // Get MP Services Protocol // Status = PeiServicesLocatePpi ( &gEfiPeiMpServicesPpiGuid, 0, NULL, (VOID **)&CpuMpPpi ); ASSERT_EFI_ERROR (Status); // // Wakeup all APs for data collection. // Status = CpuMpPpi->StartupAllAPs ( GetPeiServicesTablePointer (), CpuMpPpi, Procedure, FALSE, 0, NULL ); ASSERT_EFI_ERROR (Status); }
/** Worker function to execute a caller provided function on all enabled APs. @param[in] Procedure A pointer to the function to be run on enabled APs of the system. @param[in] MpEvent The Event used to sync the result. **/ VOID StartupAPsWorker ( IN EFI_AP_PROCEDURE Procedure, IN EFI_EVENT MpEvent ) { EFI_STATUS Status; EFI_PEI_MP_SERVICES_PPI *CpuMpPpi; CPU_FEATURES_DATA *CpuFeaturesData; CpuFeaturesData = GetCpuFeaturesData (); CpuMpPpi = CpuFeaturesData->MpService.Ppi; // // Wakeup all APs for data collection. // Status = CpuMpPpi->StartupAllAPs ( GetPeiServicesTablePointer (), CpuMpPpi, Procedure, FALSE, 0, CpuFeaturesData ); ASSERT_EFI_ERROR (Status); }
/** Notification function called when EFI_PEI_MP_SERVICES_PPI becomes available. @param[in] PeiServices Indirect reference 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. @return Status of the notification. The status code returned from this function is ignored. **/ STATIC EFI_STATUS EFIAPI OnMpServicesAvailable ( IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor, IN VOID *Ppi ) { EFI_PEI_MP_SERVICES_PPI *MpServices; EFI_STATUS Status; DEBUG ((EFI_D_VERBOSE, "%a: %a\n", gEfiCallerBaseName, __FUNCTION__)); // // Write the MSR on all the APs in parallel. // MpServices = Ppi; Status = MpServices->StartupAllAPs ( (CONST EFI_PEI_SERVICES **)PeiServices, MpServices, WriteFeatureControl, // Procedure FALSE, // SingleThread 0, // TimeoutInMicroSeconds: inf. NULL // ProcedureArgument ); if (EFI_ERROR (Status) && Status != EFI_NOT_STARTED) { DEBUG ((EFI_D_ERROR, "%a: StartupAllAps(): %r\n", __FUNCTION__, Status)); return Status; } // // Now write the MSR on the BSP too. // WriteFeatureControl (NULL); return EFI_SUCCESS; }