19 #ifndef _COPPERPLATE_CLOCKOBJ_H
20 #define _COPPERPLATE_CLOCKOBJ_H
23 #include <xeno_config.h>
24 #include <boilerplate/time.h>
25 #include <boilerplate/list.h>
26 #include <boilerplate/lock.h>
27 #include <boilerplate/limits.h>
28 #include <copperplate/debug.h>
43 #ifndef CONFIG_XENO_COPPERPLATE_CLOCK_RESTRICTED
44 #ifdef CONFIG_XENO_RAW_CLOCK_ENABLED
45 #define CLOCK_COPPERPLATE CLOCK_MONOTONIC_RAW
47 #define CLOCK_COPPERPLATE CLOCK_MONOTONIC
50 #define CLOCK_COPPERPLATE CLOCK_REALTIME
55 struct timespec epoch;
56 struct timespec offset;
57 #ifndef CONFIG_XENO_LORES_CLOCK_DISABLED
58 unsigned int resolution;
59 unsigned int frequency;
64 #define zero_time ((struct timespec){ .tv_sec = 0, .tv_nsec = 0 })
70 void clockobj_set_date(
struct clockobj *clkobj, ticks_t ticks);
72 void clockobj_get_date(
struct clockobj *clkobj, ticks_t *pticks);
74 ticks_t clockobj_get_time(
struct clockobj *clkobj);
76 void clockobj_get_distance(
struct clockobj *clkobj,
77 const struct itimerspec *itm,
78 struct timespec *delta);
80 ticks_t clockobj_get_tsc(
void);
82 void clockobj_caltime_to_timeout(
struct clockobj *clkobj,
const struct tm *tm,
83 unsigned long rticks,
struct timespec *ts);
85 void clockobj_caltime_to_ticks(
struct clockobj *clkobj,
const struct tm *tm,
86 unsigned long rticks, ticks_t *pticks);
88 void clockobj_ticks_to_caltime(
struct clockobj *clkobj,
91 unsigned long *rticks);
93 void clockobj_convert_clocks(
struct clockobj *clkobj,
94 const struct timespec *in,
96 struct timespec *out);
98 int clockobj_set_resolution(
struct clockobj *clkobj,
99 unsigned int resolution_ns);
101 int clockobj_init(
struct clockobj *clkobj,
102 const char *name,
unsigned int resolution_ns);
104 int clockobj_destroy(
struct clockobj *clkobj);
110 #ifdef CONFIG_XENO_COBALT
112 #include <cobalt/ticks.h>
122 static inline sticks_t clockobj_ns_to_tsc(sticks_t ns)
124 return cobalt_ns_to_ticks(ns);
127 static inline sticks_t clockobj_tsc_to_ns(sticks_t tsc)
129 return cobalt_ticks_to_ns(tsc);
133 void clockobj_ns_to_timespec(ticks_t ns,
struct timespec *ts)
137 ts->tv_sec = cobalt_divrem_billion(ns, &rem);
143 static inline sticks_t clockobj_ns_to_tsc(sticks_t ns)
148 static inline sticks_t clockobj_tsc_to_ns(sticks_t tsc)
154 void clockobj_ns_to_timespec(ticks_t ns,
struct timespec *ts)
156 ts->tv_sec = ns / 1000000000ULL;
157 ts->tv_nsec = ns - (ts->tv_sec * 1000000000ULL);
162 #ifdef CONFIG_XENO_LORES_CLOCK_DISABLED
165 void __clockobj_ticks_to_timeout(
struct clockobj *clkobj,
167 ticks_t ticks,
struct timespec *ts)
169 struct timespec now, delta;
172 clockobj_ns_to_timespec(ticks, &delta);
173 timespec_add(ts, &now, &delta);
177 void __clockobj_ticks_to_timespec(
struct clockobj *clkobj,
178 ticks_t ticks,
struct timespec *ts)
180 clockobj_ns_to_timespec(ticks, ts);
184 void clockobj_ticks_to_timespec(
struct clockobj *clkobj,
185 ticks_t ticks,
struct timespec *ts)
187 __clockobj_ticks_to_timespec(clkobj, ticks, ts);
191 unsigned int clockobj_get_resolution(
struct clockobj *clkobj)
197 unsigned int clockobj_get_frequency(
struct clockobj *clkobj)
202 static inline sticks_t clockobj_ns_to_ticks(
struct clockobj *clkobj,
208 static inline sticks_t clockobj_ticks_to_ns(
struct clockobj *clkobj,
216 void __clockobj_ticks_to_timeout(
struct clockobj *clkobj, clockid_t clk_id,
217 ticks_t ticks,
struct timespec *ts);
219 void __clockobj_ticks_to_timespec(
struct clockobj *clkobj,
220 ticks_t ticks,
struct timespec *ts);
223 void clockobj_ticks_to_timespec(
struct clockobj *clkobj,
224 ticks_t ticks,
struct timespec *ts)
226 __clockobj_ticks_to_timespec(clkobj, ticks, ts);
230 unsigned int clockobj_get_resolution(
struct clockobj *clkobj)
232 return clkobj->resolution;
236 unsigned int clockobj_get_frequency(
struct clockobj *clkobj)
238 return clkobj->frequency;
241 sticks_t clockobj_ns_to_ticks(
struct clockobj *clkobj,
244 static inline sticks_t clockobj_ticks_to_ns(
struct clockobj *clkobj,
247 return ticks * clkobj->resolution;
253 void clockobj_ticks_to_timeout(
struct clockobj *clkobj,
254 ticks_t ticks,
struct timespec *ts)
256 __clockobj_ticks_to_timeout(clkobj, CLOCK_COPPERPLATE, ticks, ts);
int clock_gettime(clockid_t clock_id, struct timespec *tp)
Read the specified clock.
Definition: clock.c:179