+typedef enum {\r
+ CpuStateIdle,\r
+ CpuStateBlocked,\r
+ CpuStateReady,\r
+ CpuStateBuzy,\r
+ CpuStateFinished\r
+} CPU_STATE;\r
+\r
+/**\r
+ Define Individual Processor Data block.\r
+\r
+**/\r
+typedef struct {\r
+ EFI_PROCESSOR_INFORMATION Info;\r
+ SPIN_LOCK CpuDataLock;\r
+ volatile CPU_STATE State;\r
+\r
+ EFI_AP_PROCEDURE Procedure;\r
+ VOID *Parameter;\r
+} CPU_DATA_BLOCK;\r
+\r
+/**\r
+ Define MP data block which consumes individual processor block.\r
+\r
+**/\r
+typedef struct {\r
+ CPU_DATA_BLOCK *CpuDatas;\r
+ UINTN NumberOfProcessors;\r
+ UINTN NumberOfEnabledProcessors;\r
+} MP_SYSTEM_DATA;\r
+\r
+/**\r
+ This function is called by all processors (both BSP and AP) once and collects MP related data.\r
+\r
+ @param Bsp TRUE if the CPU is BSP\r
+ @param ProcessorNumber The specific processor number\r
+\r
+ @retval EFI_SUCCESS Data for the processor collected and filled in\r
+\r
+**/\r
+EFI_STATUS\r
+FillInProcessorInformation (\r
+ IN BOOLEAN Bsp,\r
+ IN UINTN ProcessorNumber\r
+ );\r
+\r