]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Library/BaseSynchronizationLib/Ia32/GccInline.c
Minor grammatical work--mostly adding periods. Items with ONLY period added did...
[mirror_edk2.git] / MdePkg / Library / BaseSynchronizationLib / Ia32 / GccInline.c
index eeb16c3d295e4241b2b190c7034c48eb56ad28c4..b5a7827fc0e87e6db19eba8fdc528575f4685b08 100644 (file)
-/** @file
-  GCC inline implementation of BaseSynchronizationLib processor specific functions.
-  
-  Copyright (c) 2006 - 2009, Intel Corporation<BR>
-  Portions copyright (c) 2008-2009 Apple Inc.<BR>
-  All rights reserved. This program and the accompanying materials
-  are licensed and made available under the terms and conditions of the BSD License
-  which accompanies this distribution.  The full text of the license may be found at
-  http://opensource.org/licenses/bsd-license.php
-
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-
-
-/**
-  Performs an atomic increment of an 32-bit unsigned integer.
-
-  Performs an atomic increment of the 32-bit unsigned integer specified by
-  Value and returns the incremented value. The increment operation must be
-  performed using MP safe mechanisms. The state of the return value is not
-  guaranteed to be MP safe.
-
-  @param  Value A pointer to the 32-bit value to increment.
-
-  @return The incremented value.
-
-**/
-UINT32
-EFIAPI
-InternalSyncIncrement (
-  IN      volatile UINT32    *Value
-  )
-{
-  UINT32  Result;
-
-  __asm__ __volatile__ (
-    "lock               \n\t"
-    "incl    %2         \n\t"
-    "movl    %2, %%eax      "
-    : "=a" (Result),          // %0
-      "=m" (*Value)           // %1
-    : "m"  (*Value)           // %2 
-    : "memory",
-      "cc"
-    );
-    
-  return Result;    
-
-}
-
-
-/**
-  Performs an atomic decrement of an 32-bit unsigned integer.
-
-  Performs an atomic decrement of the 32-bit unsigned integer specified by
-  Value and returns the decremented value. The decrement operation must be
-  performed using MP safe mechanisms. The state of the return value is not
-  guaranteed to be MP safe.
-
-  @param  Value A pointer to the 32-bit value to decrement.
-
-  @return The decremented value.
-
-**/
-UINT32
-EFIAPI
-InternalSyncDecrement (
-  IN      volatile UINT32       *Value
-  )
-{
-   UINT32  Result;
-  
-  __asm__ __volatile__ (
-    "lock               \n\t"
-    "decl    %2         \n\t"
-    "movl    %2, %%eax      "
-    : "=a" (Result),          // %0
-      "=m" (*Value)           // %1
-    : "m"  (*Value)           // %2 
-    : "memory",
-      "cc"
-    );
-    
-  return Result;
-}
-
-/**
-  Performs an atomic compare exchange operation on a 32-bit unsigned integer.
-
-  Performs an atomic compare exchange operation on the 32-bit unsigned integer
-  specified by Value.  If Value is equal to CompareValue, then Value is set to
-  ExchangeValue and CompareValue is returned.  If Value is not equal to CompareValue,
-  then Value is returned.  The compare exchange operation must be performed using
-  MP safe mechanisms.
-
-
-  @param  Value         A pointer to the 32-bit value for the compare exchange
-                        operation.
-  @param  CompareValue  32-bit value used in compare operation.
-  @param  ExchangeValue 32-bit value used in exchange operation.
-
-  @return The original *Value before exchange.
-
-**/
-UINT32
-EFIAPI
-InternalSyncCompareExchange32 (
-  IN OUT volatile  UINT32           *Value,
-  IN      UINT32                    CompareValue,
-  IN      UINT32                    ExchangeValue
-  )
-{
-
-// GCC 4.1 and forward supports atomic builtins  
-#if ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 1)))
-
-  return __sync_val_compare_and_swap (Value, CompareValue, ExchangeValue);
-
-#else
-
-  __asm__ __volatile__ (
-    "                     \n\t"
-    "lock                 \n\t"
-    "cmpxchgl    %1, %2   \n\t"
-    : "=a" (CompareValue)     // %0
-    : "q"  (ExchangeValue),   // %1
-      "m"  (*Value),m           // %2
-      "0"  (CompareValue)     // %4 
-    : "memory",
-      "cc"
-    );
-
-    return CompareValue;
-
-#endif
-}
-
-/**
-  Performs an atomic compare exchange operation on a 64-bit unsigned integer.
-
-  Performs an atomic compare exchange operation on the 64-bit unsigned integer specified
-  by Value.  If Value is equal to CompareValue, then Value is set to ExchangeValue and
-  CompareValue is returned.  If Value is not equal to CompareValue, then Value is returned.
-  The compare exchange operation must be performed using MP safe mechanisms.
-
-
-  @param  Value         A pointer to the 64-bit value for the compare exchange
-                        operation.
-  @param  CompareValue  64-bit value used in compare operation.
-  @param  ExchangeValue 64-bit value used in exchange operation.
-
-  @return The original *Value before exchange.
-
-**/
-UINT64
-EFIAPI
-InternalSyncCompareExchange64 (
-  IN OUT  volatile UINT64           *Value,
-  IN      UINT64                    CompareValue,
-  IN      UINT64                    ExchangeValue
-  )
-{
-// GCC 4.1 and forward supports atomic builtins  
-#if ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 1)))
-
-  return __sync_val_compare_and_swap (Value, CompareValue, ExchangeValue);
-
-#else
-
-  __asm__ __volatile__ (
-    "                       \n\t"
-    "push        %%ebx      \n\t" 
-    "movl        %2,%%ebx   \n\t"   
-    "lock                   \n\t"
-    "cmpxchg8b   (%1)       \n\t"
-    "pop         %%ebx      \n\t"
-    : "+A"  (CompareValue)                    // %0
-    : "S"   (Value),                          // %1
-      "r"   ((UINT32) ExchangeValue),         // %2
-      "c"   ((UINT32) (ExchangeValue >> 32))  // %3
-    : "memory",
-      "cc"
-    );
-  
-  return CompareValue;
-
-#endif
-}
-
-
+/** @file\r
+  GCC inline implementation of BaseSynchronizationLib processor specific functions.\r
+  \r
+  Copyright (c) 2006 - 2010, 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
+  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
+\r
+**/\r
+\r
+\r
+\r
+/**\r
+  Performs an atomic increment of an 32-bit unsigned integer.\r
+\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
+\r
+  @param  Value A pointer to the 32-bit value to increment.\r
+\r
+  @return The incremented value.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+InternalSyncIncrement (\r
+  IN      volatile UINT32    *Value\r
+  )\r
+{\r
+  UINT32  Result;\r
+\r
+  __asm__ __volatile__ (\r
+    "lock               \n\t"\r
+    "incl    %2         \n\t"\r
+    "movl    %2, %%eax      "\r
+    : "=a" (Result),          // %0\r
+      "=m" (*Value)           // %1\r
+    : "m"  (*Value)           // %2 \r
+    : "memory",\r
+      "cc"\r
+    );\r
+    \r
+  return Result;    \r
+\r
+}\r
+\r
+\r
+/**\r
+  Performs an atomic decrement of an 32-bit unsigned integer.\r
+\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
+\r
+  @param  Value A pointer to the 32-bit value to decrement.\r
+\r
+  @return The decremented value.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+InternalSyncDecrement (\r
+  IN      volatile UINT32       *Value\r
+  )\r
+{\r
+   UINT32  Result;\r
+  \r
+  __asm__ __volatile__ (\r
+    "lock               \n\t"\r
+    "decl    %2         \n\t"\r
+    "movl    %2, %%eax      "\r
+    : "=a" (Result),          // %0\r
+      "=m" (*Value)           // %1\r
+    : "m"  (*Value)           // %2 \r
+    : "memory",\r
+      "cc"\r
+    );\r
+    \r
+  return Result;\r
+}\r
+\r
+/**\r
+  Performs an atomic compare exchange operation on a 32-bit unsigned integer.\r
+\r
+  Performs an atomic compare exchange operation on the 32-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
+\r
+  @param  Value         A pointer to the 32-bit value for the compare exchange\r
+                        operation.\r
+  @param  CompareValue  32-bit value used in compare operation.\r
+  @param  ExchangeValue 32-bit value used in exchange operation.\r
+\r
+  @return The original *Value before exchange.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+InternalSyncCompareExchange32 (\r
+  IN OUT volatile  UINT32           *Value,\r
+  IN      UINT32                    CompareValue,\r
+  IN      UINT32                    ExchangeValue\r
+  )\r
+{\r
+\r
+  __asm__ __volatile__ (\r
+    "                     \n\t"\r
+    "lock                 \n\t"\r
+    "cmpxchgl    %1, %2   \n\t"\r
+    : "=a" (CompareValue)     // %0\r
+    : "q"  (ExchangeValue),   // %1\r
+      "m"  (*Value),          // %2\r
+      "0"  (CompareValue)     // %4 \r
+    : "memory",\r
+      "cc"\r
+    );\r
+\r
+  return CompareValue;\r
+}\r
+\r
+/**\r
+  Performs an atomic compare exchange operation on a 64-bit unsigned integer.\r
+\r
+  Performs an atomic compare exchange operation on the 64-bit unsigned integer specified\r
+  by Value.  If Value is equal to CompareValue, then Value is set to ExchangeValue and\r
+  CompareValue is returned.  If Value is not equal to CompareValue, then Value is returned.\r
+  The compare exchange operation must be performed using MP safe mechanisms.\r
+\r
+\r
+  @param  Value         A pointer to the 64-bit value for the compare exchange\r
+                        operation.\r
+  @param  CompareValue  64-bit value used in compare operation.\r
+  @param  ExchangeValue 64-bit value used in exchange operation.\r
+\r
+  @return The original *Value before exchange.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+InternalSyncCompareExchange64 (\r
+  IN OUT  volatile UINT64           *Value,\r
+  IN      UINT64                    CompareValue,\r
+  IN      UINT64                    ExchangeValue\r
+  )\r
+{\r
+  __asm__ __volatile__ (\r
+    "                       \n\t"\r
+    "push        %%ebx      \n\t" \r
+    "movl        %2,%%ebx   \n\t"   \r
+    "lock                   \n\t"\r
+    "cmpxchg8b   (%1)       \n\t"\r
+    "pop         %%ebx      \n\t"\r
+    : "+A"  (CompareValue)                    // %0\r
+    : "S"   (Value),                          // %1\r
+      "r"   ((UINT32) ExchangeValue),         // %2\r
+      "c"   ((UINT32) (ExchangeValue >> 32))  // %3\r
+    : "memory",\r
+      "cc"\r
+    );\r
+  \r
+  return CompareValue;\r
+}\r