[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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



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 <anthony.perard@xxxxxxxxxx>
> 
> ---
> 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.<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.
> +;
> +; 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 <Library/DebugLib.h>
> +#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.<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.
> +;
> +; 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@xxxxxxxxxxxxxxxxxxxxx
> https://lists.sourceforge.net/lists/listinfo/edk2-devel

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.