public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Gao, Liming" <liming.gao@intel.com>
To: "Ni, Ruiyu" <ruiyu.ni@intel.com>,
	"edk2-devel@lists.01.org" <edk2-devel@lists.01.org>
Cc: "Yao, Jiewen" <jiewen.yao@intel.com>,
	"Kinney, Michael D" <michael.d.kinney@intel.com>
Subject: Re: [PATCH v3] MdePkg/SynchronizationLib: fix Interlocked[De|In]crement return value
Date: Fri, 21 Sep 2018 07:45:11 +0000	[thread overview]
Message-ID: <4A89E2EF3DFEDB4C8BFDE51014F606A14E308865@SHSMSX104.ccr.corp.intel.com> (raw)
In-Reply-To: <20180913095046.9480-1-ruiyu.ni@intel.com>

The patch is good. Could you submit BZ to track this change?

Thanks
Liming
>-----Original Message-----
>From: Ni, Ruiyu
>Sent: Thursday, September 13, 2018 5:51 PM
>To: edk2-devel@lists.01.org
>Cc: Yao, Jiewen <jiewen.yao@intel.com>; Gao, Liming
><liming.gao@intel.com>; Kinney, Michael D <michael.d.kinney@intel.com>
>Subject: [PATCH v3] MdePkg/SynchronizationLib: fix
>Interlocked[De|In]crement return value
>
>Today's InterlockedIncrement()/InterlockedDecrement() guarantees to
>perform atomic increment/decrement but doesn't guarantee the return
>value equals to the new value.
>
>The patch fixes the behavior to use "XADD" instruction to guarantee
>the return value equals to the new value.
>
>The patch calls intrinsic functions for MSVC tool chain, calls the
>NASM implementation for INTEL tool chain and calls GCC inline
>assembly implementation (GccInline.c) for GCC tool chain.
>
>Contributed-under: TianoCore Contribution Agreement 1.1
>Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com>
>Cc: Jiewen Yao <jiewen.yao@intel.com>
>Cc: Liming Gao <liming.gao@intel.com>
>Cc: Michael D Kinney <michael.d.kinney@intel.com>
>---
> MdePkg/Include/Library/SynchronizationLib.h        |  6 +--
> .../BaseSynchronizationLib.inf                     | 18 ++++-----
> .../BaseSynchronizationLibInternals.h              |  6 +--
> .../BaseSynchronizationLib/Ia32/GccInline.c        | 18 ++++-----
> .../Ia32/InterlockedDecrement.c                    | 42 ---------------------
> .../Ia32/InterlockedDecrement.nasm                 | 10 ++---
> .../Ia32/InterlockedIncrement.c                    | 43 ----------------------
> .../Ia32/InterlockedIncrement.nasm                 |  7 ++--
> ...lockedDecrement.c => InterlockedDecrementMsc.c} |  4 +-
> ...lockedIncrement.c => InterlockedIncrementMsc.c} |  4 +-
> .../BaseSynchronizationLib/Synchronization.c       |  6 +--
> .../BaseSynchronizationLib/SynchronizationGcc.c    |  6 +--
> .../BaseSynchronizationLib/SynchronizationMsc.c    |  6 +--
> .../Library/BaseSynchronizationLib/X64/GccInline.c | 19 +++++-----
> .../X64/InterlockedDecrement.nasm                  |  8 ++--
> .../X64/InterlockedIncrement.nasm                  |  5 ++-
> 16 files changed, 56 insertions(+), 152 deletions(-)
> delete mode 100644
>MdePkg/Library/BaseSynchronizationLib/Ia32/InterlockedDecrement.c
> delete mode 100644
>MdePkg/Library/BaseSynchronizationLib/Ia32/InterlockedIncrement.c
> rename
>MdePkg/Library/BaseSynchronizationLib/{X64/InterlockedDecrement.c =>
>InterlockedDecrementMsc.c} (87%)
> rename
>MdePkg/Library/BaseSynchronizationLib/{X64/InterlockedIncrement.c =>
>InterlockedIncrementMsc.c} (87%)
>
>diff --git a/MdePkg/Include/Library/SynchronizationLib.h
>b/MdePkg/Include/Library/SynchronizationLib.h
>index da69f6ff5e..ce3bce04f5 100644
>--- a/MdePkg/Include/Library/SynchronizationLib.h
>+++ b/MdePkg/Include/Library/SynchronizationLib.h
>@@ -144,8 +144,7 @@ ReleaseSpinLock (
>
>   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.
>+  performed using MP safe mechanisms.
>
>   If Value is NULL, then ASSERT().
>
>@@ -166,8 +165,7 @@ InterlockedIncrement (
>
>   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.
>+  performed using MP safe mechanisms.
>
>   If Value is NULL, then ASSERT().
>
>diff --git
>a/MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.inf
>b/MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.inf
>index 0be1d4331f..427e959f2e 100755
>--- a/MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.inf
>+++ b/MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.inf
>@@ -34,9 +34,9 @@ [Sources.IA32]
>   Ia32/InterlockedCompareExchange64.c | MSFT
>   Ia32/InterlockedCompareExchange32.c | MSFT
>   Ia32/InterlockedCompareExchange16.c | MSFT
>-  Ia32/InterlockedDecrement.c | MSFT
>-  Ia32/InterlockedIncrement.c | MSFT
>-  SynchronizationMsc.c  | MSFT
>+  InterlockedIncrementMsc.c | MSFT
>+  InterlockedDecrementMsc.c | MSFT
>+  SynchronizationMsc.c | MSFT
>
>   Ia32/InterlockedCompareExchange64.nasm| INTEL
>   Ia32/InterlockedCompareExchange32.nasm| INTEL
>@@ -54,17 +54,15 @@ [Sources.X64]
>   X64/InterlockedCompareExchange64.c | MSFT
>   X64/InterlockedCompareExchange32.c | MSFT
>   X64/InterlockedCompareExchange16.c | MSFT
>+  InterlockedIncrementMsc.c | MSFT
>+  InterlockedDecrementMsc.c | MSFT
>+  SynchronizationMsc.c | MSFT
>
>   X64/InterlockedCompareExchange64.nasm| INTEL
>   X64/InterlockedCompareExchange32.nasm| INTEL
>   X64/InterlockedCompareExchange16.nasm| INTEL
>-
>-  X64/InterlockedDecrement.c | MSFT
>-  X64/InterlockedIncrement.c | MSFT
>-  SynchronizationMsc.c | MSFT
>-
>-  X64/InterlockedDecrement.nasm| INTEL
>-  X64/InterlockedIncrement.nasm| INTEL
>+  X64/InterlockedDecrement.nasm | INTEL
>+  X64/InterlockedIncrement.nasm | INTEL
>   Synchronization.c | INTEL
>
>   Ia32/InternalGetSpinLockProperties.c | GCC
>diff --git
>a/MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLibInternals.h
>b/MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLibInternals.h
>index 37edd7c188..8c363a8585 100644
>---
>a/MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLibInternals.h
>+++
>b/MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLibInternals.h
>@@ -27,8 +27,7 @@
>
>   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.
>+  performed using MP safe mechanisms.
>
>   @param  Value A pointer to the 32-bit value to increment.
>
>@@ -47,8 +46,7 @@ InternalSyncIncrement (
>
>   Performs an atomic decrement of the 32-bit unsigned integer specified by
>   Value and returns the decrement value. The decrement operation must be
>-  performed using MP safe mechanisms. The state of the return value is not
>-  guaranteed to be MP safe.
>+  performed using MP safe mechanisms.
>
>   @param  Value A pointer to the 32-bit value to decrement.
>
>diff --git a/MdePkg/Library/BaseSynchronizationLib/Ia32/GccInline.c
>b/MdePkg/Library/BaseSynchronizationLib/Ia32/GccInline.c
>index 4ab293f243..d82e0205f5 100644
>--- a/MdePkg/Library/BaseSynchronizationLib/Ia32/GccInline.c
>+++ b/MdePkg/Library/BaseSynchronizationLib/Ia32/GccInline.c
>@@ -20,8 +20,7 @@
>
>   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.
>+  performed using MP safe mechanisms.
>
>   @param  Value A pointer to the 32-bit value to increment.
>
>@@ -37,9 +36,10 @@ InternalSyncIncrement (
>   UINT32  Result;
>
>   __asm__ __volatile__ (
>+    "movl    $1, %%eax  \n\t"
>     "lock               \n\t"
>-    "incl    %2         \n\t"
>-    "movl    %2, %%eax      "
>+    "xadd    %%eax, %2  \n\t"
>+    "inc     %%eax          "
>     : "=a" (Result),          // %0
>       "=m" (*Value)           // %1
>     : "m"  (*Value)           // %2
>@@ -57,8 +57,7 @@ InternalSyncIncrement (
>
>   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.
>+  performed using MP safe mechanisms.
>
>   @param  Value A pointer to the 32-bit value to decrement.
>
>@@ -74,9 +73,10 @@ InternalSyncDecrement (
>    UINT32  Result;
>
>   __asm__ __volatile__ (
>-    "lock               \n\t"
>-    "decl    %2         \n\t"
>-    "movl    %2, %%eax      "
>+    "movl    $-1, %%eax  \n\t"
>+    "lock                \n\t"
>+    "xadd    %%eax, %2   \n\t"
>+    "dec     %%eax                  "
>     : "=a" (Result),          // %0
>       "=m" (*Value)           // %1
>     : "m"  (*Value)           // %2
>diff --git
>a/MdePkg/Library/BaseSynchronizationLib/Ia32/InterlockedDecrement.c
>b/MdePkg/Library/BaseSynchronizationLib/Ia32/InterlockedDecrement.c
>deleted file mode 100644
>index 354a0e7ab1..0000000000
>--- a/MdePkg/Library/BaseSynchronizationLib/Ia32/InterlockedDecrement.c
>+++ /dev/null
>@@ -1,42 +0,0 @@
>-/** @file
>-  InterlockedDecrement function
>-
>-  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
>-  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 decrement of an 32-bit unsigned integer.
>-
>-  Performs an atomic decrement of the 32-bit unsigned integer specified by
>-  Value and returns the decrement 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 decrement value.
>-
>-**/
>-UINT32
>-EFIAPI
>-InternalSyncDecrement (
>-  IN      volatile UINT32           *Value
>-  )
>-{
>-  _asm {
>-    mov     eax, Value
>-    lock    dec     dword ptr [eax]
>-    mov     eax, [eax]
>-  }
>-}
>diff --git
>a/MdePkg/Library/BaseSynchronizationLib/Ia32/InterlockedDecrement.nasm
>b/MdePkg/Library/BaseSynchronizationLib/Ia32/InterlockedDecrement.nasm
>index 4c46041186..dd5a8de3ed 100644
>---
>a/MdePkg/Library/BaseSynchronizationLib/Ia32/InterlockedDecrement.nasm
>+++
>b/MdePkg/Library/BaseSynchronizationLib/Ia32/InterlockedDecrement.nasm
>@@ -1,6 +1,6 @@
> ;------------------------------------------------------------------------------
> ;
>-; Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
>+; Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
> ; 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
>@@ -32,8 +32,8 @@
> ;------------------------------------------------------------------------------
> global ASM_PFX(InternalSyncDecrement)
> ASM_PFX(InternalSyncDecrement):
>-    mov     eax, [esp + 4]
>-    lock    dec     dword [eax]
>-    mov     eax, [eax]
>+    mov       ecx, [esp + 4]
>+    mov       eax, 0FFFFFFFFh
>+    lock xadd dword [ecx], eax
>+    dec       eax
>     ret
>-
>diff --git
>a/MdePkg/Library/BaseSynchronizationLib/Ia32/InterlockedIncrement.c
>b/MdePkg/Library/BaseSynchronizationLib/Ia32/InterlockedIncrement.c
>deleted file mode 100644
>index c61a550119..0000000000
>--- a/MdePkg/Library/BaseSynchronizationLib/Ia32/InterlockedIncrement.c
>+++ /dev/null
>@@ -1,43 +0,0 @@
>-/** @file
>-  InterLockedIncrement function
>-
>-  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
>-  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
>-  )
>-{
>-  _asm {
>-    mov     eax, Value
>-    lock    inc     dword ptr [eax]
>-    mov     eax, [eax]
>-  }
>-}
>-
>diff --git
>a/MdePkg/Library/BaseSynchronizationLib/Ia32/InterlockedIncrement.nasm
>b/MdePkg/Library/BaseSynchronizationLib/Ia32/InterlockedIncrement.nasm
>index 3902c73275..0677e4bf78 100644
>---
>a/MdePkg/Library/BaseSynchronizationLib/Ia32/InterlockedIncrement.nasm
>+++
>b/MdePkg/Library/BaseSynchronizationLib/Ia32/InterlockedIncrement.nasm
>@@ -32,8 +32,9 @@
> ;------------------------------------------------------------------------------
> global ASM_PFX(InternalSyncIncrement)
> ASM_PFX(InternalSyncIncrement):
>-    mov     eax, [esp + 4]
>-    lock    inc     dword [eax]
>-    mov     eax, [eax]
>+    mov       ecx, [esp + 4]
>+    mov       eax, 1
>+    lock xadd dword [ecx], eax
>+    inc       eax
>     ret
>
>diff --git
>a/MdePkg/Library/BaseSynchronizationLib/X64/InterlockedDecrement.c
>b/MdePkg/Library/BaseSynchronizationLib/InterlockedDecrementMsc.c
>similarity index 87%
>rename from
>MdePkg/Library/BaseSynchronizationLib/X64/InterlockedDecrement.c
>rename to
>MdePkg/Library/BaseSynchronizationLib/InterlockedDecrementMsc.c
>index da402cd4c6..6dc9502ea6 100644
>--- a/MdePkg/Library/BaseSynchronizationLib/X64/InterlockedDecrement.c
>+++ b/MdePkg/Library/BaseSynchronizationLib/InterlockedDecrementMsc.c
>@@ -1,7 +1,7 @@
> /** @file
>   InterlockedDecrement function
>
>-  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
>+  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
>   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
>@@ -41,6 +41,6 @@ InternalSyncDecrement (
>   IN      volatile UINT32           *Value
>   )
> {
>-  return _InterlockedDecrement ((long *)(UINTN)(Value));
>+  return _InterlockedDecrement ((long *)(Value));
> }
>
>diff --git
>a/MdePkg/Library/BaseSynchronizationLib/X64/InterlockedIncrement.c
>b/MdePkg/Library/BaseSynchronizationLib/InterlockedIncrementMsc.c
>similarity index 87%
>rename from
>MdePkg/Library/BaseSynchronizationLib/X64/InterlockedIncrement.c
>rename to
>MdePkg/Library/BaseSynchronizationLib/InterlockedIncrementMsc.c
>index bbd1384602..8327d81a87 100644
>--- a/MdePkg/Library/BaseSynchronizationLib/X64/InterlockedIncrement.c
>+++ b/MdePkg/Library/BaseSynchronizationLib/InterlockedIncrementMsc.c
>@@ -1,7 +1,7 @@
> /** @file
>   InterLockedIncrement function
>
>-  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
>+  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
>   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
>@@ -41,6 +41,6 @@ InternalSyncIncrement (
>   IN      volatile UINT32           *Value
>   )
> {
>-  return _InterlockedIncrement ((long *)(UINTN)(Value));
>+  return _InterlockedIncrement ((long *)(Value));
> }
>
>diff --git a/MdePkg/Library/BaseSynchronizationLib/Synchronization.c
>b/MdePkg/Library/BaseSynchronizationLib/Synchronization.c
>index 76c5a1275c..0ab59ca702 100644
>--- a/MdePkg/Library/BaseSynchronizationLib/Synchronization.c
>+++ b/MdePkg/Library/BaseSynchronizationLib/Synchronization.c
>@@ -231,8 +231,7 @@ ReleaseSpinLock (
>
>   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.
>+  performed using MP safe mechanisms.
>
>   If Value is NULL, then ASSERT().
>
>@@ -256,8 +255,7 @@ InterlockedIncrement (
>
>   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.
>+  performed using MP safe mechanisms.
>
>   If Value is NULL, then ASSERT().
>
>diff --git a/MdePkg/Library/BaseSynchronizationLib/SynchronizationGcc.c
>b/MdePkg/Library/BaseSynchronizationLib/SynchronizationGcc.c
>index 5ac548b19f..177739d3da 100644
>--- a/MdePkg/Library/BaseSynchronizationLib/SynchronizationGcc.c
>+++ b/MdePkg/Library/BaseSynchronizationLib/SynchronizationGcc.c
>@@ -247,8 +247,7 @@ ReleaseSpinLock (
>
>   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.
>+  performed using MP safe mechanisms.
>
>   If Value is NULL, then ASSERT().
>
>@@ -272,8 +271,7 @@ InterlockedIncrement (
>
>   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.
>+  performed using MP safe mechanisms.
>
>   If Value is NULL, then ASSERT().
>
>diff --git a/MdePkg/Library/BaseSynchronizationLib/SynchronizationMsc.c
>b/MdePkg/Library/BaseSynchronizationLib/SynchronizationMsc.c
>index e3298c8ab4..6ab2d71870 100644
>--- a/MdePkg/Library/BaseSynchronizationLib/SynchronizationMsc.c
>+++ b/MdePkg/Library/BaseSynchronizationLib/SynchronizationMsc.c
>@@ -249,8 +249,7 @@ ReleaseSpinLock (
>
>   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.
>+  performed using MP safe mechanisms.
>
>   If Value is NULL, then ASSERT().
>
>@@ -274,8 +273,7 @@ InterlockedIncrement (
>
>   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.
>+  performed using MP safe mechanisms.
>
>   If Value is NULL, then ASSERT().
>
>diff --git a/MdePkg/Library/BaseSynchronizationLib/X64/GccInline.c
>b/MdePkg/Library/BaseSynchronizationLib/X64/GccInline.c
>index 5224dd063f..4c4d6e3fc7 100644
>--- a/MdePkg/Library/BaseSynchronizationLib/X64/GccInline.c
>+++ b/MdePkg/Library/BaseSynchronizationLib/X64/GccInline.c
>@@ -15,14 +15,12 @@
>
>
>
>-
> /**
>   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.
>+  performed using MP safe mechanisms.
>
>   @param  Value A pointer to the 32-bit value to increment.
>
>@@ -38,9 +36,10 @@ InternalSyncIncrement (
>   UINT32  Result;
>
>   __asm__ __volatile__ (
>+    "movl    $1, %%eax  \n\t"
>     "lock               \n\t"
>-    "incl    %2         \n\t"
>-    "mov     %2, %%eax      "
>+    "xadd    %%eax, %2  \n\t"
>+    "inc     %%eax          "
>     : "=a" (Result),          // %0
>       "=m" (*Value)           // %1
>     : "m"  (*Value)           // %2
>@@ -57,8 +56,7 @@ InternalSyncIncrement (
>
>   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.
>+  performed using MP safe mechanisms.
>
>   @param  Value A pointer to the 32-bit value to decrement.
>
>@@ -74,9 +72,10 @@ InternalSyncDecrement (
>    UINT32  Result;
>
>   __asm__ __volatile__ (
>-    "lock               \n\t"
>-    "decl    %2         \n\t"
>-    "mov     %2, %%eax      "
>+    "movl    $-1, %%eax  \n\t"
>+    "lock                \n\t"
>+    "xadd    %%eax, %2   \n\t"
>+    "dec     %%eax                  "
>     : "=a" (Result),          // %0
>       "=m" (*Value)           // %1
>     : "m"  (*Value)           // %2
>diff --git
>a/MdePkg/Library/BaseSynchronizationLib/X64/InterlockedDecrement.nasm
>b/MdePkg/Library/BaseSynchronizationLib/X64/InterlockedDecrement.nasm
>index 60f43111fe..dabdca945e 100644
>---
>a/MdePkg/Library/BaseSynchronizationLib/X64/InterlockedDecrement.nasm
>+++
>b/MdePkg/Library/BaseSynchronizationLib/X64/InterlockedDecrement.nasm
>@@ -1,6 +1,6 @@
> ;------------------------------------------------------------------------------
> ;
>-; Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
>+; Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
> ; 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
>@@ -33,7 +33,7 @@
> ;------------------------------------------------------------------------------
> global ASM_PFX(InternalSyncDecrement)
> ASM_PFX(InternalSyncDecrement):
>-    lock    dec     dword [rcx]
>-    mov     eax, [rcx]
>+    mov       eax, 0FFFFFFFFh
>+    lock xadd dword [rcx], eax
>+    dec       eax
>     ret
>-
>diff --git
>a/MdePkg/Library/BaseSynchronizationLib/X64/InterlockedIncrement.nasm
>b/MdePkg/Library/BaseSynchronizationLib/X64/InterlockedIncrement.nasm
>index 7f877b5774..77379d998e 100644
>---
>a/MdePkg/Library/BaseSynchronizationLib/X64/InterlockedIncrement.nasm
>+++
>b/MdePkg/Library/BaseSynchronizationLib/X64/InterlockedIncrement.nasm
>@@ -33,7 +33,8 @@
> ;------------------------------------------------------------------------------
> global ASM_PFX(InternalSyncIncrement)
> ASM_PFX(InternalSyncIncrement):
>-    lock    inc     dword [rcx]
>-    mov     eax, [rcx]
>+    mov       eax, 1
>+    lock xadd dword [rcx], eax
>+    inc       eax
>     ret
>
>--
>2.16.1.windows.1



  reply	other threads:[~2018-09-21  7:45 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-09-13  9:50 [PATCH v3] MdePkg/SynchronizationLib: fix Interlocked[De|In]crement return value Ruiyu Ni
2018-09-21  7:45 ` Gao, Liming [this message]
2018-09-25 14:08 ` Laszlo Ersek
2018-09-25 14:22 ` Laszlo Ersek
2018-09-25 16:18   ` Laszlo Ersek
2018-09-25 18:29     ` Laszlo Ersek
2018-09-25 19:25       ` Laszlo Ersek
2018-09-26 17:39         ` Kinney, Michael D

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4A89E2EF3DFEDB4C8BFDE51014F606A14E308865@SHSMSX104.ccr.corp.intel.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox