1 #ifndef KVMCLOCK_H 2 #define KVMCLOCK_H 3 4 #define MSR_KVM_WALL_CLOCK_NEW 0x4b564d00 5 #define MSR_KVM_SYSTEM_TIME_NEW 0x4b564d01 6 7 #define MAX_CPU 64 8 9 #define PVCLOCK_TSC_STABLE_BIT (1 << 0) 10 #define PVCLOCK_RAW_CYCLE_BIT (1 << 7) /* Get raw cycle */ 11 12 # define NSEC_PER_SEC 1000000000ULL 13 14 typedef u64 cycle_t; 15 16 struct pvclock_vcpu_time_info { 17 u32 version; 18 u32 pad0; 19 u64 tsc_timestamp; 20 u64 system_time; 21 u32 tsc_to_system_mul; 22 s8 tsc_shift; 23 u8 flags; 24 u8 pad[2]; 25 } __attribute__((__packed__)); /* 32 bytes */ 26 27 struct pvclock_wall_clock { 28 u32 version; 29 u32 sec; 30 u32 nsec; 31 } __attribute__((__packed__)); 32 33 /* 34 * These are perodically updated 35 * xen: magic shared_info page 36 * kvm: gpa registered via msr 37 * and then copied here. 38 */ 39 struct pvclock_shadow_time { 40 u64 tsc_timestamp; /* TSC at last update of time vals. */ 41 u64 system_timestamp; /* Time, in nanosecs, since boot. */ 42 u32 tsc_to_nsec_mul; 43 int tsc_shift; 44 u32 version; 45 u8 flags; 46 }; 47 48 49 struct timespec { 50 long tv_sec; 51 long tv_nsec; 52 }; 53 54 void pvclock_set_flags(unsigned char flags); 55 cycle_t kvm_clock_read(); 56 void kvm_get_wallclock(struct timespec *ts); 57 void kvm_clock_init(void *data); 58 void kvm_clock_clear(void *data); 59 60 #endif 61