diff options
author | Michael Brown <mcb30@ipxe.org> | 2016-03-16 21:27:07 +0000 |
---|---|---|
committer | Michael Brown <mcb30@ipxe.org> | 2016-03-16 22:46:05 +0000 |
commit | c14971bf887dc7aaa85788f71f8c4bdf93d2b7a5 (patch) | |
tree | 96f8fada3bfb72f784189308a5ae0c0da701678c | |
parent | 9bab13a7727a36c36b320409e0e785e016a3ff5c (diff) | |
download | ipxe-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.h | 19 | ||||
-rw-r--r-- | src/include/ipxe/xen.h | 14 |
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> /** |