/** @file\r
Implementation of synchronization functions.\r
\r
- Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>\r
+ Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>\r
Portions copyright (c) 2008 - 2009, Apple Inc. 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
VOID\r
)\r
{\r
- return 32;\r
+ return InternalGetSpinLockProperties ();\r
}\r
\r
/**\r
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
Total += Delta;\r
ASSERT (Total < Timeout);\r
}\r
- } else {\r
- while (!AcquireSpinLockOrFail (SpinLock)) {\r
- CpuPause ();\r
- }\r
}\r
return SpinLock;\r
}\r
UINT32\r
EFIAPI\r
InterlockedIncrement (\r
- IN UINT32 *Value\r
+ IN volatile UINT32 *Value\r
)\r
{\r
ASSERT (Value != NULL);\r
UINT32\r
EFIAPI\r
InterlockedDecrement (\r
- IN UINT32 *Value\r
+ IN volatile UINT32 *Value\r
)\r
{\r
ASSERT (Value != NULL);\r
return InternalSyncDecrement (Value);\r
}\r
\r
+/**\r
+ Performs an atomic compare exchange operation on a 16-bit unsigned integer.\r
+\r
+ Performs an atomic compare exchange operation on the 16-bit unsigned integer\r
+ specified by Value. If Value is equal to CompareValue, then Value is set to\r
+ ExchangeValue and CompareValue is returned. If Value is not equal to CompareValue,\r
+ then Value is returned. The compare exchange operation must be performed using\r
+ MP safe mechanisms.\r
+\r
+ If Value is NULL, then ASSERT().\r
+\r
+ @param Value A pointer to the 16-bit value for the compare exchange\r
+ operation.\r
+ @param CompareValue A 16-bit value used in compare operation.\r
+ @param ExchangeValue A 16-bit value used in exchange operation.\r
+\r
+ @return The original *Value before exchange.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+InterlockedCompareExchange16 (\r
+ IN OUT volatile UINT16 *Value,\r
+ IN UINT16 CompareValue,\r
+ IN UINT16 ExchangeValue\r
+ )\r
+{\r
+ ASSERT (Value != NULL);\r
+ return InternalSyncCompareExchange16 (Value, CompareValue, ExchangeValue);\r
+}\r
+\r
/**\r
Performs an atomic compare exchange operation on a 32-bit unsigned integer.\r
\r
UINT32\r
EFIAPI\r
InterlockedCompareExchange32 (\r
- IN OUT UINT32 *Value,\r
+ IN OUT volatile UINT32 *Value,\r
IN UINT32 CompareValue,\r
IN UINT32 ExchangeValue\r
)\r
UINT64\r
EFIAPI\r
InterlockedCompareExchange64 (\r
- IN OUT UINT64 *Value,\r
+ IN OUT volatile UINT64 *Value,\r
IN UINT64 CompareValue,\r
IN UINT64 ExchangeValue\r
)\r
VOID *\r
EFIAPI\r
InterlockedCompareExchangePointer (\r
- IN OUT VOID **Value,\r
+ IN OUT VOID * volatile *Value,\r
IN VOID *CompareValue,\r
IN VOID *ExchangeValue\r
)\r
switch (SizeOfValue) {\r
case sizeof (UINT32):\r
return (VOID*)(UINTN)InterlockedCompareExchange32 (\r
- (UINT32*)Value,\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
+ (volatile UINT64 *)Value,\r
(UINT64)(UINTN)CompareValue,\r
(UINT64)(UINTN)ExchangeValue\r
);\r