28 EFI_PEI_PPI_DESCRIPTOR_PPI,
29 &gEdkiiPeiMpServices2PpiGuid,
33 (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
34 &gEfiPeiMpServicesPpiGuid,
82 if ((NumberOfProcessors ==
NULL) || (NumberOfEnabledProcessors ==
NULL)) {
83 return EFI_INVALID_PARAMETER;
88 NumberOfEnabledProcessors
199 IN BOOLEAN SingleThread,
200 IN UINTN TimeoutInMicroSeconds,
201 IN VOID *ProcedureArgument OPTIONAL
208 TimeoutInMicroSeconds,
267 IN UINTN TimeoutInMicroseconds,
268 IN VOID *ProcedureArgument OPTIONAL
275 TimeoutInMicroseconds,
321 IN BOOLEAN EnableOldBSP
373 IN UINT32 *HealthFlag OPTIONAL
448 if ((SwitchStackData[Index].Status == EFI_NOT_STARTED) || (SwitchStackData[Index].Status == EFI_BUFFER_TOO_SMALL)) {
449 SwitchStackData[Index].Status = InitializeSeparateExceptionStacks (SwitchStackData[Index].Buffer, &SwitchStackData[Index].BufferSize);
466 UINTN NumberOfProcessors;
479 if (EFI_ERROR (Status)) {
480 NumberOfProcessors = 1;
484 ASSERT (SwitchStackData !=
NULL);
486 for (Index = 0; Index < NumberOfProcessors; ++Index) {
491 SwitchStackData[Index].Status = EFI_NOT_STARTED;
502 for (Index = 0; Index < NumberOfProcessors; ++Index) {
503 if (SwitchStackData[Index].Status == EFI_BUFFER_TOO_SMALL) {
504 ASSERT (SwitchStackData[Index].BufferSize != 0);
505 BufferSize += SwitchStackData[Index].BufferSize;
507 ASSERT (SwitchStackData[Index].Status ==
EFI_SUCCESS);
508 ASSERT (SwitchStackData[Index].BufferSize == 0);
512 if (BufferSize != 0) {
514 ASSERT (Buffer !=
NULL);
516 for (Index = 0; Index < NumberOfProcessors; ++Index) {
517 if (SwitchStackData[Index].Status == EFI_BUFFER_TOO_SMALL) {
518 SwitchStackData[Index].Buffer = (VOID *)(&Buffer[BufferSize]);
519 BufferSize += SwitchStackData[Index].BufferSize;
522 "Buffer[cpu%lu] for InitializeExceptionStackSwitchHandlers: 0x%lX with size 0x%lX\n",
523 (UINT64)(
UINTN)Index,
524 (UINT64)(
UINTN)SwitchStackData[Index].Buffer,
525 (UINT64)(
UINTN)SwitchStackData[Index].BufferSize
536 for (Index = 0; Index < NumberOfProcessors; ++Index) {
537 ASSERT (SwitchStackData[Index].Status ==
EFI_SUCCESS);
567 &gEfiVectorHandoffInfoPpiGuid,
570 (VOID **)&VectorHandoffInfoPpi
573 VectorInfo = VectorHandoffInfoPpi->Info;
579 Status = InitializeCpuExceptionHandlers (VectorInfo);
580 if (EFI_ERROR (Status)) {
585 if (EFI_ERROR (Status)) {
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
VOID CollectBistDataFromPpi(IN CONST EFI_PEI_SERVICES **PeiServices)
VOID EFIAPI InitializeExceptionStackSwitchHandlers(IN OUT VOID *Buffer)
EFI_STATUS EFIAPI CpuMpPeimInit(IN EFI_PEI_FILE_HANDLE FileHandle, IN CONST EFI_PEI_SERVICES **PeiServices)
EFI_STATUS EFIAPI PeiGetProcessorInfo(IN CONST EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_MP_SERVICES_PPI *This, IN UINTN ProcessorNumber, OUT EFI_PROCESSOR_INFORMATION *ProcessorInfoBuffer)
VOID InitializeMpExceptionStackSwitchHandlers(VOID)
EFI_STATUS EFIAPI PeiWhoAmI(IN CONST EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_MP_SERVICES_PPI *This, OUT UINTN *ProcessorNumber)
EFI_STATUS EFIAPI PeiStartupAllAPs(IN CONST EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_MP_SERVICES_PPI *This, IN EFI_AP_PROCEDURE Procedure, IN BOOLEAN SingleThread, IN UINTN TimeoutInMicroSeconds, IN VOID *ProcedureArgument OPTIONAL)
EFI_STATUS EFIAPI PeiEnableDisableAP(IN CONST EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_MP_SERVICES_PPI *This, IN UINTN ProcessorNumber, IN BOOLEAN EnableAP, IN UINT32 *HealthFlag OPTIONAL)
EFI_STATUS EFIAPI PeiSwitchBSP(IN CONST EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_MP_SERVICES_PPI *This, IN UINTN ProcessorNumber, IN BOOLEAN EnableOldBSP)
EFI_STATUS InitializeCpuMpWorker(IN CONST EFI_PEI_SERVICES **PeiServices)
EFI_STATUS EFIAPI PeiStartupThisAP(IN CONST EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_MP_SERVICES_PPI *This, IN EFI_AP_PROCEDURE Procedure, IN UINTN ProcessorNumber, IN UINTN TimeoutInMicroseconds, IN VOID *ProcedureArgument OPTIONAL)
EFI_STATUS EFIAPI PeiGetNumberOfProcessors(IN CONST EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_MP_SERVICES_PPI *This, OUT UINTN *NumberOfProcessors, OUT UINTN *NumberOfEnabledProcessors)
#define ASSERT_EFI_ERROR(StatusParameter)
#define DEBUG(Expression)
VOID EFIAPI FreePages(IN VOID *Buffer, IN UINTN Pages)
EFI_STATUS EFIAPI PeiServicesLocatePpi(IN CONST EFI_GUID *Guid, IN UINTN Instance, IN OUT EFI_PEI_PPI_DESCRIPTOR **PpiDescriptor, IN OUT VOID **Ppi)
EFI_STATUS EFIAPI PeiServicesNotifyPpi(IN CONST EFI_PEI_NOTIFY_DESCRIPTOR *NotifyList)
EFI_STATUS EFIAPI PeiServicesInstallPpi(IN CONST EFI_PEI_PPI_DESCRIPTOR *PpiList)
EFI_STATUS EFIAPI MpInitLibEnableDisableAP(IN UINTN ProcessorNumber, IN BOOLEAN EnableAP, IN UINT32 *HealthFlag OPTIONAL)
EFI_STATUS EFIAPI MpInitLibStartupAllAPs(IN EFI_AP_PROCEDURE Procedure, IN BOOLEAN SingleThread, IN EFI_EVENT WaitEvent OPTIONAL, IN UINTN TimeoutInMicroseconds, IN VOID *ProcedureArgument OPTIONAL, OUT UINTN **FailedCpuList OPTIONAL)
EFI_STATUS EFIAPI MpInitLibWhoAmI(OUT UINTN *ProcessorNumber)
EFI_STATUS EFIAPI MpInitLibGetNumberOfProcessors(OUT UINTN *NumberOfProcessors OPTIONAL, OUT UINTN *NumberOfEnabledProcessors OPTIONAL)
EFI_STATUS EFIAPI MpInitLibSwitchBSP(IN UINTN ProcessorNumber, IN BOOLEAN EnableOldBSP)
EFI_STATUS EFIAPI MpInitLibStartupAllCPUs(IN EFI_AP_PROCEDURE Procedure, IN UINTN TimeoutInMicroseconds, IN VOID *ProcedureArgument OPTIONAL)
EFI_STATUS EFIAPI MpInitLibGetProcessorInfo(IN UINTN ProcessorNumber, OUT EFI_PROCESSOR_INFORMATION *ProcessorInfoBuffer, OUT EFI_HEALTH_FLAGS *HealthData OPTIONAL)
EFI_STATUS EFIAPI MpInitLibInitialize(VOID)
EFI_STATUS EFIAPI MpInitLibStartupThisAP(IN EFI_AP_PROCEDURE Procedure, IN UINTN ProcessorNumber, IN EFI_EVENT WaitEvent OPTIONAL, IN UINTN TimeoutInMicroseconds, IN VOID *ProcedureArgument OPTIONAL, OUT BOOLEAN *Finished OPTIONAL)
#define PcdGetBool(TokenName)
VOID(EFIAPI * EFI_AP_PROCEDURE)(IN OUT VOID *Buffer)
VOID * EFI_PEI_FILE_HANDLE
VOID *EFIAPI AllocatePages(IN UINTN Pages)
#define EFI_SIZE_TO_PAGES(Size)