mirror of https://github.com/acidanthera/audk.git
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 <anthony.perard@citrix.com> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Signed-off-by: Laszlo Ersek <lersek@redhat.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16975 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
b94c3ac93d
commit
e482753b33
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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);
|
||||
}
|
|
@ -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
|
||||
);
|
|
@ -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;
|
||||
}
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue