aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2016-03-16 21:27:07 +0000
committerMichael Brown <mcb30@ipxe.org>2016-03-16 22:46:05 +0000
commitc14971bf887dc7aaa85788f71f8c4bdf93d2b7a5 (patch)
tree96f8fada3bfb72f784189308a5ae0c0da701678c
parent9bab13a7727a36c36b320409e0e785e016a3ff5c (diff)
downloadipxe-c14971bf887dc7aaa85788f71f8c4bdf93d2b7a5.tar.gz
[xen] Use generic test_and_clear_bit() function
Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r--src/arch/x86/include/bits/xen.h19
-rw-r--r--src/include/ipxe/xen.h14
2 files changed, 14 insertions, 19 deletions
diff --git a/src/arch/x86/include/bits/xen.h b/src/arch/x86/include/bits/xen.h
index fc065ea38..3433cea1f 100644
--- a/src/arch/x86/include/bits/xen.h
+++ b/src/arch/x86/include/bits/xen.h
@@ -161,23 +161,4 @@ xen_hypercall_5 ( struct xen_hypervisor *xen, unsigned int hypercall,
return retval;
}
-/**
- * Test and clear pending event
- *
- * @v xen Xen hypervisor
- * @v port Event channel port
- * @ret pending Event was pending
- */
-static inline __attribute__ (( always_inline )) uint8_t
-xenevent_pending ( struct xen_hypervisor *xen, evtchn_port_t port ) {
- uint8_t pending;
-
- __asm__ __volatile__ ( "lock btr %2, %0\n\t"
- "setc %1\n\t"
- : "+m" ( xen->shared->evtchn_pending ),
- "=a" ( pending )
- : "Ir" ( port ) );
- return pending;
-}
-
#endif /* _BITS_XEN_H */
diff --git a/src/include/ipxe/xen.h b/src/include/ipxe/xen.h
index eac1145ad..0fb8b7625 100644
--- a/src/include/ipxe/xen.h
+++ b/src/include/ipxe/xen.h
@@ -13,6 +13,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#define __XEN_INTERFACE_VERSION__ 0x00040400
#include <stdint.h>
+#include <ipxe/bitops.h>
#include <ipxe/uaccess.h>
#include <xen/xen.h>
#include <xen/event_channel.h>
@@ -58,6 +59,19 @@ struct xen_hypervisor {
struct xen_store store;
};
+/**
+ * Test and clear pending event
+ *
+ * @v xen Xen hypervisor
+ * @v port Event channel port
+ * @ret pending Event was pending
+ */
+static inline __attribute__ (( always_inline )) int
+xenevent_pending ( struct xen_hypervisor *xen, evtchn_port_t port ) {
+
+ return test_and_clear_bit ( port, xen->shared->evtchn_pending );
+}
+
#include <bits/xen.h>
/**