1 
2 #ifndef __X86_TIME_H__
3 #define __X86_TIME_H__
4 
5 #include <asm/msr.h>
6 
7 /*
8  *  PV TSC emulation modes:
9  *    0 = guest rdtsc/p executed natively when monotonicity can be guaranteed
10  *         and emulated otherwise (with frequency scaled if necessary)
11  *    1 = guest rdtsc/p always emulated at 1GHz (kernel and user)
12  *    2 = guest rdtsc always executed natively (no monotonicity/frequency
13  *         guarantees); guest rdtscp emulated at native frequency if
14  *         unsupported by h/w, else executed natively
15  *    3 = same as 2, except xen manages TSC_AUX register so guest can
16  *         determine when a restore/migration has occurred and assumes
17  *         guest obtains/uses pvclock-like mechanism to adjust for
18  *         monotonicity and frequency changes
19  */
20 #define TSC_MODE_DEFAULT          0
21 #define TSC_MODE_ALWAYS_EMULATE   1
22 #define TSC_MODE_NEVER_EMULATE    2
23 #define TSC_MODE_PVRDTSCP         3
24 
25 typedef u64 cycles_t;
26 
27 extern bool disable_tsc_sync;
28 
get_cycles(void)29 static inline cycles_t get_cycles(void)
30 {
31     return rdtsc();
32 }
33 
34 unsigned long
35 mktime (unsigned int year, unsigned int mon,
36         unsigned int day, unsigned int hour,
37         unsigned int min, unsigned int sec);
38 
39 int time_suspend(void);
40 int time_resume(void);
41 
42 void init_percpu_time(void);
43 void time_latch_stamps(void);
44 
45 struct ioreq;
46 int hwdom_pit_access(struct ioreq *ioreq);
47 
48 int cpu_frequency_change(u64 freq);
49 
50 void pit_broadcast_enter(void);
51 void pit_broadcast_exit(void);
52 int pit_broadcast_is_available(void);
53 
54 uint64_t acpi_pm_tick_to_ns(uint64_t ticks);
55 uint64_t ns_to_acpi_pm_tick(uint64_t ns);
56 
57 uint64_t tsc_ticks2ns(uint64_t ticks);
58 
59 void pv_soft_rdtsc(struct vcpu *v, struct cpu_user_regs *regs, int rdtscp);
60 u64 gtime_to_gtsc(struct domain *d, u64 time);
61 u64 gtsc_to_gtime(struct domain *d, u64 tsc);
62 
63 void tsc_set_info(struct domain *d, uint32_t tsc_mode, uint64_t elapsed_nsec,
64                   uint32_t gtsc_khz, uint32_t incarnation);
65 
66 void tsc_get_info(struct domain *d, uint32_t *tsc_mode, uint64_t *elapsed_nsec,
67                   uint32_t *gtsc_khz, uint32_t *incarnation);
68 
69 
70 void force_update_vcpu_system_time(struct vcpu *v);
71 
72 bool clocksource_is_tsc(void);
73 int host_tsc_is_safe(void);
74 u64 stime2tsc(s_time_t stime);
75 
76 struct time_scale;
77 void set_time_scale(struct time_scale *ts, u64 ticks_per_sec);
78 u64 scale_delta(u64 delta, const struct time_scale *scale);
79 
80 #endif /* __X86_TIME_H__ */
81