Re: [edk2] [PATCH v3 08/19] OvmfPkg/XenBusDxe: Add InterlockedCompareExchange16.

Subject: Re: [edk2] [PATCH v3 08/19] OvmfPkg/XenBusDxe: Add InterlockedCompareExchange16.

From: Jordan Justen <jordan.l.justen@intel.com>

To: <edk2-devel@lists.sourceforge.net>, Anthony PERARD <anthony.perard@citrix.com>,

Date: 2014-10-20 01:00:13

On 2014-10-17 10:03:51, Anthony PERARD wrote:
> This patch is inspired by InterlockedCompareExchange32 from the
> BaseSynchronizationLib.

Why not attempt to add it to BaseSynchronizationLib?

-Jordan

> The function will be used in the "OvmfPkg/XenBusDxe: Add Grant Table
> functions" patch.
> 
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Anthony PERARD 
> 
> ---
> Change in V3:
> - Implement both .S and .asm, to get rid of GCC specific asm.
> - Implement 32bit part of the assembly
> 
> Change in V2:
> - Add intel compilation code
>   MSFT code is not compied over because I don't know how it works.
> ---
>  .../XenBusDxe/Ia32/InterlockedCompareExchange16.S  | 15 ++++++++
>  .../Ia32/InterlockedCompareExchange16.asm          | 45 ++++++++++++++++++++++
>  OvmfPkg/XenBusDxe/InterlockedCompareExchange16.c   | 33 ++++++++++++++++
>  OvmfPkg/XenBusDxe/InterlockedCompareExchange16.h   | 38 ++++++++++++++++++
>  .../XenBusDxe/X64/InterlockedCompareExchange16.S   | 13 +++++++
>  .../XenBusDxe/X64/InterlockedCompareExchange16.asm | 41 ++++++++++++++++++++
>  OvmfPkg/XenBusDxe/XenBusDxe.inf                    |  6 +++
>  7 files changed, 191 insertions(+)
>  create mode 100644 OvmfPkg/XenBusDxe/Ia32/InterlockedCompareExchange16.S
>  create mode 100644 OvmfPkg/XenBusDxe/Ia32/InterlockedCompareExchange16.asm
>  create mode 100644 OvmfPkg/XenBusDxe/InterlockedCompareExchange16.c
>  create mode 100644 OvmfPkg/XenBusDxe/InterlockedCompareExchange16.h
>  create mode 100644 OvmfPkg/XenBusDxe/X64/InterlockedCompareExchange16.S
>  create mode 100644 OvmfPkg/XenBusDxe/X64/InterlockedCompareExchange16.asm
> 
> diff --git a/OvmfPkg/XenBusDxe/Ia32/InterlockedCompareExchange16.S b/OvmfPkg/XenBusDxe/Ia32/InterlockedCompareExchange16.S
> new file mode 100644
> index 0000000..b4adb66
> --- /dev/null
> +++ b/OvmfPkg/XenBusDxe/Ia32/InterlockedCompareExchange16.S
> @@ -0,0 +1,15 @@
> +# UINT16
> +# EFIAPI
> +# InternalSyncCompareExchange16 (
> +#   IN      volatile UINT16           *Value,
> +#   IN      UINT16                    CompareValue,
> +#   IN      UINT16                    ExchangeValue
> +#   );
> +ASM_GLOBAL ASM_PFX(InternalSyncCompareExchange16)
> +ASM_PFX(InternalSyncCompareExchange16):
> +  mov 4(%esp), %ecx
> +  mov 8(%esp), %eax
> +  mov 12(%esp), %edx
> +  lock
> +  cmpxchgw %dx, (%ecx)
> +  ret
> diff --git a/OvmfPkg/XenBusDxe/Ia32/InterlockedCompareExchange16.asm b/OvmfPkg/XenBusDxe/Ia32/InterlockedCompareExchange16.asm
> new file mode 100644
> index 0000000..adcfbd0
> --- /dev/null
> +++ b/OvmfPkg/XenBusDxe/Ia32/InterlockedCompareExchange16.asm
> @@ -0,0 +1,45 @@
> +;------------------------------------------------------------------------------
> +;
> +; Copyright (c) 2006, Intel Corporation. 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. > +; > +; Module Name: > +; > +; InterlockedCompareExchange16.Asm > +; > +; Abstract: > +; > +; InterlockedCompareExchange16 function > +; > +; Notes: > +; > +;------------------------------------------------------------------------------ > + > + .486 > + .model flat,C > + .code > + > +;------------------------------------------------------------------------------ > +; UINT32 > +; EFIAPI > +; InternalSyncCompareExchange16 ( > +; IN UINT16 *Value, > +; IN UINT16 CompareValue, > +; IN UINT16 ExchangeValue > +; ); > +;------------------------------------------------------------------------------ > +InternalSyncCompareExchange16 PROC > + mov ecx, [esp + 4] > + mov eax, [esp + 8] > + mov edx, [esp + 12] > + lock cmpxchg [ecx], dx > + ret > +InternalSyncCompareExchange16 ENDP > + > + END > diff --git a/OvmfPkg/XenBusDxe/InterlockedCompareExchange16.c b/OvmfPkg/XenBusDxe/InterlockedCompareExchange16.c > new file mode 100644 > index 0000000..89d96d1 > --- /dev/null > +++ b/OvmfPkg/XenBusDxe/InterlockedCompareExchange16.c > @@ -0,0 +1,33 @@ > +#include > +#include "InterlockedCompareExchange16.h" > + > +/** > + Performs an atomic compare exchange operation on a 16-bit unsigned integer. > + > + Performs an atomic compare exchange operation on the 16-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. > + > + If Value is NULL, then ASSERT(). > + > + @param Value A pointer to the 16-bit value for the compare exchange > + operation. > + @param CompareValue 16-bit value used in compare operation. > + @param ExchangeValue 16-bit value used in exchange operation. > + > + @return The original *Value before exchange. > + > +**/ > +UINT16 > +EFIAPI > +InterlockedCompareExchange16 ( > + IN OUT UINT16 *Value, > + IN UINT16 CompareValue, > + IN UINT16 ExchangeValue > + ) > +{ > + ASSERT (Value != NULL); > + return InternalSyncCompareExchange16 (Value, CompareValue, ExchangeValue); > +} > diff --git a/OvmfPkg/XenBusDxe/InterlockedCompareExchange16.h b/OvmfPkg/XenBusDxe/InterlockedCompareExchange16.h > new file mode 100644 > index 0000000..e863dbd > --- /dev/null > +++ b/OvmfPkg/XenBusDxe/InterlockedCompareExchange16.h > @@ -0,0 +1,38 @@ > +/** > + Assembly implementation of InterlockedCompareExchange16. > + > + Look at the documentation of InterlockedCompareExchange16. > +**/ > +UINT16 > +EFIAPI > +InternalSyncCompareExchange16 ( > + IN volatile UINT16 *Value, > + IN UINT16 CompareValue, > + IN UINT16 ExchangeValue > + ); > + > +/** > + Performs an atomic compare exchange operation on a 16-bit unsigned integer. > + > + Performs an atomic compare exchange operation on the 16-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. > + > + If Value is NULL, then ASSERT(). > + > + @param Value A pointer to the 16-bit value for the compare exchange > + operation. > + @param CompareValue 16-bit value used in compare operation. > + @param ExchangeValue 16-bit value used in exchange operation. > + > + @return The original *Value before exchange. > +**/ > +UINT16 > +EFIAPI > +InterlockedCompareExchange16 ( > + IN OUT UINT16 *Value, > + IN UINT16 CompareValue, > + IN UINT16 ExchangeValue > + ); > diff --git a/OvmfPkg/XenBusDxe/X64/InterlockedCompareExchange16.S b/OvmfPkg/XenBusDxe/X64/InterlockedCompareExchange16.S > new file mode 100644 > index 0000000..c6336ca > --- /dev/null > +++ b/OvmfPkg/XenBusDxe/X64/InterlockedCompareExchange16.S > @@ -0,0 +1,13 @@ > +# UINT16 > +# EFIAPI > +# InternalSyncCompareExchange16 ( > +# IN volatile UINT16 *Value, > +# IN UINT16 CompareValue, > +# IN UINT16 ExchangeValue > +# ); > +ASM_GLOBAL ASM_PFX(InternalSyncCompareExchange16) > +ASM_PFX(InternalSyncCompareExchange16): > + mov %edx, %eax > + lock > + cmpxchgw %r8w, (%rcx) > + ret > diff --git a/OvmfPkg/XenBusDxe/X64/InterlockedCompareExchange16.asm b/OvmfPkg/XenBusDxe/X64/InterlockedCompareExchange16.asm > new file mode 100644 > index 0000000..b23e421 > --- /dev/null > +++ b/OvmfPkg/XenBusDxe/X64/InterlockedCompareExchange16.asm > @@ -0,0 +1,41 @@ > +;------------------------------------------------------------------------------ > +; > +; Copyright (c) 2006, Intel Corporation. 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. > +; > +; Module Name: > +; > +; InterlockedCompareExchange16.Asm > +; > +; Abstract: > +; > +; InterlockedCompareExchange16 function > +; > +; Notes: > +; > +;------------------------------------------------------------------------------ > + > + .code > + > +;------------------------------------------------------------------------------ > +; UINT16 > +; EFIAPI > +; InterlockedCompareExchange16 ( > +; IN UINT16 *Value, > +; IN UINT16 CompareValue, > +; IN UINT16 ExchangeValue > +; ); > +;------------------------------------------------------------------------------ > +InternalSyncCompareExchange16 PROC > + mov eax, edx > + lock cmpxchg [rcx], r8w > + ret > +InternalSyncCompareExchange16 ENDP > + > + END > diff --git a/OvmfPkg/XenBusDxe/XenBusDxe.inf b/OvmfPkg/XenBusDxe/XenBusDxe.inf > index e5bfff6..444118a 100644 > --- a/OvmfPkg/XenBusDxe/XenBusDxe.inf > +++ b/OvmfPkg/XenBusDxe/XenBusDxe.inf > @@ -33,14 +33,20 @@ > ComponentName.h > XenHypercall.c > XenHypercall.h > + InterlockedCompareExchange16.c > + InterlockedCompareExchange16.h > > [Sources.IA32] > Ia32/hypercall.S > Ia32/hypercall.asm > + Ia32/InterlockedCompareExchange16.S > + Ia32/InterlockedCompareExchange16.asm > > [Sources.X64] > X64/hypercall.S > X64/hypercall.asm > + X64/InterlockedCompareExchange16.S > + X64/InterlockedCompareExchange16.asm > > [LibraryClasses] > UefiDriverEntryPoint > -- > Anthony PERARD > > > ------------------------------------------------------------------------------ > Comprehensive Server Monitoring with Site24x7. > Monitor 10 servers for $9/Month. > Get alerted through email, SMS, voice calls or mobile push notifications. > Take corrective actions from your mobile device. > http://p.sf.net/sfu/Zoho > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/edk2-devel ------------------------------------------------------------------------------ Comprehensive Server Monitoring with Site24x7. Monitor 10 servers for $9/Month. Get alerted through email, SMS, voice calls or mobile push notifications. Take corrective actions from your mobile device. http://p.sf.net/sfu/Zoho _______________________________________________ edk2-devel mailing list edk2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/edk2-devel