|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 07/18] OvmfPkg/XenBusDxe: Add InterlockedCompareExchange16.
On Thu, Sep 04, 2014 at 05:51:02PM +0100, Anthony PERARD wrote:
> This is a copy of InterlockedCompareExchange32 from the
> BaseSynchronizationLib.
>
> The function will be used in the next patch.
Please spell out the name of it. Such as:
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 V2:
> - Add intel compilation code
> MSFT code is not compied over because I don't know how it works.
Not sure I understand that sentence. Which is the 'MSFT' code? The 'c'
or the assembler? Or is s/compied/copied/ ?
> ---
> OvmfPkg/XenBusDxe/InterlockedCompareExchange16.h | 15 ++++++++
> .../XenBusDxe/InterlockedCompareExchange16Intel.c | 32 +++++++++++++++++
> .../XenBusDxe/X64/InterlockedCompareExchange16.asm | 41
> ++++++++++++++++++++++
> .../XenBusDxe/X64/InterlockedCompareExchange16.c | 41
> ++++++++++++++++++++++
> OvmfPkg/XenBusDxe/XenBusDxe.inf | 4 +++
> 5 files changed, 133 insertions(+)
> create mode 100644 OvmfPkg/XenBusDxe/InterlockedCompareExchange16.h
> create mode 100644 OvmfPkg/XenBusDxe/InterlockedCompareExchange16Intel.c
> create mode 100644 OvmfPkg/XenBusDxe/X64/InterlockedCompareExchange16.asm
> create mode 100644 OvmfPkg/XenBusDxe/X64/InterlockedCompareExchange16.c
>
> diff --git a/OvmfPkg/XenBusDxe/InterlockedCompareExchange16.h
> b/OvmfPkg/XenBusDxe/InterlockedCompareExchange16.h
> new file mode 100644
> index 0000000..9067882
> --- /dev/null
> +++ b/OvmfPkg/XenBusDxe/InterlockedCompareExchange16.h
> @@ -0,0 +1,15 @@
> +UINT16
> +EFIAPI
> +InternalSyncCompareExchange16 (
> + IN UINT16 *Value,
> + IN UINT16 CompareValue,
> + IN UINT16 ExchangeValue
> + );
> +
> +UINT16
> +EFIAPI
> +InterlockedCompareExchange16 (
> + IN OUT volatile UINT16 *Value,
> + IN UINT16 CompareValue,
> + IN UINT16 ExchangeValue
> + );
> diff --git a/OvmfPkg/XenBusDxe/InterlockedCompareExchange16Intel.c
> b/OvmfPkg/XenBusDxe/InterlockedCompareExchange16Intel.c
> new file mode 100644
> index 0000000..bb40e70
> --- /dev/null
> +++ b/OvmfPkg/XenBusDxe/InterlockedCompareExchange16Intel.c
> @@ -0,0 +1,32 @@
> +#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/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/X64/InterlockedCompareExchange16.c
> b/OvmfPkg/XenBusDxe/X64/InterlockedCompareExchange16.c
> new file mode 100644
> index 0000000..64962ba
> --- /dev/null
> +++ b/OvmfPkg/XenBusDxe/X64/InterlockedCompareExchange16.c
> @@ -0,0 +1,41 @@
> +// Took from BaseSynchronizationLib, and replaced 32 by 16
> +/**
> + 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.
> +
> +
> + @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 volatile UINT16 *Value,
> + IN UINT16 CompareValue,
> + IN UINT16 ExchangeValue
> + )
> +{
> + __asm__ __volatile__ (
> + "lock \n\t"
> + "cmpxchgw %3, %1 "
> + : "=a" (CompareValue), // %0
> + "=m" (*Value) // %1
> + : "a" (CompareValue), // %2
> + "r" (ExchangeValue), // %3
> + "m" (*Value)
> + : "memory",
> + "cc"
> + );
> +
> + return CompareValue;
> +}
> diff --git a/OvmfPkg/XenBusDxe/XenBusDxe.inf b/OvmfPkg/XenBusDxe/XenBusDxe.inf
> index aed2359..612c3db 100644
> --- a/OvmfPkg/XenBusDxe/XenBusDxe.inf
> +++ b/OvmfPkg/XenBusDxe/XenBusDxe.inf
> @@ -33,10 +33,14 @@
> ComponentName.h
> XenHypercall.c
> XenHypercall.h
> + InterlockedCompareExchange16.h
>
> [Sources.X64]
> X64/hypercall.S
> X64/hypercall.asm
> + X64/InterlockedCompareExchange16.c | GCC
> + X64/InterlockedCompareExchange16.asm | INTEL
> + InterlockedCompareExchange16Intel.c | INTEL
>
> [LibraryClasses]
> UefiDriverEntryPoint
> --
> Anthony PERARD
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxx
> http://lists.xen.org/xen-devel
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |