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;
|
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 */
|
#endif /* _BITS_HYPERV_H */
|
||||||
|
|
|
@ -49,27 +49,4 @@ hv_call ( struct hv_hypervisor *hv, unsigned int code, const void *in,
|
||||||
return result;
|
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 */
|
#endif /* _BITS_HYPERV_H */
|
||||||
|
|
|
@ -39,6 +39,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||||
#include <ipxe/nap.h>
|
#include <ipxe/nap.h>
|
||||||
#include <ipxe/malloc.h>
|
#include <ipxe/malloc.h>
|
||||||
#include <ipxe/iobuf.h>
|
#include <ipxe/iobuf.h>
|
||||||
|
#include <ipxe/bitops.h>
|
||||||
#include <ipxe/hyperv.h>
|
#include <ipxe/hyperv.h>
|
||||||
#include <ipxe/vmbus.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 ) ));
|
group = ( vmdev->monitor / ( 8 * sizeof ( trigger->pending ) ));
|
||||||
bit = ( vmdev->monitor % ( 8 * sizeof ( trigger->pending ) ) );
|
bit = ( vmdev->monitor % ( 8 * sizeof ( trigger->pending ) ) );
|
||||||
trigger = &vmbus->monitor_out->trigger[group];
|
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;
|
return 0;
|
||||||
|
|
||||||
/* Set channel bit in interrupt page */
|
/* Set channel bit in interrupt page */
|
||||||
hv_set_bit ( vmbus->intr->out, vmdev->channel );
|
set_bit ( vmdev->channel, vmbus->intr->out );
|
||||||
|
|
||||||
/* Signal the host */
|
/* Signal the host */
|
||||||
vmdev->signal ( vmdev );
|
vmdev->signal ( vmdev );
|
||||||
|
|
Loading…
Reference in New Issue