]> git.proxmox.com Git - mirror_edk2.git/commitdiff
OvmfPkg/XenBusDxe: Add TestAndClearBit.
authorAnthony PERARD <anthony.perard@citrix.com>
Wed, 29 Oct 2014 06:50:35 +0000 (06:50 +0000)
committerjljusten <jljusten@Edk2>
Wed, 29 Oct 2014 06:50:35 +0000 (06:50 +0000)
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

OvmfPkg/XenBusDxe/Ia32/TestAndClearBit.S [new file with mode: 0644]
OvmfPkg/XenBusDxe/Ia32/TestAndClearBit.asm [new file with mode: 0644]
OvmfPkg/XenBusDxe/X64/TestAndClearBit.S [new file with mode: 0644]
OvmfPkg/XenBusDxe/X64/TestAndClearBit.asm [new file with mode: 0644]
OvmfPkg/XenBusDxe/XenBusDxe.h
OvmfPkg/XenBusDxe/XenBusDxe.inf

diff --git a/OvmfPkg/XenBusDxe/Ia32/TestAndClearBit.S b/OvmfPkg/XenBusDxe/Ia32/TestAndClearBit.S
new file mode 100644 (file)
index 0000000..58dfa8b
--- /dev/null
@@ -0,0 +1,13 @@
+# INT32\r
+# EFIAPI\r
+# TestAndClearBit (\r
+#   IN  INT32 Bit,\r
+#   IN  volatile VOID* Address\r
+#   );\r
+ASM_GLOBAL ASM_PFX(TestAndClearBit)\r
+ASM_PFX(TestAndClearBit):\r
+  mov 4(%esp), %ecx\r
+  mov 8(%esp), %edx\r
+  lock btrl %ecx, (%edx)\r
+  sbbl %eax, %eax\r
+  ret\r
diff --git a/OvmfPkg/XenBusDxe/Ia32/TestAndClearBit.asm b/OvmfPkg/XenBusDxe/Ia32/TestAndClearBit.asm
new file mode 100644 (file)
index 0000000..ac80902
--- /dev/null
@@ -0,0 +1,17 @@
+.code\r
+\r
+; INT32\r
+; EFIAPI\r
+; TestAndClearBit (\r
+;   IN  INT32 Bit,\r
+;   IN  volatile VOID* Address\r
+;   );\r
+TestAndClearBit PROC\r
+  mov ecx, [esp + 4]\r
+  mov edx, [esp + 8]\r
+  lock btr [edx], ecx\r
+  sbb eax, eax\r
+  ret\r
+TestAndClearBit ENDP\r
+\r
+END\r
diff --git a/OvmfPkg/XenBusDxe/X64/TestAndClearBit.S b/OvmfPkg/XenBusDxe/X64/TestAndClearBit.S
new file mode 100644 (file)
index 0000000..0372e83
--- /dev/null
@@ -0,0 +1,12 @@
+# INT32\r
+# EFIAPI\r
+# TestAndClearBit (\r
+#   IN  INT32 Bit,                // rcx\r
+#   IN  volatile VOID* Address    // rdx\r
+#   );\r
+ASM_GLOBAL ASM_PFX(TestAndClearBit)\r
+ASM_PFX(TestAndClearBit):\r
+  lock\r
+  btrl %ecx, (%rdx)\r
+  sbbl %eax, %eax\r
+  ret\r
diff --git a/OvmfPkg/XenBusDxe/X64/TestAndClearBit.asm b/OvmfPkg/XenBusDxe/X64/TestAndClearBit.asm
new file mode 100644 (file)
index 0000000..3a25879
--- /dev/null
@@ -0,0 +1,16 @@
+.code\r
+\r
+; INT32\r
+; EFIAPI\r
+; TestAndClearBit (\r
+;   IN  INT32 Bit,                // rcx\r
+;   IN  volatile VOID* Address    // rdx\r
+;   );\r
+TestAndClearBit PROC\r
+  lock\r
+  btr [rdx], ecx\r
+  sbb eax, eax\r
+  ret\r
+TestAndClearBit ENDP\r
+\r
+END\r
index 64579bb83284ce16fc0bedb4420def8f13169c33..d80c118acf938273b526d6bb7be9f32f9763cb7a 100644 (file)
@@ -97,4 +97,23 @@ struct _XENBUS_DEVICE {
   shared_info_t                 *SharedInfo;\r
 };\r
 \r
+/*\r
+ * Helpers\r
+ */\r
+\r
+/**\r
+  Atomically test and clear a bit.\r
+\r
+  @param Bit      Bit index to test in *Address\r
+  @param Address  The Address to the buffer that contain the bit to test.\r
+\r
+  @return Value of the Bit before it was cleared.\r
+**/\r
+INT32\r
+EFIAPI\r
+TestAndClearBit (\r
+  IN INT32 Bit,\r
+  IN volatile VOID *Address\r
+  );\r
+\r
 #endif\r
index 0af1946e2658108fd7c370c4da838eaa283df23b..742b7c615b5ba1f6f0e239bd11cf9bed59a1fa1d 100644 (file)
   Ia32/hypercall.asm\r
   Ia32/InterlockedCompareExchange16.S\r
   Ia32/InterlockedCompareExchange16.asm\r
+  Ia32/TestAndClearBit.S\r
+  Ia32/TestAndClearBit.asm\r
 \r
 [Sources.X64]\r
   X64/hypercall.S\r
   X64/hypercall.asm\r
   X64/InterlockedCompareExchange16.S\r
   X64/InterlockedCompareExchange16.asm\r
+  X64/TestAndClearBit.S\r
+  X64/TestAndClearBit.asm\r
 \r
 [LibraryClasses]\r
   UefiDriverEntryPoint\r