[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 07/18] OvmfPkg/XenBusDxe: Add InterlockedCompareExchange16.
On Wed, Sep 10, 2014 at 04:09:43PM -0400, Konrad Rzeszutek Wilk wrote: > 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. OK. > > > > 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/ ? OVMF can be compiled with GCC or things called INTEL and MSFT in there build system. Sometime, there are specific source code ('c' or assembler) for a specific compiler. So, here, I meant that, when I compied over the InterlockedCompareExchange function (and change it to work on a 16bit value instead of 32bit), I did not copied the MSFT specific. (I think MSFT stand for microsoft.) To fix that, I should probably try to write a synch_cmpxchg() in assembly. (It's much more complicated without gcc's help to deal with where the arguments are.) > > --- > > 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 -- Anthony PERARD _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |