1 #ifndef _ASM_X86_PVCLOCK_H 2 #define _ASM_X86_PVCLOCK_H 3 4 #include <linux/clocksource.h> 5 #include <asm/pvclock-abi.h> 6 7 /* some helper functions for xen and kvm pv clock sources */ 8 cycle_t pvclock_clocksource_read(struct pvclock_vcpu_time_info *src); 9 void pvclock_set_flags(u8 flags); 10 unsigned long pvclock_tsc_khz(struct pvclock_vcpu_time_info *src); 11 void pvclock_read_wallclock(struct pvclock_wall_clock *wall, 12 struct pvclock_vcpu_time_info *vcpu, 13 struct timespec *ts); 14 void pvclock_resume(void); 15 16 /* 17 * Scale a 64-bit delta by scaling and multiplying by a 32-bit fraction, 18 * yielding a 64-bit result. 19 */ 20 static inline u64 pvclock_scale_delta(u64 delta, u32 mul_frac, int shift) 21 { 22 u64 product; 23 #ifdef __i386__ 24 u32 tmp1, tmp2; 25 #else 26 ulong tmp; 27 #endif 28 29 if (shift < 0) 30 delta >>= -shift; 31 else 32 delta <<= shift; 33 34 #ifdef __i386__ 35 __asm__ ( 36 "mul %5 ; " 37 "mov %4,%%eax ; " 38 "mov %%edx,%4 ; " 39 "mul %5 ; " 40 "xor %5,%5 ; " 41 "add %4,%%eax ; " 42 "adc %5,%%edx ; " 43 : "=A" (product), "=r" (tmp1), "=r" (tmp2) 44 : "a" ((u32)delta), "1" ((u32)(delta >> 32)), "2" (mul_frac) ); 45 #elif defined(__x86_64__) 46 __asm__ ( 47 "mulq %[mul_frac] ; shrd $32, %[hi], %[lo]" 48 : [lo]"=a"(product), 49 [hi]"=d"(tmp) 50 : "0"(delta), 51 [mul_frac]"rm"((u64)mul_frac)); 52 #else 53 #error implement me! 54 #endif 55 56 return product; 57 } 58 59 #endif /* _ASM_X86_PVCLOCK_H */ 60