@@ -35,9 +35,9 @@
#include <IndustryStandard/Xen/memory.h>
#include <Library/XenHypercallLib.h>
+#include <Library/SynchronizationLib.h>
#include "GrantTable.h"
-#include "InterlockedCompareExchange16.h"
#define NR_RESERVED_ENTRIES 8
deleted file mode 100644
@@ -1,42 +0,0 @@
-;------------------------------------------------------------------------------
-;
-; 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:
-;
-;------------------------------------------------------------------------------
-
- SECTION .text
-
-;------------------------------------------------------------------------------
-; UINT32
-; EFIAPI
-; InternalSyncCompareExchange16 (
-; IN UINT16 *Value,
-; IN UINT16 CompareValue,
-; IN UINT16 ExchangeValue
-; );
-;------------------------------------------------------------------------------
-global ASM_PFX(InternalSyncCompareExchange16)
-ASM_PFX(InternalSyncCompareExchange16):
- mov ecx, [esp + 4]
- mov eax, [esp + 8]
- mov edx, [esp + 12]
- lock cmpxchg [ecx], dx
- ret
-
deleted file mode 100644
@@ -1,16 +0,0 @@
-SECTION .text
-
-; INT32
-; EFIAPI
-; TestAndClearBit (
-; IN INT32 Bit,
-; IN volatile VOID* Address
-; );
-global ASM_PFX(TestAndClearBit)
-ASM_PFX(TestAndClearBit):
- mov ecx, [esp + 4]
- mov edx, [esp + 8]
- lock btr [edx], ecx
- sbb eax, eax
- ret
-
deleted file mode 100644
@@ -1,33 +0,0 @@
-#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);
-}
deleted file mode 100644
@@ -1,38 +0,0 @@
-/**
- 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
- );
new file mode 100644
@@ -0,0 +1,45 @@
+/** @file
+ Implementation of TestAndClearBit using compare-exchange primitive
+
+ Copyright (C) 2015, Linaro Ltd.
+
+ 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.
+
+**/
+
+#include <Base.h>
+#include <Library/SynchronizationLib.h>
+
+INT32
+EFIAPI
+TestAndClearBit (
+ IN INT32 Bit,
+ IN VOID *Address
+ )
+{
+ UINT16 Word, Read;
+ UINT16 Mask;
+
+ //
+ // Calculate the effective address relative to 'Address' based on the
+ // higher order bits of 'Bit'. Use signed shift instead of division to
+ // ensure we round towards -Inf, and end up with a positive shift in
+ // 'Bit', even if 'Bit' itself is negative.
+ //
+ Address += (Bit >> 4) * sizeof(UINT16);
+ Mask = 1U << (Bit & 15);
+
+ for (Word = *(UINT16 *) Address; Word & Mask; Word = Read) {
+ Read = InterlockedCompareExchange16 (Address, Word, Word & ~Mask);
+ if (Read == Word) {
+ return 1;
+ }
+ }
+ return 0;
+}
deleted file mode 100644
@@ -1,41 +0,0 @@
-;------------------------------------------------------------------------------
-;
-; 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:
-;
-;------------------------------------------------------------------------------
-
- DEFAULT REL
- SECTION .text
-
-;------------------------------------------------------------------------------
-; UINT16
-; EFIAPI
-; InterlockedCompareExchange16 (
-; IN UINT16 *Value,
-; IN UINT16 CompareValue,
-; IN UINT16 ExchangeValue
-; );
-;------------------------------------------------------------------------------
-global ASM_PFX(InternalSyncCompareExchange16)
-ASM_PFX(InternalSyncCompareExchange16):
- mov eax, edx
- lock cmpxchg [rcx], r8w
- ret
-
deleted file mode 100644
@@ -1,15 +0,0 @@
-DEFAULT REL
-SECTION .text
-
-; INT32
-; EFIAPI
-; TestAndClearBit (
-; IN INT32 Bit, // rcx
-; IN volatile VOID* Address // rdx
-; );
-global ASM_PFX(TestAndClearBit)
-ASM_PFX(TestAndClearBit):
- lock btr [rdx], ecx
- sbb eax, eax
- ret
-
@@ -122,7 +122,7 @@ INT32
EFIAPI
TestAndClearBit (
IN INT32 Bit,
- IN volatile VOID *Address
+ IN VOID *Address
);
CHAR8*
@@ -34,8 +34,6 @@
DriverBinding.h
ComponentName.c
ComponentName.h
- InterlockedCompareExchange16.c
- InterlockedCompareExchange16.h
GrantTable.c
GrantTable.h
EventChannel.c
@@ -45,14 +43,7 @@
XenBus.c
XenBus.h
Helpers.c
-
-[Sources.IA32]
- Ia32/InterlockedCompareExchange16.nasm
- Ia32/TestAndClearBit.nasm
-
-[Sources.X64]
- X64/InterlockedCompareExchange16.nasm
- X64/TestAndClearBit.nasm
+ TestAndClearBit.c
[LibraryClasses]
UefiDriverEntryPoint
@@ -64,6 +55,7 @@
DevicePathLib
DebugLib
XenHypercallLib
+ SynchronizationLib
[Protocols]
gEfiDriverBindingProtocolGuid
This patch updates XenBusDxe to use the 16-bit compare and exchange function that was introduced for this purpose to the BaseSynchronizationLib. It also provides a new generic implementation of TestAndClearBit () using the same 16-bit compare and exchange, making this module fully architecture agnostic. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> --- OvmfPkg/XenBusDxe/GrantTable.c | 2 +- .../Ia32/InterlockedCompareExchange16.nasm | 42 -------------------- OvmfPkg/XenBusDxe/Ia32/TestAndClearBit.nasm | 16 -------- OvmfPkg/XenBusDxe/InterlockedCompareExchange16.c | 33 ---------------- OvmfPkg/XenBusDxe/InterlockedCompareExchange16.h | 38 ------------------ OvmfPkg/XenBusDxe/TestAndClearBit.c | 45 ++++++++++++++++++++++ .../X64/InterlockedCompareExchange16.nasm | 41 -------------------- OvmfPkg/XenBusDxe/X64/TestAndClearBit.nasm | 15 -------- OvmfPkg/XenBusDxe/XenBusDxe.h | 2 +- OvmfPkg/XenBusDxe/XenBusDxe.inf | 12 +----- 10 files changed, 49 insertions(+), 197 deletions(-) delete mode 100644 OvmfPkg/XenBusDxe/Ia32/InterlockedCompareExchange16.nasm delete mode 100644 OvmfPkg/XenBusDxe/Ia32/TestAndClearBit.nasm delete mode 100644 OvmfPkg/XenBusDxe/InterlockedCompareExchange16.c delete mode 100644 OvmfPkg/XenBusDxe/InterlockedCompareExchange16.h create mode 100644 OvmfPkg/XenBusDxe/TestAndClearBit.c delete mode 100644 OvmfPkg/XenBusDxe/X64/InterlockedCompareExchange16.nasm delete mode 100644 OvmfPkg/XenBusDxe/X64/TestAndClearBit.nasm