]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Library/BaseSynchronizationLib/Synchronization.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / MdePkg / Library / BaseSynchronizationLib / Synchronization.c
index 4218a265a0ec37d0668647bc5f12c5bcbbf27dda..54eb19d89584fe3789a0182ff6fc025620f0c35e 100644 (file)
@@ -1,28 +1,22 @@
 /** @file\r
   Implementation of synchronization functions.\r
 \r
-  Copyright (c) 2006 - 2012, 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
-  http://opensource.org/licenses/bsd-license.php.\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
 #include "BaseSynchronizationLibInternals.h"\r
 \r
-#define SPIN_LOCK_RELEASED          ((UINTN) 1)\r
-#define SPIN_LOCK_ACQUIRED          ((UINTN) 2)\r
+#define SPIN_LOCK_RELEASED  ((UINTN) 1)\r
+#define SPIN_LOCK_ACQUIRED  ((UINTN) 2)\r
 \r
 /**\r
   Retrieves the architecture specific spin lock alignment requirements for\r
   optimal spin lock performance.\r
 \r
   This function retrieves the spin lock alignment requirements for optimal\r
-  performance on a given CPU architecture. The spin lock alignment is byte alignment. \r
+  performance on a given CPU architecture. The spin lock alignment is byte alignment.\r
   It must be a power of two and is returned by this function. If there are no alignment\r
   requirements, then 1 must be returned. The spin lock synchronization\r
   functions must function correctly if the spin lock size and alignment values\r
@@ -61,7 +55,7 @@ GetSpinLockProperties (
 SPIN_LOCK *\r
 EFIAPI\r
 InitializeSpinLock (\r
-  OUT      SPIN_LOCK                 *SpinLock\r
+  OUT      SPIN_LOCK  *SpinLock\r
   )\r
 {\r
   ASSERT (SpinLock != NULL);\r
@@ -92,7 +86,7 @@ InitializeSpinLock (
 SPIN_LOCK *\r
 EFIAPI\r
 AcquireSpinLock (\r
-  IN OUT  SPIN_LOCK                 *SpinLock\r
+  IN OUT  SPIN_LOCK  *SpinLock\r
   )\r
 {\r
   UINT64  Current;\r
@@ -104,11 +98,15 @@ AcquireSpinLock (
   INT64   Cycle;\r
   INT64   Delta;\r
 \r
-  if (PcdGet32 (PcdSpinLockTimeout) > 0) {\r
+  if (PcdGet32 (PcdSpinLockTimeout) == 0) {\r
+    while (!AcquireSpinLockOrFail (SpinLock)) {\r
+      CpuPause ();\r
+    }\r
+  } else if (!AcquireSpinLockOrFail (SpinLock)) {\r
     //\r
     // Get the current timer value\r
     //\r
-    Current = GetPerformanceCounter();\r
+    Current = GetPerformanceCounter ();\r
 \r
     //\r
     // Initialize local variables\r
@@ -132,27 +130,27 @@ AcquireSpinLock (
     if (Cycle < 0) {\r
       Cycle = -Cycle;\r
     }\r
+\r
     Cycle++;\r
 \r
     while (!AcquireSpinLockOrFail (SpinLock)) {\r
       CpuPause ();\r
       Previous = Current;\r
-      Current  = GetPerformanceCounter();\r
-      Delta = (INT64) (Current - Previous);\r
+      Current  = GetPerformanceCounter ();\r
+      Delta    = (INT64)(Current - Previous);\r
       if (Start > End) {\r
         Delta = -Delta;\r
       }\r
+\r
       if (Delta < 0) {\r
         Delta += Cycle;\r
       }\r
+\r
       Total += Delta;\r
       ASSERT (Total < Timeout);\r
     }\r
-  } else {\r
-    while (!AcquireSpinLockOrFail (SpinLock)) {\r
-      CpuPause ();\r
-    }\r
   }\r
+\r
   return SpinLock;\r
 }\r
 \r
@@ -176,10 +174,10 @@ AcquireSpinLock (
 BOOLEAN\r
 EFIAPI\r
 AcquireSpinLockOrFail (\r
-  IN OUT  SPIN_LOCK                 *SpinLock\r
+  IN OUT  SPIN_LOCK  *SpinLock\r
   )\r
 {\r
-  SPIN_LOCK    LockValue;\r
+  SPIN_LOCK  LockValue;\r
 \r
   ASSERT (SpinLock != NULL);\r
 \r
@@ -187,12 +185,12 @@ AcquireSpinLockOrFail (
   ASSERT (SPIN_LOCK_ACQUIRED == LockValue || SPIN_LOCK_RELEASED == LockValue);\r
 \r
   return (BOOLEAN)(\r
-           InterlockedCompareExchangePointer (\r
-             (VOID**)SpinLock,\r
-             (VOID*)SPIN_LOCK_RELEASED,\r
-             (VOID*)SPIN_LOCK_ACQUIRED\r
-             ) == (VOID*)SPIN_LOCK_RELEASED\r
-           );\r
+                   InterlockedCompareExchangePointer (\r
+                     (VOID **)SpinLock,\r
+                     (VOID *)SPIN_LOCK_RELEASED,\r
+                     (VOID *)SPIN_LOCK_ACQUIRED\r
+                     ) == (VOID *)SPIN_LOCK_RELEASED\r
+                   );\r
 }\r
 \r
 /**\r
@@ -212,10 +210,10 @@ AcquireSpinLockOrFail (
 SPIN_LOCK *\r
 EFIAPI\r
 ReleaseSpinLock (\r
-  IN OUT  SPIN_LOCK                 *SpinLock\r
+  IN OUT  SPIN_LOCK  *SpinLock\r
   )\r
 {\r
-  SPIN_LOCK    LockValue;\r
+  SPIN_LOCK  LockValue;\r
 \r
   ASSERT (SpinLock != NULL);\r
 \r
@@ -231,8 +229,7 @@ ReleaseSpinLock (
 \r
   Performs an atomic increment of the 32-bit unsigned integer specified by\r
   Value and returns the incremented value. The increment operation must be\r
-  performed using MP safe mechanisms. The state of the return value is not\r
-  guaranteed to be MP safe.\r
+  performed using MP safe mechanisms.\r
 \r
   If Value is NULL, then ASSERT().\r
 \r
@@ -244,7 +241,7 @@ ReleaseSpinLock (
 UINT32\r
 EFIAPI\r
 InterlockedIncrement (\r
-  IN      UINT32                    *Value\r
+  IN      volatile UINT32  *Value\r
   )\r
 {\r
   ASSERT (Value != NULL);\r
@@ -256,8 +253,7 @@ InterlockedIncrement (
 \r
   Performs an atomic decrement of the 32-bit unsigned integer specified by\r
   Value and returns the decremented value. The decrement operation must be\r
-  performed using MP safe mechanisms. The state of the return value is not\r
-  guaranteed to be MP safe.\r
+  performed using MP safe mechanisms.\r
 \r
   If Value is NULL, then ASSERT().\r
 \r
@@ -269,7 +265,7 @@ InterlockedIncrement (
 UINT32\r
 EFIAPI\r
 InterlockedDecrement (\r
-  IN      UINT32                    *Value\r
+  IN      volatile UINT32  *Value\r
   )\r
 {\r
   ASSERT (Value != NULL);\r
@@ -298,9 +294,9 @@ InterlockedDecrement (
 UINT16\r
 EFIAPI\r
 InterlockedCompareExchange16 (\r
-  IN OUT  UINT16                    *Value,\r
-  IN      UINT16                    CompareValue,\r
-  IN      UINT16                    ExchangeValue\r
+  IN OUT  volatile UINT16  *Value,\r
+  IN      UINT16           CompareValue,\r
+  IN      UINT16           ExchangeValue\r
   )\r
 {\r
   ASSERT (Value != NULL);\r
@@ -329,9 +325,9 @@ InterlockedCompareExchange16 (
 UINT32\r
 EFIAPI\r
 InterlockedCompareExchange32 (\r
-  IN OUT  UINT32                    *Value,\r
-  IN      UINT32                    CompareValue,\r
-  IN      UINT32                    ExchangeValue\r
+  IN OUT  volatile UINT32  *Value,\r
+  IN      UINT32           CompareValue,\r
+  IN      UINT32           ExchangeValue\r
   )\r
 {\r
   ASSERT (Value != NULL);\r
@@ -359,9 +355,9 @@ InterlockedCompareExchange32 (
 UINT64\r
 EFIAPI\r
 InterlockedCompareExchange64 (\r
-  IN OUT  UINT64                    *Value,\r
-  IN      UINT64                    CompareValue,\r
-  IN      UINT64                    ExchangeValue\r
+  IN OUT  volatile UINT64  *Value,\r
+  IN      UINT64           CompareValue,\r
+  IN      UINT64           ExchangeValue\r
   )\r
 {\r
   ASSERT (Value != NULL);\r
@@ -389,9 +385,9 @@ InterlockedCompareExchange64 (
 VOID *\r
 EFIAPI\r
 InterlockedCompareExchangePointer (\r
-  IN OUT  VOID                      **Value,\r
-  IN      VOID                      *CompareValue,\r
-  IN      VOID                      *ExchangeValue\r
+  IN OUT  VOID                      *volatile  *Value,\r
+  IN      VOID                                 *CompareValue,\r
+  IN      VOID                                 *ExchangeValue\r
   )\r
 {\r
   UINT8  SizeOfValue;\r
@@ -400,17 +396,17 @@ InterlockedCompareExchangePointer (
 \r
   switch (SizeOfValue) {\r
     case sizeof (UINT32):\r
-      return (VOID*)(UINTN)InterlockedCompareExchange32 (\r
-                             (UINT32*)Value,\r
-                             (UINT32)(UINTN)CompareValue,\r
-                             (UINT32)(UINTN)ExchangeValue\r
-                             );\r
+      return (VOID *)(UINTN)InterlockedCompareExchange32 (\r
+                              (volatile UINT32 *)Value,\r
+                              (UINT32)(UINTN)CompareValue,\r
+                              (UINT32)(UINTN)ExchangeValue\r
+                              );\r
     case sizeof (UINT64):\r
-      return (VOID*)(UINTN)InterlockedCompareExchange64 (\r
-                             (UINT64*)Value,\r
-                             (UINT64)(UINTN)CompareValue,\r
-                             (UINT64)(UINTN)ExchangeValue\r
-                             );\r
+      return (VOID *)(UINTN)InterlockedCompareExchange64 (\r
+                              (volatile UINT64 *)Value,\r
+                              (UINT64)(UINTN)CompareValue,\r
+                              (UINT64)(UINTN)ExchangeValue\r
+                              );\r
     default:\r
       ASSERT (FALSE);\r
       return NULL;\r