/** AP initialization after SMBASE relocation in the S3 boot path. **/ VOID MPRendezvousProcedure ( VOID ) { CPU_REGISTER_TABLE *RegisterTableList; UINT32 InitApicId; UINTN Index; ProgramVirtualWireMode (); DisableLvtInterrupts (); RegisterTableList = (CPU_REGISTER_TABLE *) (UINTN) mAcpiCpuData.RegisterTable; InitApicId = GetInitialApicId (); for (Index = 0; Index < mAcpiCpuData.NumberOfCpus; Index++) { if (RegisterTableList[Index].InitialApicId == InitApicId) { SetProcessorRegister (&RegisterTableList[Index]); break; } } // // Count down the number with lock mechanism. // InterlockedDecrement (&mNumberToFinish); }
/** AP initialization before then after SMBASE relocation in the S3 boot path. **/ VOID InitializeAp ( VOID ) { UINTN TopOfStack; UINT8 Stack[128]; LoadMtrrData (mAcpiCpuData.MtrrTable); SetProcessorRegister ((CPU_REGISTER_TABLE *) (UINTN) mAcpiCpuData.PreSmmInitRegisterTable, mAcpiCpuData.NumberOfCpus); // // Count down the number with lock mechanism. // InterlockedDecrement (&mNumberToFinish); // // Wait for BSP to signal SMM Base relocation done. // while (!mInitApsAfterSmmBaseReloc) { CpuPause (); } ProgramVirtualWireMode (); DisableLvtInterrupts (); SetProcessorRegister ((CPU_REGISTER_TABLE *) (UINTN) mAcpiCpuData.RegisterTable, mAcpiCpuData.NumberOfCpus); // // Place AP into the safe code, count down the number with lock mechanism in the safe code. // TopOfStack = (UINTN) Stack + sizeof (Stack); TopOfStack &= ~(UINTN) (CPU_STACK_ALIGNMENT - 1); CopyMem ((VOID *) (UINTN) mApHltLoopCode, mApHltLoopCodeTemplate, sizeof (mApHltLoopCodeTemplate)); TransferApToSafeState ((UINTN)mApHltLoopCode, TopOfStack, (UINTN)&mNumberToFinish); }