| #ifndef KVMCLOCK_H |
| #define KVMCLOCK_H |
| |
| #define MSR_KVM_WALL_CLOCK 0x11 |
| #define MSR_KVM_SYSTEM_TIME 0x12 |
| |
| #define MAX_CPU 64 |
| |
| #define PVCLOCK_TSC_STABLE_BIT (1 << 0) |
| #define PVCLOCK_RAW_CYCLE_BIT (1 << 7) /* Get raw cycle */ |
| |
| # define NSEC_PER_SEC 1000000000ULL |
| |
| typedef u64 cycle_t; |
| |
| struct pvclock_vcpu_time_info { |
| u32 version; |
| u32 pad0; |
| u64 tsc_timestamp; |
| u64 system_time; |
| u32 tsc_to_system_mul; |
| s8 tsc_shift; |
| u8 flags; |
| u8 pad[2]; |
| } __attribute__((__packed__)); /* 32 bytes */ |
| |
| struct pvclock_wall_clock { |
| u32 version; |
| u32 sec; |
| u32 nsec; |
| } __attribute__((__packed__)); |
| |
| /* |
| * These are perodically updated |
| * xen: magic shared_info page |
| * kvm: gpa registered via msr |
| * and then copied here. |
| */ |
| struct pvclock_shadow_time { |
| u64 tsc_timestamp; /* TSC at last update of time vals. */ |
| u64 system_timestamp; /* Time, in nanosecs, since boot. */ |
| u32 tsc_to_nsec_mul; |
| int tsc_shift; |
| u32 version; |
| u8 flags; |
| }; |
| |
| |
| struct timespec { |
| long tv_sec; |
| long tv_nsec; |
| }; |
| |
| void pvclock_set_flags(unsigned char flags); |
| cycle_t kvm_clock_read(); |
| void kvm_get_wallclock(struct timespec *ts); |
| void kvm_clock_init(void *data); |
| void kvm_clock_clear(void *data); |
| |
| #endif |