1 /* SPDX-License-Identifier: GPL-2.0 */
3 * Copyright (C) 2012 - 2014 Cisco Systems
4 * Copyright (C) 2000 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
7 #ifndef __TIMER_INTERNAL_H__
8 #define __TIMER_INTERNAL_H__
9 #include <linux/list.h>
11 #include <shared/timetravel.h>
13 #define TIMER_MULTIPLIER 256
14 #define TIMER_MIN_DELTA 500
16 #ifdef CONFIG_UML_TIME_TRAVEL_SUPPORT
17 struct time_travel_event {
18 unsigned long long time;
19 void (*fn)(struct time_travel_event *d);
20 struct list_head list;
21 bool pending, onstack;
24 void time_travel_sleep(void);
27 time_travel_set_event_fn(struct time_travel_event *e,
28 void (*fn)(struct time_travel_event *d))
33 void __time_travel_propagate_time(void);
35 static inline void time_travel_propagate_time(void)
37 if (time_travel_mode == TT_MODE_EXTERNAL)
38 __time_travel_propagate_time();
41 void __time_travel_wait_readable(int fd);
43 static inline void time_travel_wait_readable(int fd)
45 if (time_travel_mode == TT_MODE_EXTERNAL)
46 __time_travel_wait_readable(fd);
49 void time_travel_add_irq_event(struct time_travel_event *e);
50 void time_travel_add_event_rel(struct time_travel_event *e,
51 unsigned long long delay_ns);
52 bool time_travel_del_event(struct time_travel_event *e);
54 struct time_travel_event {
57 static inline void time_travel_sleep(void)
61 /* this is a macro so the event/function need not exist */
62 #define time_travel_set_event_fn(e, fn) do {} while (0)
64 static inline void time_travel_propagate_time(void)
68 static inline void time_travel_wait_readable(int fd)
72 static inline void time_travel_add_irq_event(struct time_travel_event *e)
78 * not inlines so the data structure need not exist,
79 * cause linker failures
81 extern void time_travel_not_configured(void);
82 #define time_travel_add_event_rel(...) time_travel_not_configured()
83 #define time_travel_del_event(...) time_travel_not_configured()
84 #endif /* CONFIG_UML_TIME_TRAVEL_SUPPORT */
87 * Without CONFIG_UML_TIME_TRAVEL_SUPPORT this is a linker error if used,
88 * which is intentional since we really shouldn't link it in that case.
90 void time_travel_ndelay(unsigned long nsec);
91 #endif /* __TIMER_INTERNAL_H__ */