Revision: 16975
          http://sourceforge.net/p/edk2/code/16975
Author:   lersek
Date:     2015-02-28 20:33:34 +0000 (Sat, 28 Feb 2015)
Log Message:
-----------
Ovmf/Xen: port XenBusDxe to other architectures

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
Reviewed-by: Anthony PERARD <[email protected]>
Signed-off-by: Ard Biesheuvel <[email protected]>
Signed-off-by: Laszlo Ersek <[email protected]>

Modified Paths:
--------------
    trunk/edk2/OvmfPkg/XenBusDxe/GrantTable.c
    trunk/edk2/OvmfPkg/XenBusDxe/XenBusDxe.h
    trunk/edk2/OvmfPkg/XenBusDxe/XenBusDxe.inf

Added Paths:
-----------
    trunk/edk2/OvmfPkg/XenBusDxe/TestAndClearBit.c

Removed Paths:
-------------
    trunk/edk2/OvmfPkg/XenBusDxe/Ia32/InterlockedCompareExchange16.nasm
    trunk/edk2/OvmfPkg/XenBusDxe/Ia32/TestAndClearBit.nasm
    trunk/edk2/OvmfPkg/XenBusDxe/InterlockedCompareExchange16.c
    trunk/edk2/OvmfPkg/XenBusDxe/InterlockedCompareExchange16.h
    trunk/edk2/OvmfPkg/XenBusDxe/X64/InterlockedCompareExchange16.nasm
    trunk/edk2/OvmfPkg/XenBusDxe/X64/TestAndClearBit.nasm

Modified: trunk/edk2/OvmfPkg/XenBusDxe/GrantTable.c
===================================================================
--- trunk/edk2/OvmfPkg/XenBusDxe/GrantTable.c   2015-02-28 20:33:22 UTC (rev 
16974)
+++ trunk/edk2/OvmfPkg/XenBusDxe/GrantTable.c   2015-02-28 20:33:34 UTC (rev 
16975)
@@ -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: trunk/edk2/OvmfPkg/XenBusDxe/Ia32/InterlockedCompareExchange16.nasm
===================================================================
--- trunk/edk2/OvmfPkg/XenBusDxe/Ia32/InterlockedCompareExchange16.nasm 
2015-02-28 20:33:22 UTC (rev 16974)
+++ trunk/edk2/OvmfPkg/XenBusDxe/Ia32/InterlockedCompareExchange16.nasm 
2015-02-28 20:33:34 UTC (rev 16975)
@@ -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: trunk/edk2/OvmfPkg/XenBusDxe/Ia32/TestAndClearBit.nasm
===================================================================
--- trunk/edk2/OvmfPkg/XenBusDxe/Ia32/TestAndClearBit.nasm      2015-02-28 
20:33:22 UTC (rev 16974)
+++ trunk/edk2/OvmfPkg/XenBusDxe/Ia32/TestAndClearBit.nasm      2015-02-28 
20:33:34 UTC (rev 16975)
@@ -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: trunk/edk2/OvmfPkg/XenBusDxe/InterlockedCompareExchange16.c
===================================================================
--- trunk/edk2/OvmfPkg/XenBusDxe/InterlockedCompareExchange16.c 2015-02-28 
20:33:22 UTC (rev 16974)
+++ trunk/edk2/OvmfPkg/XenBusDxe/InterlockedCompareExchange16.c 2015-02-28 
20:33:34 UTC (rev 16975)
@@ -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: trunk/edk2/OvmfPkg/XenBusDxe/InterlockedCompareExchange16.h
===================================================================
--- trunk/edk2/OvmfPkg/XenBusDxe/InterlockedCompareExchange16.h 2015-02-28 
20:33:22 UTC (rev 16974)
+++ trunk/edk2/OvmfPkg/XenBusDxe/InterlockedCompareExchange16.h 2015-02-28 
20:33:34 UTC (rev 16975)
@@ -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
-  );

Added: trunk/edk2/OvmfPkg/XenBusDxe/TestAndClearBit.c
===================================================================
--- trunk/edk2/OvmfPkg/XenBusDxe/TestAndClearBit.c                              
(rev 0)
+++ trunk/edk2/OvmfPkg/XenBusDxe/TestAndClearBit.c      2015-02-28 20:33:34 UTC 
(rev 16975)
@@ -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: trunk/edk2/OvmfPkg/XenBusDxe/X64/InterlockedCompareExchange16.nasm
===================================================================
--- trunk/edk2/OvmfPkg/XenBusDxe/X64/InterlockedCompareExchange16.nasm  
2015-02-28 20:33:22 UTC (rev 16974)
+++ trunk/edk2/OvmfPkg/XenBusDxe/X64/InterlockedCompareExchange16.nasm  
2015-02-28 20:33:34 UTC (rev 16975)
@@ -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: trunk/edk2/OvmfPkg/XenBusDxe/X64/TestAndClearBit.nasm
===================================================================
--- trunk/edk2/OvmfPkg/XenBusDxe/X64/TestAndClearBit.nasm       2015-02-28 
20:33:22 UTC (rev 16974)
+++ trunk/edk2/OvmfPkg/XenBusDxe/X64/TestAndClearBit.nasm       2015-02-28 
20:33:34 UTC (rev 16975)
@@ -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
-

Modified: trunk/edk2/OvmfPkg/XenBusDxe/XenBusDxe.h
===================================================================
--- trunk/edk2/OvmfPkg/XenBusDxe/XenBusDxe.h    2015-02-28 20:33:22 UTC (rev 
16974)
+++ trunk/edk2/OvmfPkg/XenBusDxe/XenBusDxe.h    2015-02-28 20:33:34 UTC (rev 
16975)
@@ -122,7 +122,7 @@
 EFIAPI
 TestAndClearBit (
   IN INT32 Bit,
-  IN volatile VOID *Address
+  IN VOID  *Address
   );
 
 CHAR8*

Modified: trunk/edk2/OvmfPkg/XenBusDxe/XenBusDxe.inf
===================================================================
--- trunk/edk2/OvmfPkg/XenBusDxe/XenBusDxe.inf  2015-02-28 20:33:22 UTC (rev 
16974)
+++ trunk/edk2/OvmfPkg/XenBusDxe/XenBusDxe.inf  2015-02-28 20:33:34 UTC (rev 
16975)
@@ -34,8 +34,6 @@
   DriverBinding.h
   ComponentName.c
   ComponentName.h
-  InterlockedCompareExchange16.c
-  InterlockedCompareExchange16.h
   GrantTable.c
   GrantTable.h
   EventChannel.c
@@ -45,15 +43,8 @@
   XenBus.c
   XenBus.h
   Helpers.c
+  TestAndClearBit.c
 
-[Sources.IA32]
-  Ia32/InterlockedCompareExchange16.nasm
-  Ia32/TestAndClearBit.nasm
-
-[Sources.X64]
-  X64/InterlockedCompareExchange16.nasm
-  X64/TestAndClearBit.nasm
-
 [LibraryClasses]
   UefiDriverEntryPoint
   UefiBootServicesTableLib
@@ -64,6 +55,7 @@
   DevicePathLib
   DebugLib
   XenHypercallLib
+  SynchronizationLib
 
 [Protocols]
   gEfiDriverBindingProtocolGuid


------------------------------------------------------------------------------
Dive into the World of Parallel Programming The Go Parallel Website, sponsored
by Intel and developed in partnership with Slashdot Media, is your hub for all
things parallel software development, from weekly thought leadership blogs to
news, videos, case studies, tutorials and more. Take a look and join the 
conversation now. http://goparallel.sourceforge.net/
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits

Reply via email to