This is a copy of InterlockedCompareExchange32 from the BaseSynchronizationLib.
The function will be used in the next patch. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Anthony PERARD <anthony.per...@citrix.com> --- OvmfPkg/XenbusDxe/InterlockedCompareExchange16.h | 7 ++++ .../XenbusDxe/X64/InterlockedCompareExchange16.c | 41 ++++++++++++++++++++++ OvmfPkg/XenbusDxe/XenbusDxe.inf | 2 ++ 3 files changed, 50 insertions(+) create mode 100644 OvmfPkg/XenbusDxe/InterlockedCompareExchange16.h 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..55f61a8 --- /dev/null +++ b/OvmfPkg/XenbusDxe/InterlockedCompareExchange16.h @@ -0,0 +1,7 @@ +UINT16 +EFIAPI +InterlockedCompareExchange16 ( + IN OUT volatile UINT16 *Value, + IN UINT16 CompareValue, + IN UINT16 ExchangeValue + ); 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 1a6b131..8f58821 100644 --- a/OvmfPkg/XenbusDxe/XenbusDxe.inf +++ b/OvmfPkg/XenbusDxe/XenbusDxe.inf @@ -33,10 +33,12 @@ ComponentName.h XenHypercall.c XenHypercall.h + InterlockedCompareExchange16.h [Sources.X64] X64/hypercall.S X64/hypercall.asm + X64/InterlockedCompareExchange16.c | GCC [LibraryClasses] UefiDriverEntryPoint -- Anthony PERARD ------------------------------------------------------------------------------ Want fast and easy access to all the code in your enterprise? Index and search up to 200,000 lines of code with a free copy of Black Duck Code Sight - the same software that powers the world's largest code search on Ohloh, the Black Duck Open Hub! Try it now. http://p.sf.net/sfu/bds _______________________________________________ edk2-devel mailing list edk2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/edk2-devel