/** @file\r
CPU PEI Module installs CPU Multiple Processor PPI.\r
\r
- Copyright (c) 2015 - 2019, Intel Corporation. All rights reserved.<BR>\r
+ Copyright (c) 2015 - 2021, Intel Corporation. All rights reserved.<BR>\r
SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
#include "CpuMpPei.h"\r
\r
-extern EDKII_PEI_MP_SERVICES2_PPI mMpServices2Ppi;\r
+extern EDKII_PEI_MP_SERVICES2_PPI mMpServices2Ppi;\r
\r
//\r
// CPU MP PPI to be installed\r
//\r
-EFI_PEI_MP_SERVICES_PPI mMpServicesPpi = {\r
+EFI_PEI_MP_SERVICES_PPI mMpServicesPpi = {\r
PeiGetNumberOfProcessors,\r
PeiGetProcessorInfo,\r
PeiStartupAllAPs,\r
PeiWhoAmI,\r
};\r
\r
-EFI_PEI_PPI_DESCRIPTOR mPeiCpuMpPpiList[] = {\r
+EFI_PEI_PPI_DESCRIPTOR mPeiCpuMpPpiList[] = {\r
{\r
EFI_PEI_PPI_DESCRIPTOR_PPI,\r
&gEdkiiPeiMpServices2PpiGuid,\r
EFI_STATUS\r
EFIAPI\r
PeiGetNumberOfProcessors (\r
- IN CONST EFI_PEI_SERVICES **PeiServices,\r
- IN EFI_PEI_MP_SERVICES_PPI *This,\r
- OUT UINTN *NumberOfProcessors,\r
- OUT UINTN *NumberOfEnabledProcessors\r
+ IN CONST EFI_PEI_SERVICES **PeiServices,\r
+ IN EFI_PEI_MP_SERVICES_PPI *This,\r
+ OUT UINTN *NumberOfProcessors,\r
+ OUT UINTN *NumberOfEnabledProcessors\r
)\r
{\r
if ((NumberOfProcessors == NULL) || (NumberOfEnabledProcessors == NULL)) {\r
EFI_STATUS\r
EFIAPI\r
PeiStartupAllAPs (\r
- IN CONST EFI_PEI_SERVICES **PeiServices,\r
- IN EFI_PEI_MP_SERVICES_PPI *This,\r
- IN EFI_AP_PROCEDURE Procedure,\r
- IN BOOLEAN SingleThread,\r
- IN UINTN TimeoutInMicroSeconds,\r
- IN VOID *ProcedureArgument OPTIONAL\r
+ IN CONST EFI_PEI_SERVICES **PeiServices,\r
+ IN EFI_PEI_MP_SERVICES_PPI *This,\r
+ IN EFI_AP_PROCEDURE Procedure,\r
+ IN BOOLEAN SingleThread,\r
+ IN UINTN TimeoutInMicroSeconds,\r
+ IN VOID *ProcedureArgument OPTIONAL\r
)\r
{\r
return MpInitLibStartupAllAPs (\r
EFI_STATUS\r
EFIAPI\r
PeiStartupThisAP (\r
- IN CONST EFI_PEI_SERVICES **PeiServices,\r
- IN EFI_PEI_MP_SERVICES_PPI *This,\r
- IN EFI_AP_PROCEDURE Procedure,\r
- IN UINTN ProcessorNumber,\r
- IN UINTN TimeoutInMicroseconds,\r
- IN VOID *ProcedureArgument OPTIONAL\r
+ IN CONST EFI_PEI_SERVICES **PeiServices,\r
+ IN EFI_PEI_MP_SERVICES_PPI *This,\r
+ IN EFI_AP_PROCEDURE Procedure,\r
+ IN UINTN ProcessorNumber,\r
+ IN UINTN TimeoutInMicroseconds,\r
+ IN VOID *ProcedureArgument OPTIONAL\r
)\r
{\r
return MpInitLibStartupThisAP (\r
EFI_STATUS\r
EFIAPI\r
PeiEnableDisableAP (\r
- IN CONST EFI_PEI_SERVICES **PeiServices,\r
- IN EFI_PEI_MP_SERVICES_PPI *This,\r
- IN UINTN ProcessorNumber,\r
- IN BOOLEAN EnableAP,\r
- IN UINT32 *HealthFlag OPTIONAL\r
+ IN CONST EFI_PEI_SERVICES **PeiServices,\r
+ IN EFI_PEI_MP_SERVICES_PPI *This,\r
+ IN UINTN ProcessorNumber,\r
+ IN BOOLEAN EnableAP,\r
+ IN UINT32 *HealthFlag OPTIONAL\r
)\r
{\r
return MpInitLibEnableDisableAP (ProcessorNumber, EnableAP, HealthFlag);\r
VOID\r
EFIAPI\r
GetGdtr (\r
- IN OUT VOID *Buffer\r
+ IN OUT VOID *Buffer\r
)\r
{\r
AsmReadGdtr ((IA32_DESCRIPTOR *)Buffer);\r
}\r
\r
-/**\r
- Migrates the Global Descriptor Table (GDT) to permanent memory.\r
-\r
- @retval EFI_SUCCESS The GDT was migrated successfully.\r
- @retval EFI_OUT_OF_RESOURCES The GDT could not be migrated due to lack of available memory.\r
-\r
-**/\r
-EFI_STATUS\r
-MigrateGdt (\r
- VOID\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINTN GdtBufferSize;\r
- IA32_DESCRIPTOR Gdtr;\r
- VOID *GdtBuffer;\r
-\r
- AsmReadGdtr ((IA32_DESCRIPTOR *) &Gdtr);\r
- GdtBufferSize = sizeof (IA32_SEGMENT_DESCRIPTOR) -1 + Gdtr.Limit + 1;\r
-\r
- Status = PeiServicesAllocatePool (\r
- GdtBufferSize,\r
- &GdtBuffer\r
- );\r
- ASSERT (GdtBuffer != NULL);\r
- if (EFI_ERROR (Status)) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- GdtBuffer = ALIGN_POINTER (GdtBuffer, sizeof (IA32_SEGMENT_DESCRIPTOR));\r
- CopyMem (GdtBuffer, (VOID *) Gdtr.Base, Gdtr.Limit + 1);\r
- Gdtr.Base = (UINTN) GdtBuffer;\r
- AsmWriteGdtr (&Gdtr);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
/**\r
Initializes CPU exceptions handlers for the sake of stack switch requirement.\r
\r
VOID\r
EFIAPI\r
InitializeExceptionStackSwitchHandlers (\r
- IN OUT VOID *Buffer\r
+ IN OUT VOID *Buffer\r
)\r
{\r
- CPU_EXCEPTION_INIT_DATA *EssData;\r
- IA32_DESCRIPTOR Idtr;\r
- EFI_STATUS Status;\r
+ CPU_EXCEPTION_INIT_DATA *EssData;\r
+ IA32_DESCRIPTOR Idtr;\r
+ EFI_STATUS Status;\r
\r
EssData = Buffer;\r
//\r
// the AP's IDT is the same as BSP's IDT either.\r
//\r
AsmReadIdtr (&Idtr);\r
- EssData->Ia32.IdtTable = (VOID *)Idtr.Base;\r
+ EssData->Ia32.IdtTable = (VOID *)Idtr.Base;\r
EssData->Ia32.IdtTableSize = Idtr.Limit + 1;\r
- Status = InitializeCpuExceptionHandlersEx (NULL, EssData);\r
+ Status = InitializeCpuExceptionHandlersEx (NULL, EssData);\r
ASSERT_EFI_ERROR (Status);\r
}\r
\r
VOID\r
)\r
{\r
- EFI_STATUS Status;\r
- UINTN Index;\r
- UINTN Bsp;\r
- UINTN ExceptionNumber;\r
- UINTN OldGdtSize;\r
- UINTN NewGdtSize;\r
- UINTN NewStackSize;\r
- IA32_DESCRIPTOR Gdtr;\r
- CPU_EXCEPTION_INIT_DATA EssData;\r
- UINT8 *GdtBuffer;\r
- UINT8 *StackTop;\r
- UINTN NumberOfProcessors;\r
+ EFI_STATUS Status;\r
+ UINTN Index;\r
+ UINTN Bsp;\r
+ UINTN ExceptionNumber;\r
+ UINTN OldGdtSize;\r
+ UINTN NewGdtSize;\r
+ UINTN NewStackSize;\r
+ IA32_DESCRIPTOR Gdtr;\r
+ CPU_EXCEPTION_INIT_DATA EssData;\r
+ UINT8 *GdtBuffer;\r
+ UINT8 *StackTop;\r
+ UINTN NumberOfProcessors;\r
\r
if (!PcdGetBool (PcdCpuStackGuard)) {\r
return;\r
}\r
\r
- MpInitLibGetNumberOfProcessors(&NumberOfProcessors, NULL);\r
+ MpInitLibGetNumberOfProcessors (&NumberOfProcessors, NULL);\r
MpInitLibWhoAmI (&Bsp);\r
\r
ExceptionNumber = FixedPcdGetSize (PcdCpuStackSwitchExceptionList);\r
- NewStackSize = FixedPcdGet32 (PcdCpuKnownGoodStackSize) * ExceptionNumber;\r
+ NewStackSize = FixedPcdGet32 (PcdCpuKnownGoodStackSize) * ExceptionNumber;\r
\r
- Status = PeiServicesAllocatePool (\r
- NewStackSize * NumberOfProcessors,\r
- (VOID **)&StackTop\r
- );\r
- ASSERT(StackTop != NULL);\r
- if (EFI_ERROR (Status)) {\r
- ASSERT_EFI_ERROR (Status);\r
+ StackTop = AllocatePages (EFI_SIZE_TO_PAGES (NewStackSize * NumberOfProcessors));\r
+ ASSERT (StackTop != NULL);\r
+ if (StackTop == NULL) {\r
return;\r
}\r
+\r
StackTop += NewStackSize * NumberOfProcessors;\r
\r
//\r
// The default exception handlers must have been initialized. Let's just skip\r
// it in this method.\r
//\r
- EssData.Ia32.Revision = CPU_EXCEPTION_INIT_DATA_REV;\r
+ EssData.Ia32.Revision = CPU_EXCEPTION_INIT_DATA_REV;\r
EssData.Ia32.InitDefaultHandlers = FALSE;\r
\r
- EssData.Ia32.StackSwitchExceptions = FixedPcdGetPtr(PcdCpuStackSwitchExceptionList);\r
+ EssData.Ia32.StackSwitchExceptions = FixedPcdGetPtr (PcdCpuStackSwitchExceptionList);\r
EssData.Ia32.StackSwitchExceptionNumber = ExceptionNumber;\r
- EssData.Ia32.KnownGoodStackSize = FixedPcdGet32(PcdCpuKnownGoodStackSize);\r
+ EssData.Ia32.KnownGoodStackSize = FixedPcdGet32 (PcdCpuKnownGoodStackSize);\r
\r
//\r
// Initialize Gdtr to suppress incorrect compiler/analyzer warnings.\r
//\r
- Gdtr.Base = 0;\r
+ Gdtr.Base = 0;\r
Gdtr.Limit = 0;\r
for (Index = 0; Index < NumberOfProcessors; ++Index) {\r
//\r
// To support stack switch, we need to re-construct GDT but not IDT.\r
//\r
if (Index == Bsp) {\r
- GetGdtr(&Gdtr);\r
+ GetGdtr (&Gdtr);\r
} else {\r
//\r
// AP might have different size of GDT from BSP.\r
// | |\r
// --------------------------------\r
//\r
- OldGdtSize = Gdtr.Limit + 1;\r
+ OldGdtSize = Gdtr.Limit + 1;\r
EssData.Ia32.ExceptionTssDescSize = sizeof (IA32_TSS_DESCRIPTOR) *\r
(ExceptionNumber + 1);\r
EssData.Ia32.ExceptionTssSize = sizeof (IA32_TASK_STATE_SEGMENT) *\r
//\r
// Make sure GDT table alignment\r
//\r
- EssData.Ia32.GdtTable = ALIGN_POINTER(GdtBuffer, sizeof (IA32_TSS_DESCRIPTOR));\r
- NewGdtSize -= ((UINT8 *)EssData.Ia32.GdtTable - GdtBuffer);\r
+ EssData.Ia32.GdtTable = ALIGN_POINTER (GdtBuffer, sizeof (IA32_TSS_DESCRIPTOR));\r
+ NewGdtSize -= ((UINT8 *)EssData.Ia32.GdtTable - GdtBuffer);\r
EssData.Ia32.GdtTableSize = NewGdtSize;\r
\r
EssData.Ia32.ExceptionTssDesc = ((UINT8 *)EssData.Ia32.GdtTable + OldGdtSize);\r
- EssData.Ia32.ExceptionTss = ((UINT8 *)EssData.Ia32.GdtTable + OldGdtSize +\r
- EssData.Ia32.ExceptionTssDescSize);\r
+ EssData.Ia32.ExceptionTss = ((UINT8 *)EssData.Ia32.GdtTable + OldGdtSize +\r
+ EssData.Ia32.ExceptionTssDescSize);\r
\r
EssData.Ia32.KnownGoodStackTop = (UINTN)StackTop;\r
- DEBUG ((DEBUG_INFO,\r
- "Exception stack top[cpu%lu]: 0x%lX\n",\r
- (UINT64)(UINTN)Index,\r
- (UINT64)(UINTN)StackTop));\r
+ DEBUG ((\r
+ DEBUG_INFO,\r
+ "Exception stack top[cpu%lu]: 0x%lX\n",\r
+ (UINT64)(UINTN)Index,\r
+ (UINT64)(UINTN)StackTop\r
+ ));\r
\r
if (Index == Bsp) {\r
InitializeExceptionStackSwitchHandlers (&EssData);\r
);\r
}\r
\r
- StackTop -= NewStackSize;\r
+ StackTop -= NewStackSize;\r
}\r
}\r
\r
**/\r
EFI_STATUS\r
InitializeCpuMpWorker (\r
- IN CONST EFI_PEI_SERVICES **PeiServices\r
+ IN CONST EFI_PEI_SERVICES **PeiServices\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_VECTOR_HANDOFF_INFO *VectorInfo;\r
- EFI_PEI_VECTOR_HANDOFF_INFO_PPI *VectorHandoffInfoPpi;\r
+ EFI_STATUS Status;\r
+ EFI_VECTOR_HANDOFF_INFO *VectorInfo;\r
+ EFI_PEI_VECTOR_HANDOFF_INFO_PPI *VectorHandoffInfoPpi;\r
\r
//\r
// Get Vector Hand-off Info PPI\r
//\r
VectorInfo = NULL;\r
- Status = PeiServicesLocatePpi (\r
- &gEfiVectorHandoffInfoPpiGuid,\r
- 0,\r
- NULL,\r
- (VOID **)&VectorHandoffInfoPpi\r
- );\r
+ Status = PeiServicesLocatePpi (\r
+ &gEfiVectorHandoffInfoPpiGuid,\r
+ 0,\r
+ NULL,\r
+ (VOID **)&VectorHandoffInfoPpi\r
+ );\r
if (Status == EFI_SUCCESS) {\r
VectorInfo = VectorHandoffInfoPpi->Info;\r
}\r
//\r
// Install CPU MP PPI\r
//\r
- Status = PeiServicesInstallPpi(mPeiCpuMpPpiList);\r
+ Status = PeiServicesInstallPpi (mPeiCpuMpPpiList);\r
ASSERT_EFI_ERROR (Status);\r
\r
return Status;\r
IN CONST EFI_PEI_SERVICES **PeiServices\r
)\r
{\r
- EFI_STATUS Status;\r
+ EFI_STATUS Status;\r
\r
//\r
// For the sake of special initialization needing to be done right after\r