[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |