10 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
19 * @v hv Hyper-V hypervisor
21 * @v in Input parameters
22 * @v out Output parameters
23 * @ret status Status code
25 static inline __attribute__ (( always_inline )) int
26 hv_call ( struct hv_hypervisor *hv, unsigned int code, const void *in,
28 void *hypercall = hv->hypercall;
29 register uint64_t rcx asm ( "rcx" );
30 register uint64_t rdx asm ( "rdx" );
31 register uint64_t r8 asm ( "r8" );
36 in_phys = ( ( __builtin_constant_p ( in ) && ( in == NULL ) )
37 ? 0 : virt_to_phys ( in ) );
38 out_phys = ( ( __builtin_constant_p ( out ) && ( out == NULL ) )
39 ? 0 : virt_to_phys ( out ) );
43 __asm__ __volatile__ ( "call *%4"
44 : "=a" ( result ), "+r" ( rcx ), "+r" ( rdx ),
47 : "r9", "r10", "r11", "xmm0", "xmm1", "xmm2",
48 "xmm3", "xmm4", "xmm5" );
58 static inline __attribute__ (( always_inline )) void
59 hv_set_bit ( void *bits, unsigned int bit ) {
61 uint64_t qword[ ( bit / 64 ) + 1 ];
64 /* Set bit using "lock bts". Inform compiler that any memory
65 * from the start of the bit field up to and including the
66 * qword containing this bit may be modified. (This is
67 * overkill but shouldn't matter in practice since we're
68 * unlikely to subsequently read other bits from the same bit
71 __asm__ __volatile__ ( "lock bts %1, %0"
72 : "+m" ( *qwords ) : "Ir" ( bit ) );
75 #endif /* _BITS_HYPERV_H */