Skip to content

Commit

Permalink
[hyperv] Use generic set_bit() function
Browse files Browse the repository at this point in the history
Signed-off-by: Michael Brown <mcb30@ipxe.org>
  • Loading branch information
mcb30 committed Mar 16, 2016
1 parent c867b5a commit 9bab13a
Show file tree
Hide file tree
Showing 3 changed files with 3 additions and 48 deletions.
23 changes: 0 additions & 23 deletions src/arch/i386/include/bits/hyperv.h
Expand Up @@ -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 */
23 changes: 0 additions & 23 deletions src/arch/x86_64/include/bits/hyperv.h
Expand Up @@ -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 */
5 changes: 3 additions & 2 deletions src/interface/hyperv/vmbus.c
Expand Up @@ -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>

Expand Down Expand Up @@ -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 );
}

/**
Expand Down Expand Up @@ -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 );
Expand Down

0 comments on commit 9bab13a

Please sign in to comment.