diff options
author | Michael Brown | 2016-03-16 22:24:13 +0100 |
---|---|---|
committer | Michael Brown | 2016-03-16 23:33:41 +0100 |
commit | 9bab13a7727a36c36b320409e0e785e016a3ff5c (patch) | |
tree | ebbdfd289af8dc14662118376868542750431538 | |
parent | [bitops] Add generic atomic bit test, set, and clear functions (diff) | |
download | ipxe-9bab13a7727a36c36b320409e0e785e016a3ff5c.tar.gz ipxe-9bab13a7727a36c36b320409e0e785e016a3ff5c.tar.xz ipxe-9bab13a7727a36c36b320409e0e785e016a3ff5c.zip |
[hyperv] Use generic set_bit() function
Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r-- | src/arch/i386/include/bits/hyperv.h | 23 | ||||
-rw-r--r-- | src/arch/x86_64/include/bits/hyperv.h | 23 | ||||
-rw-r--r-- | src/interface/hyperv/vmbus.c | 5 |
3 files changed, 3 insertions, 48 deletions
diff --git a/src/arch/i386/include/bits/hyperv.h b/src/arch/i386/include/bits/hyperv.h index 3565c8a8..0ba58afb 100644 --- a/src/arch/i386/include/bits/hyperv.h +++ b/src/arch/i386/include/bits/hyperv.h @@ -46,27 +46,4 @@ hv_call ( struct hv_hypervisor *hv, unsigned int code, const void *in, return result; } -/** - * Set bit atomically - * - * @v bits Bit field - * @v bit Bit to set - */ -static inline __attribute__ (( always_inline )) void -hv_set_bit ( void *bits, unsigned int bit ) { - struct { - uint32_t dword[ ( bit / 32 ) + 1 ]; - } *dwords = bits; - - /* Set bit using "lock bts". Inform compiler that any memory - * from the start of the bit field up to and including the - * dword containing this bit may be modified. (This is - * overkill but shouldn't matter in practice since we're - * unlikely to subsequently read other bits from the same bit - * field.) - */ - __asm__ __volatile__ ( "lock bts %1, %0" - : "+m" ( *dwords ) : "Ir" ( bit ) ); -} - #endif /* _BITS_HYPERV_H */ diff --git a/src/arch/x86_64/include/bits/hyperv.h b/src/arch/x86_64/include/bits/hyperv.h index 845c182f..975b1eee 100644 --- a/src/arch/x86_64/include/bits/hyperv.h +++ b/src/arch/x86_64/include/bits/hyperv.h @@ -49,27 +49,4 @@ hv_call ( struct hv_hypervisor *hv, unsigned int code, const void *in, return result; } -/** - * Set bit atomically - * - * @v bits Bit field - * @v bit Bit to set - */ -static inline __attribute__ (( always_inline )) void -hv_set_bit ( void *bits, unsigned int bit ) { - struct { - uint64_t qword[ ( bit / 64 ) + 1 ]; - } *qwords = bits; - - /* Set bit using "lock bts". Inform compiler that any memory - * from the start of the bit field up to and including the - * qword containing this bit may be modified. (This is - * overkill but shouldn't matter in practice since we're - * unlikely to subsequently read other bits from the same bit - * field.) - */ - __asm__ __volatile__ ( "lock bts %1, %0" - : "+m" ( *qwords ) : "Ir" ( bit ) ); -} - #endif /* _BITS_HYPERV_H */ diff --git a/src/interface/hyperv/vmbus.c b/src/interface/hyperv/vmbus.c index 795929ea..fd809dda 100644 --- a/src/interface/hyperv/vmbus.c +++ b/src/interface/hyperv/vmbus.c @@ -39,6 +39,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include <ipxe/nap.h> #include <ipxe/malloc.h> #include <ipxe/iobuf.h> +#include <ipxe/bitops.h> #include <ipxe/hyperv.h> #include <ipxe/vmbus.h> @@ -559,7 +560,7 @@ static void vmbus_signal_monitor ( struct vmbus_device *vmdev ) { group = ( vmdev->monitor / ( 8 * sizeof ( trigger->pending ) )); bit = ( vmdev->monitor % ( 8 * sizeof ( trigger->pending ) ) ); trigger = &vmbus->monitor_out->trigger[group]; - hv_set_bit ( trigger, bit ); + set_bit ( bit, trigger ); } /** @@ -720,7 +721,7 @@ static int vmbus_send ( struct vmbus_device *vmdev, return 0; /* Set channel bit in interrupt page */ - hv_set_bit ( vmbus->intr->out, vmdev->channel ); + set_bit ( vmdev->channel, vmbus->intr->out ); /* Signal the host */ vmdev->signal ( vmdev ); |