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;
63 #define zero_time ((struct timespec){ .tv_sec = 0, .tv_nsec = 0 }) 69 void clockobj_set_date(
struct clockobj *clkobj, ticks_t ticks);
71 void clockobj_get_date(
struct clockobj *clkobj, ticks_t *pticks);
73 ticks_t clockobj_get_time(
struct clockobj *clkobj);
75 void clockobj_get_distance(
struct clockobj *clkobj,
76 const struct itimerspec *itm,
77 struct timespec *delta);
79 ticks_t clockobj_get_tsc(
void);
81 void clockobj_caltime_to_timeout(
struct clockobj *clkobj,
const struct tm *tm,
82 unsigned long rticks,
struct timespec *ts);
84 void clockobj_caltime_to_ticks(
struct clockobj *clkobj,
const struct tm *tm,
85 unsigned long rticks, ticks_t *pticks);
87 void clockobj_ticks_to_caltime(
struct clockobj *clkobj,
90 unsigned long *rticks);
92 void clockobj_convert_clocks(
struct clockobj *clkobj,
93 const struct timespec *in,
95 struct timespec *out);
97 int clockobj_set_resolution(
struct clockobj *clkobj,
98 unsigned int resolution_ns);
100 int clockobj_init(
struct clockobj *clkobj,
101 unsigned int resolution_ns);
103 int clockobj_destroy(
struct clockobj *clkobj);
105 #ifndef CONFIG_XENO_LORES_CLOCK_DISABLED 107 void __clockobj_ticks_to_timeout(
struct clockobj *clkobj, clockid_t clk_id,
108 ticks_t ticks,
struct timespec *ts);
110 void __clockobj_ticks_to_timespec(
struct clockobj *clkobj,
111 ticks_t ticks,
struct timespec *ts);
118 #ifdef CONFIG_XENO_COBALT 120 #include <cobalt/ticks.h> 130 static inline sticks_t clockobj_ns_to_tsc(sticks_t ns)
132 return cobalt_ns_to_ticks(ns);
135 static inline sticks_t clockobj_tsc_to_ns(sticks_t tsc)
137 return cobalt_ticks_to_ns(tsc);
141 void clockobj_ns_to_timespec(ticks_t ns,
struct timespec *ts)
145 ts->tv_sec = cobalt_divrem_billion(ns, &rem);
151 static inline sticks_t clockobj_ns_to_tsc(sticks_t ns)
156 static inline sticks_t clockobj_tsc_to_ns(sticks_t tsc)
162 void clockobj_ns_to_timespec(ticks_t ns,
struct timespec *ts)
164 ts->tv_sec = ns / 1000000000ULL;
165 ts->tv_nsec = ns - (ts->tv_sec * 1000000000ULL);
170 #ifdef CONFIG_XENO_LORES_CLOCK_DISABLED 173 void __clockobj_ticks_to_timeout(
struct clockobj *clkobj,
175 ticks_t ticks,
struct timespec *ts)
177 struct timespec now, delta;
180 clockobj_ns_to_timespec(ticks, &delta);
181 timespec_add(ts, &now, &delta);
185 void __clockobj_ticks_to_timespec(
struct clockobj *clkobj,
186 ticks_t ticks,
struct timespec *ts)
188 clockobj_ns_to_timespec(ticks, ts);
192 void clockobj_ticks_to_timespec(
struct clockobj *clkobj,
193 ticks_t ticks,
struct timespec *ts)
195 __clockobj_ticks_to_timespec(clkobj, ticks, ts);
199 unsigned int clockobj_get_resolution(
struct clockobj *clkobj)
205 unsigned int clockobj_get_frequency(
struct clockobj *clkobj)
210 static inline sticks_t clockobj_ns_to_ticks(
struct clockobj *clkobj,
216 static inline sticks_t clockobj_ticks_to_ns(
struct clockobj *clkobj,
225 void clockobj_ticks_to_timespec(
struct clockobj *clkobj,
226 ticks_t ticks,
struct timespec *ts)
228 __clockobj_ticks_to_timespec(clkobj, ticks, ts);
232 unsigned int clockobj_get_resolution(
struct clockobj *clkobj)
234 return clkobj->resolution;
238 unsigned int clockobj_get_frequency(
struct clockobj *clkobj)
240 return clkobj->frequency;
243 sticks_t clockobj_ns_to_ticks(
struct clockobj *clkobj,
246 static inline sticks_t clockobj_ticks_to_ns(
struct clockobj *clkobj,
249 return ticks * clkobj->resolution;
255 void clockobj_ticks_to_timeout(
struct clockobj *clkobj,
256 ticks_t ticks,
struct timespec *ts)
258 __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:181