[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v4 08/19] OvmfPkg/XenBusDxe: Add InterlockedCompareExchange16.
This patch is inspired by InterlockedCompareExchange32 from the BaseSynchronizationLib. 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 add8521..4e92a20 100644 --- a/OvmfPkg/XenBusDxe/XenBusDxe.inf +++ b/OvmfPkg/XenBusDxe/XenBusDxe.inf @@ -36,14 +36,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 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |