mirror of https://github.com/ipxe/ipxe.git
[hyperv] Use generic set_bit() function
Signed-off-by: Michael Brown <mcb30@ipxe.org>pull/51/head
parent
c867b5ab1f
commit
9bab13a772
|
@ -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 */
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 );
|
||||
|
|
Loading…
Reference in New Issue