[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.