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 <IndustryStandard/Xen/memory.h>
|
||||||
|
|
||||||
#include <Library/XenHypercallLib.h>
|
#include <Library/XenHypercallLib.h>
|
||||||
|
#include <Library/SynchronizationLib.h>
|
||||||
|
|
||||||
#include "GrantTable.h"
|
#include "GrantTable.h"
|
||||||
#include "InterlockedCompareExchange16.h"
|
|
||||||
|
|
||||||
#define NR_RESERVED_ENTRIES 8
|
#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
|
EFIAPI
|
||||||
TestAndClearBit (
|
TestAndClearBit (
|
||||||
IN INT32 Bit,
|
IN INT32 Bit,
|
||||||
IN volatile VOID *Address
|
IN VOID *Address
|
||||||
);
|
);
|
||||||
|
|
||||||
CHAR8*
|
CHAR8*
|
||||||
|
|
|
@ -34,8 +34,6 @@
|
||||||
DriverBinding.h
|
DriverBinding.h
|
||||||
ComponentName.c
|
ComponentName.c
|
||||||
ComponentName.h
|
ComponentName.h
|
||||||
InterlockedCompareExchange16.c
|
|
||||||
InterlockedCompareExchange16.h
|
|
||||||
GrantTable.c
|
GrantTable.c
|
||||||
GrantTable.h
|
GrantTable.h
|
||||||
EventChannel.c
|
EventChannel.c
|
||||||
|
@ -45,14 +43,7 @@
|
||||||
XenBus.c
|
XenBus.c
|
||||||
XenBus.h
|
XenBus.h
|
||||||
Helpers.c
|
Helpers.c
|
||||||
|
TestAndClearBit.c
|
||||||
[Sources.IA32]
|
|
||||||
Ia32/InterlockedCompareExchange16.nasm
|
|
||||||
Ia32/TestAndClearBit.nasm
|
|
||||||
|
|
||||||
[Sources.X64]
|
|
||||||
X64/InterlockedCompareExchange16.nasm
|
|
||||||
X64/TestAndClearBit.nasm
|
|
||||||
|
|
||||||
[LibraryClasses]
|
[LibraryClasses]
|
||||||
UefiDriverEntryPoint
|
UefiDriverEntryPoint
|
||||||
|
@ -64,6 +55,7 @@
|
||||||
DevicePathLib
|
DevicePathLib
|
||||||
DebugLib
|
DebugLib
|
||||||
XenHypercallLib
|
XenHypercallLib
|
||||||
|
SynchronizationLib
|
||||||
|
|
||||||
[Protocols]
|
[Protocols]
|
||||||
gEfiDriverBindingProtocolGuid
|
gEfiDriverBindingProtocolGuid
|
||||||
|
|
Loading…
Reference in New Issue