xref: /kvm-unit-tests/x86/kvmclock.h (revision b4711e111e7473c2a6cdf714ce4ad77aedc7905a)
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