#define LEGACY_REGION_BASE (0xA0000 - LEGACY_REGION_SIZE)\r
\r
ACPI_CPU_DATA mAcpiCpuData;\r
-UINT32 mNumberToFinish;\r
+volatile UINT32 mNumberToFinish;\r
MP_CPU_EXCHANGE_INFO *mExchangeInfo;\r
BOOLEAN mRestoreSmmConfigurationInS3 = FALSE;\r
VOID *mGdtForAp = NULL;\r
\r
UINT8 *mApHltLoopCode = NULL;\r
UINT8 mApHltLoopCodeTemplate[] = {\r
- 0xFA, // cli\r
- 0xF4, // hlt\r
- 0xEB, 0xFC // jmp $-2\r
+ 0x8B, 0x44, 0x24, 0x04, // mov eax, dword ptr [esp+4]\r
+ 0xF0, 0xFF, 0x08, // lock dec dword ptr [eax]\r
+ 0xFA, // cli\r
+ 0xF4, // hlt\r
+ 0xEB, 0xFC // jmp $-2\r
};\r
\r
/**\r
CPU_REGISTER_TABLE *RegisterTableList;\r
UINT32 InitApicId;\r
UINTN Index;\r
- UINT32 TopOfStack;\r
+ UINTN TopOfStack;\r
UINT8 Stack[128];\r
\r
ProgramVirtualWireMode ();\r
}\r
\r
//\r
- // Count down the number with lock mechanism.\r
- //\r
- InterlockedDecrement (&mNumberToFinish);\r
-\r
- //\r
- // Place AP into the safe code\r
+ // Place AP into the safe code, count down the number with lock mechanism in the safe code.\r
//\r
- TopOfStack = (UINT32) (UINTN) Stack + sizeof (Stack);\r
- TopOfStack &= ~(UINT32) (CPU_STACK_ALIGNMENT - 1);\r
+ TopOfStack = (UINTN) Stack + sizeof (Stack);\r
+ TopOfStack &= ~(UINTN) (CPU_STACK_ALIGNMENT - 1);\r
CopyMem ((VOID *) (UINTN) mApHltLoopCode, mApHltLoopCodeTemplate, sizeof (mApHltLoopCodeTemplate));\r
- TransferApToSafeState ((UINT32) (UINTN) mApHltLoopCode, TopOfStack);\r
+ TransferApToSafeState ((UINTN)mApHltLoopCode, TopOfStack, (UINTN)&mNumberToFinish);\r
}\r
\r
/**\r