]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/x86/include/pvclock.h
pvclock: Add 'struct pvclock' API
[FreeBSD/FreeBSD.git] / sys / x86 / include / pvclock.h
1 /*-
2  * Copyright (c) 2014, Bryan Venteicher <bryanv@FreeBSD.org>
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  *
26  * $FreeBSD$
27  */
28
29 #ifndef X86_PVCLOCK
30 #define X86_PVCLOCK
31
32 #include <sys/types.h>
33 #include <sys/timetc.h>
34
35 struct pvclock_vcpu_time_info {
36         uint32_t        version;
37         uint32_t        pad0;
38         uint64_t        tsc_timestamp;
39         uint64_t        system_time;
40         uint32_t        tsc_to_system_mul;
41         int8_t          tsc_shift;
42         uint8_t         flags;
43         uint8_t         pad[2];
44 };
45
46 #define PVCLOCK_FLAG_TSC_STABLE         0x01
47 #define PVCLOCK_FLAG_GUEST_PASUED       0x02
48
49 typedef struct pvclock_wall_clock *pvclock_get_wallclock_t(void *arg);
50
51 struct pvclock_wall_clock {
52         uint32_t        version;
53         uint32_t        sec;
54         uint32_t        nsec;
55 };
56
57 struct pvclock {
58         /* Public; initialized by the caller of 'pvclock_init()': */
59         pvclock_get_wallclock_t         *get_wallclock;
60         void                            *get_wallclock_arg;
61         struct pvclock_vcpu_time_info   *timeinfos;
62         bool                             stable_flag_supported;
63
64         /* Private; initialized by the 'pvclock' API: */
65         struct timecounter               tc;
66 };
67
68 /*
69  * NOTE: 'pvclock_get_timecount()' and 'pvclock_get_wallclock()' are purely
70  * transitional; they should be removed after 'dev/xen/timer/timer.c' has been
71  * migrated to the 'struct pvclock' API.
72  */
73 void            pvclock_resume(void);
74 uint64_t        pvclock_tsc_freq(struct pvclock_vcpu_time_info *ti);
75 uint64_t        pvclock_get_timecount(struct pvclock_vcpu_time_info *ti);
76 void            pvclock_get_wallclock(struct pvclock_wall_clock *wc,
77                     struct timespec *ts);
78
79 void            pvclock_init(struct pvclock *pvc, device_t dev,
80                     const char *tc_name, int tc_quality, u_int tc_flags);
81 void            pvclock_gettime(struct pvclock *pvc, struct timespec *ts);
82 int             pvclock_destroy(struct pvclock *pvc);
83
84 #endif