From mboxrd@z Thu Jan 1 00:00:00 1970 From: Konrad Rzeszutek Wilk Subject: Re: [PATCH v2 07/18] OvmfPkg/XenBusDxe: Add InterlockedCompareExchange16. Date: Wed, 10 Sep 2014 16:09:43 -0400 Message-ID: <20140910200943.GH3556@laptop.dumpdata.com> References: <1409849473-9268-1-git-send-email-anthony.perard@citrix.com> <1409849473-9268-8-git-send-email-anthony.perard@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Content-Disposition: inline In-Reply-To: <1409849473-9268-8-git-send-email-anthony.perard@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Anthony PERARD Cc: EDK2 devel , Xen Devel List-Id: xen-devel@lists.xenproject.org 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 > > --- > 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.
> +; 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@lists.xen.org > http://lists.xen.org/xen-devel