]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UefiCpuPkg/Library/MpInitLib/MpLib.h
UefiCpuPkg/MpLib: Add GDTR, IDTR and TR in saved AP data
[mirror_edk2.git] / UefiCpuPkg / Library / MpInitLib / MpLib.h
index eba6713df8970d8ef30f13c3dbd14c6602a48916..685e96cbac45f694ad7e03600da5a828338b3773 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Common header file for MP Initialize Library.\r
 \r
-  Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2016 - 2017, Intel Corporation. All rights reserved.<BR>\r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
   which accompanies this distribution.  The full text of the license may be found at\r
@@ -102,6 +102,9 @@ typedef struct {
   UINTN                          Dr3;\r
   UINTN                          Dr6;\r
   UINTN                          Dr7;\r
+  IA32_DESCRIPTOR                Gdtr;\r
+  IA32_DESCRIPTOR                Idtr;\r
+  UINT16                         Tr;\r
 } CPU_VOLATILE_REGISTERS;\r
 \r
 //\r
@@ -112,9 +115,6 @@ typedef struct {
   volatile UINT32                *StartupApSignal;\r
   volatile UINTN                 ApFunction;\r
   volatile UINTN                 ApFunctionArgument;\r
-  UINT32                         InitialApicId;\r
-  UINT32                         ApicId;\r
-  UINT32                         Health;\r
   BOOLEAN                        CpuHealthy;\r
   volatile CPU_STATE             State;\r
   CPU_VOLATILE_REGISTERS         VolatileRegisters;\r
@@ -132,11 +132,14 @@ typedef struct {
 // we need to make sure the each fields offset same in different\r
 // architecture.\r
 //\r
+#pragma pack (1)\r
 typedef struct {\r
   UINT32                         InitialApicId;\r
   UINT32                         ApicId;\r
   UINT32                         Health;\r
+  UINT64                         ApTopOfStack;\r
 } CPU_INFO_IN_HOB;\r
+#pragma pack ()\r
 \r
 //\r
 // AP reset code information including code address and size,\r
@@ -169,12 +172,16 @@ typedef struct {
   IA32_DESCRIPTOR       IdtrProfile;\r
   UINTN                 BufferStart;\r
   UINTN                 ModeOffset;\r
-  UINTN                 NumApsExecuting;\r
+  UINTN                 ApIndex;\r
   UINTN                 CodeSegment;\r
   UINTN                 DataSegment;\r
   UINTN                 EnableExecuteDisable;\r
   UINTN                 Cr3;\r
+  UINTN                 InitFlag;\r
+  CPU_INFO_IN_HOB       *CpuInfo;\r
+  UINTN                 NumApsExecuting;\r
   CPU_MP_DATA           *CpuMpData;\r
+  UINTN                 InitializeFloatingPointUnitsAddress;\r
 } MP_CPU_EXCHANGE_INFO;\r
 \r
 #pragma pack()\r
@@ -198,7 +205,6 @@ struct _CPU_MP_DATA {
   UINTN                          WakeupBuffer;\r
   UINTN                          BackupBuffer;\r
   UINTN                          BackupBufferSize;\r
-  BOOLEAN                        EndOfPeiFlag;\r
 \r
   volatile UINT32                StartCount;\r
   volatile UINT32                FinishedCount;\r
@@ -216,6 +222,7 @@ struct _CPU_MP_DATA {
   AP_INIT_STATE                  InitFlag;\r
   BOOLEAN                        X2ApicEnable;\r
   BOOLEAN                        SwitchBspFlag;\r
+  UINTN                          NewBspNumber;\r
   CPU_EXCHANGE_ROLE_INFO         BSPInfo;\r
   CPU_EXCHANGE_ROLE_INFO         APInfo;\r
   MTRR_SETTINGS                  MtrrTable;\r
@@ -224,6 +231,14 @@ struct _CPU_MP_DATA {
   UINT16                         PmCodeSegment;\r
   CPU_AP_DATA                    *CpuData;\r
   volatile MP_CPU_EXCHANGE_INFO  *MpCpuExchangeInfo;\r
+\r
+  UINT32                         CurrentTimerCount;\r
+  UINTN                          DivideValue;\r
+  UINT8                          Vector;\r
+  BOOLEAN                        PeriodicMode;\r
+  BOOLEAN                        TimerInterruptState;\r
+  UINT64                         MicrocodePatchAddress;\r
+  UINT64                         MicrocodePatchRegionSize;\r
 };\r
 \r
 extern EFI_GUID mCpuInitMpLibHobGuid;\r
@@ -247,7 +262,9 @@ VOID
 (EFIAPI * ASM_RELOCATE_AP_LOOP) (\r
   IN BOOLEAN                 MwaitSupport,\r
   IN UINTN                   ApTargetCState,\r
-  IN UINTN                   PmCodeSegment\r
+  IN UINTN                   PmCodeSegment,\r
+  IN UINTN                   TopOfApStack,\r
+  IN UINTN                   NumberToFinish\r
   );\r
 \r
 /**\r
@@ -298,24 +315,18 @@ SaveCpuMpData (
   IN CPU_MP_DATA   *CpuMpData\r
   );\r
 \r
-/**\r
-  Allocate reset vector buffer.\r
-\r
-  @param[in, out]  CpuMpData  The pointer to CPU MP Data structure.\r
-**/\r
-VOID\r
-AllocateResetVector (\r
-  IN OUT CPU_MP_DATA          *CpuMpData\r
-  );\r
 \r
 /**\r
-  Free AP reset vector buffer.\r
+  Get available system memory below 1MB by specified size.\r
 \r
-  @param[in]  CpuMpData  The pointer to CPU MP Data structure.\r
+  @param[in] WakeupBufferSize   Wakeup buffer size required\r
+\r
+  @retval other   Return wakeup buffer address below 1MB.\r
+  @retval -1      Cannot find free memory below 1MB.\r
 **/\r
-VOID\r
-FreeResetVector (\r
-  IN CPU_MP_DATA              *CpuMpData\r
+UINTN\r
+GetWakeupBuffer (\r
+  IN UINTN                WakeupBufferSize\r
   );\r
 \r
 /**\r
@@ -347,6 +358,80 @@ InitMpGlobalData (
   IN CPU_MP_DATA               *CpuMpData\r
   );\r
 \r
+/**\r
+  Worker function to execute a caller provided function on all enabled APs.\r
+\r
+  @param[in]  Procedure               A pointer to the function to be run on\r
+                                      enabled APs of the system.\r
+  @param[in]  SingleThread            If TRUE, then all the enabled APs execute\r
+                                      the function specified by Procedure one by\r
+                                      one, in ascending order of processor handle\r
+                                      number.  If FALSE, then all the enabled APs\r
+                                      execute the function specified by Procedure\r
+                                      simultaneously.\r
+  @param[in]  WaitEvent               The event created by the caller with CreateEvent()\r
+                                      service.\r
+  @param[in]  TimeoutInMicroseconds   Indicates the time limit in microseconds for\r
+                                      APs to return from Procedure, either for\r
+                                      blocking or non-blocking mode.\r
+  @param[in]  ProcedureArgument       The parameter passed into Procedure for\r
+                                      all APs.\r
+  @param[out] FailedCpuList           If all APs finish successfully, then its\r
+                                      content is set to NULL. If not all APs\r
+                                      finish before timeout expires, then its\r
+                                      content is set to address of the buffer\r
+                                      holding handle numbers of the failed APs.\r
+\r
+  @retval EFI_SUCCESS             In blocking mode, all APs have finished before\r
+                                  the timeout expired.\r
+  @retval EFI_SUCCESS             In non-blocking mode, function has been dispatched\r
+                                  to all enabled APs.\r
+  @retval others                  Failed to Startup all APs.\r
+\r
+**/\r
+EFI_STATUS\r
+StartupAllAPsWorker (\r
+  IN  EFI_AP_PROCEDURE          Procedure,\r
+  IN  BOOLEAN                   SingleThread,\r
+  IN  EFI_EVENT                 WaitEvent               OPTIONAL,\r
+  IN  UINTN                     TimeoutInMicroseconds,\r
+  IN  VOID                      *ProcedureArgument      OPTIONAL,\r
+  OUT UINTN                     **FailedCpuList         OPTIONAL\r
+  );\r
+\r
+/**\r
+  Worker function to let the caller get one enabled AP to execute a caller-provided\r
+  function.\r
+\r
+  @param[in]  Procedure               A pointer to the function to be run on\r
+                                      enabled APs of the system.\r
+  @param[in]  ProcessorNumber         The handle number of the AP.\r
+  @param[in]  WaitEvent               The event created by the caller with CreateEvent()\r
+                                      service.\r
+  @param[in]  TimeoutInMicroseconds   Indicates the time limit in microseconds for\r
+                                      APs to return from Procedure, either for\r
+                                      blocking or non-blocking mode.\r
+  @param[in]  ProcedureArgument       The parameter passed into Procedure for\r
+                                      all APs.\r
+  @param[out] Finished                If AP returns from Procedure before the\r
+                                      timeout expires, its content is set to TRUE.\r
+                                      Otherwise, the value is set to FALSE.\r
+\r
+  @retval EFI_SUCCESS             In blocking mode, specified AP finished before\r
+                                  the timeout expires.\r
+  @retval others                  Failed to Startup AP.\r
+\r
+**/\r
+EFI_STATUS\r
+StartupThisAPWorker (\r
+  IN  EFI_AP_PROCEDURE          Procedure,\r
+  IN  UINTN                     ProcessorNumber,\r
+  IN  EFI_EVENT                 WaitEvent               OPTIONAL,\r
+  IN  UINTN                     TimeoutInMicroseconds,\r
+  IN  VOID                      *ProcedureArgument      OPTIONAL,\r
+  OUT BOOLEAN                   *Finished               OPTIONAL\r
+  );\r
+\r
 /**\r
   Worker function to switch the requested AP to be the BSP from that point onward.\r
 \r
@@ -438,7 +523,7 @@ CheckAndUpdateApsStatus (
 /**\r
   Detect whether specified processor can find matching microcode patch and load it.\r
 \r
-  @param[in] PeiCpuMpData        Pointer to PEI CPU MP Data\r
+  @param[in]  CpuMpData  The pointer to CPU MP Data structure.\r
 **/\r
 VOID\r
 MicrocodeDetect (\r
@@ -446,23 +531,23 @@ MicrocodeDetect (
   );\r
 \r
 /**\r
-  Notify function on End Of PEI PPI.\r
+  Detect whether Mwait-monitor feature is supported.\r
 \r
-  On S3 boot, this function will restore wakeup buffer data.\r
-  On normal boot, this function will flag wakeup buffer to be un-used type.\r
+  @retval TRUE    Mwait-monitor feature is supported.\r
+  @retval FALSE   Mwait-monitor feature is not supported.\r
+**/\r
+BOOLEAN\r
+IsMwaitSupport (\r
+  VOID\r
+  );\r
 \r
-  @param[in]  PeiServices        The pointer to the PEI Services Table.\r
-  @param[in]  NotifyDescriptor   Address of the notification descriptor data structure.\r
-  @param[in]  Ppi                Address of the PPI that was installed.\r
+/**\r
+  Enable Debug Agent to support source debugging on AP function.\r
 \r
-  @retval EFI_SUCCESS        When everything is OK.\r
 **/\r
-EFI_STATUS\r
-EFIAPI\r
-CpuMpEndOfPeiCallback (\r
-  IN EFI_PEI_SERVICES             **PeiServices,\r
-  IN EFI_PEI_NOTIFY_DESCRIPTOR    *NotifyDescriptor,\r
-  IN VOID                         *Ppi\r
+VOID\r
+EnableDebugAgent (\r
+  VOID\r
   );\r
 \r
 #endif\r