You are right. My mistake.
> -----Original Message----- > From: Ni, Ruiyu > Sent: Monday, September 10, 2018 10:59 PM > To: Yao, Jiewen <jiewen....@intel.com> > Cc: edk2-devel@lists.01.org; Gao, Liming <liming....@intel.com>; Kinney, > Michael D <michael.d.kin...@intel.com> > Subject: Re: [PATCH] MdePkg/SynchronizationLib: fix > Interlocked[De|In]crement return value > > I didn’t find such instruction in SDM. > > 发自我的 iPhone > > > 在 2018年9月10日,下午7:37,Yao, Jiewen <jiewen....@intel.com> > 写道: > > > > Hi > > Can we use XSUB for decrement? > > > > Thank you > > Yao Jiewen > > > >> -----Original Message----- > >> From: Ni, Ruiyu > >> Sent: Monday, September 10, 2018 6:06 PM > >> To: edk2-devel@lists.01.org > >> Cc: Yao, Jiewen <jiewen....@intel.com>; Gao, Liming > >> <liming....@intel.com>; Kinney, Michael D > <michael.d.kin...@intel.com> > >> Subject: [PATCH] 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. > >> > >> Contributed-under: TianoCore Contribution Agreement 1.1 > >> Signed-off-by: Ruiyu Ni <ruiyu...@intel.com> > >> Cc: Jiewen Yao <jiewen....@intel.com> > >> Cc: Liming Gao <liming....@intel.com> > >> Cc: Michael D Kinney <michael.d.kin...@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 ++-- > >> .../BaseSynchronizationLib/Synchronization.c | 6 +-- > >> .../BaseSynchronizationLib/SynchronizationGcc.c | 6 +-- > >> .../BaseSynchronizationLib/SynchronizationMsc.c | 6 +-- > >> .../Library/BaseSynchronizationLib/X64/GccInline.c | 19 +++++---- > >> .../X64/InterlockedDecrement.c | 46 > >> ---------------------- > >> .../X64/InterlockedDecrement.nasm | 8 ++-- > >> .../X64/InterlockedIncrement.c | 46 > >> ---------------------- > >> .../X64/InterlockedIncrement.nasm | 5 ++- > >> 16 files changed, 52 insertions(+), 240 deletions(-) > >> delete mode 100644 > >> MdePkg/Library/BaseSynchronizationLib/Ia32/InterlockedDecrement.c > >> delete mode 100644 > >> MdePkg/Library/BaseSynchronizationLib/Ia32/InterlockedIncrement.c > >> delete mode 100644 > >> MdePkg/Library/BaseSynchronizationLib/X64/InterlockedDecrement.c > >> delete mode 100644 > >> MdePkg/Library/BaseSynchronizationLib/X64/InterlockedIncrement.c > >> > >> 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..b971cd138d 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 > >> + Ia32/InterlockedDecrement.nasm | MSFT > >> + Ia32/InterlockedIncrement.nasm | 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 > >> + X64/InterlockedDecrement.nasm | MSFT > >> + X64/InterlockedIncrement.nasm | 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.nas > >> m > >> > b/MdePkg/Library/BaseSynchronizationLib/Ia32/InterlockedDecrement.nas > >> m > >> index 4c46041186..dd5a8de3ed 100644 > >> --- > >> > a/MdePkg/Library/BaseSynchronizationLib/Ia32/InterlockedDecrement.nas > >> m > >> +++ > >> > b/MdePkg/Library/BaseSynchronizationLib/Ia32/InterlockedDecrement.nas > >> m > >> @@ -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/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.c > >> b/MdePkg/Library/BaseSynchronizationLib/X64/InterlockedDecrement.c > >> deleted file mode 100644 > >> index da402cd4c6..0000000000 > >> --- > a/MdePkg/Library/BaseSynchronizationLib/X64/InterlockedDecrement.c > >> +++ /dev/null > >> @@ -1,46 +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. > >> - > >> -**/ > >> - > >> -/** > >> - Microsoft Visual Studio 7.1 Function Prototypes for I/O Intrinsics. > >> -**/ > >> - > >> -long _InterlockedDecrement( > >> - long * lpAddend > >> -); > >> - > >> -#pragma intrinsic(_InterlockedDecrement) > >> - > >> -/** > >> - 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 > >> - ) > >> -{ > >> - return _InterlockedDecrement ((long *)(UINTN)(Value)); > >> -} > >> - > >> 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.c > >> b/MdePkg/Library/BaseSynchronizationLib/X64/InterlockedIncrement.c > >> deleted file mode 100644 > >> index bbd1384602..0000000000 > >> --- > a/MdePkg/Library/BaseSynchronizationLib/X64/InterlockedIncrement.c > >> +++ /dev/null > >> @@ -1,46 +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. > >> - > >> -**/ > >> - > >> -/** > >> - Microsoft Visual Studio 7.1 Function Prototypes for I/O Intrinsics. > >> -**/ > >> - > >> -long _InterlockedIncrement( > >> - long * lpAddend > >> -); > >> - > >> -#pragma intrinsic(_InterlockedIncrement) > >> - > >> -/** > >> - 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 > >> - ) > >> -{ > >> - return _InterlockedIncrement ((long *)(UINTN)(Value)); > >> -} > >> - > >> 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 > > _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel