OvmfPkg/XenBusDxe: Add TestAndClearBit.

This atomically test's and clear's a bit.

Change in V3:
- adding IA32 support. (not yet reviewed)
  both XenBusDxe/Ia32/TestAndClearBit.{S,asm} are new

Change in V2:
- Adding .asm version
- Comment the function

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>

git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16266 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Anthony PERARD 2014-10-29 06:50:35 +00:00 committed by jljusten
parent f1259bba36
commit 6342f1fea8
6 changed files with 81 additions and 0 deletions

View File

@ -0,0 +1,13 @@
# INT32
# EFIAPI
# TestAndClearBit (
# IN INT32 Bit,
# IN volatile VOID* Address
# );
ASM_GLOBAL ASM_PFX(TestAndClearBit)
ASM_PFX(TestAndClearBit):
mov 4(%esp), %ecx
mov 8(%esp), %edx
lock btrl %ecx, (%edx)
sbbl %eax, %eax
ret

View File

@ -0,0 +1,17 @@
.code
; INT32
; EFIAPI
; TestAndClearBit (
; IN INT32 Bit,
; IN volatile VOID* Address
; );
TestAndClearBit PROC
mov ecx, [esp + 4]
mov edx, [esp + 8]
lock btr [edx], ecx
sbb eax, eax
ret
TestAndClearBit ENDP
END

View File

@ -0,0 +1,12 @@
# INT32
# EFIAPI
# TestAndClearBit (
# IN INT32 Bit, // rcx
# IN volatile VOID* Address // rdx
# );
ASM_GLOBAL ASM_PFX(TestAndClearBit)
ASM_PFX(TestAndClearBit):
lock
btrl %ecx, (%rdx)
sbbl %eax, %eax
ret

View File

@ -0,0 +1,16 @@
.code
; INT32
; EFIAPI
; TestAndClearBit (
; IN INT32 Bit, // rcx
; IN volatile VOID* Address // rdx
; );
TestAndClearBit PROC
lock
btr [rdx], ecx
sbb eax, eax
ret
TestAndClearBit ENDP
END

View File

@ -97,4 +97,23 @@ struct _XENBUS_DEVICE {
shared_info_t *SharedInfo;
};
/*
* Helpers
*/
/**
Atomically test and clear a bit.
@param Bit Bit index to test in *Address
@param Address The Address to the buffer that contain the bit to test.
@return Value of the Bit before it was cleared.
**/
INT32
EFIAPI
TestAndClearBit (
IN INT32 Bit,
IN volatile VOID *Address
);
#endif

View File

@ -48,12 +48,16 @@
Ia32/hypercall.asm
Ia32/InterlockedCompareExchange16.S
Ia32/InterlockedCompareExchange16.asm
Ia32/TestAndClearBit.S
Ia32/TestAndClearBit.asm
[Sources.X64]
X64/hypercall.S
X64/hypercall.asm
X64/InterlockedCompareExchange16.S
X64/InterlockedCompareExchange16.asm
X64/TestAndClearBit.S
X64/TestAndClearBit.asm
[LibraryClasses]
UefiDriverEntryPoint