linux/arch/x86/include/asm/pvclock.h
<<
>>
Prefs
   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 */
   8cycle_t pvclock_clocksource_read(struct pvclock_vcpu_time_info *src);
   9void pvclock_set_flags(u8 flags);
  10unsigned long pvclock_tsc_khz(struct pvclock_vcpu_time_info *src);
  11void pvclock_read_wallclock(struct pvclock_wall_clock *wall,
  12                            struct pvclock_vcpu_time_info *vcpu,
  13                            struct timespec *ts);
  14void 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 */
  20static 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                "mul %[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