xref: /openbmc/linux/arch/um/kernel/time.c (revision 4ce94eab)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (C) 2015 Anton Ivanov (aivanov@{brocade.com,kot-begemot.co.uk})
4  * Copyright (C) 2015 Thomas Meyer (thomas@m3y3r.de)
5  * Copyright (C) 2012-2014 Cisco Systems
6  * Copyright (C) 2000 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
7  * Copyright (C) 2019 Intel Corporation
8  */
9 
10 #include <linux/clockchips.h>
11 #include <linux/init.h>
12 #include <linux/interrupt.h>
13 #include <linux/jiffies.h>
14 #include <linux/mm.h>
15 #include <linux/sched.h>
16 #include <linux/spinlock.h>
17 #include <linux/threads.h>
18 #include <asm/irq.h>
19 #include <asm/param.h>
20 #include <kern_util.h>
21 #include <os.h>
22 #include <linux/time-internal.h>
23 #include <linux/um_timetravel.h>
24 #include <shared/init.h>
25 
26 #ifdef CONFIG_UML_TIME_TRAVEL_SUPPORT
27 enum time_travel_mode time_travel_mode;
28 EXPORT_SYMBOL_GPL(time_travel_mode);
29 
30 static bool time_travel_start_set;
31 static unsigned long long time_travel_start;
32 static unsigned long long time_travel_time;
33 static LIST_HEAD(time_travel_events);
34 static LIST_HEAD(time_travel_irqs);
35 static unsigned long long time_travel_timer_interval;
36 static unsigned long long time_travel_next_event;
37 static struct time_travel_event time_travel_timer_event;
38 static int time_travel_ext_fd = -1;
39 static unsigned int time_travel_ext_waiting;
40 static bool time_travel_ext_prev_request_valid;
41 static unsigned long long time_travel_ext_prev_request;
42 static bool time_travel_ext_free_until_valid;
43 static unsigned long long time_travel_ext_free_until;
44 
45 static void time_travel_set_time(unsigned long long ns)
46 {
47 	if (unlikely(ns < time_travel_time))
48 		panic("time-travel: time goes backwards %lld -> %lld\n",
49 		      time_travel_time, ns);
50 	else if (unlikely(ns >= S64_MAX))
51 		panic("The system was going to sleep forever, aborting");
52 
53 	time_travel_time = ns;
54 }
55 
56 enum time_travel_message_handling {
57 	TTMH_IDLE,
58 	TTMH_POLL,
59 	TTMH_READ,
60 };
61 
62 static void time_travel_handle_message(struct um_timetravel_msg *msg,
63 				       enum time_travel_message_handling mode)
64 {
65 	struct um_timetravel_msg resp = {
66 		.op = UM_TIMETRAVEL_ACK,
67 	};
68 	int ret;
69 
70 	/*
71 	 * Poll outside the locked section (if we're not called to only read
72 	 * the response) so we can get interrupts for e.g. virtio while we're
73 	 * here, but then we need to lock to not get interrupted between the
74 	 * read of the message and write of the ACK.
75 	 */
76 	if (mode != TTMH_READ) {
77 		bool disabled = irqs_disabled();
78 
79 		BUG_ON(mode == TTMH_IDLE && !disabled);
80 
81 		if (disabled)
82 			local_irq_enable();
83 		while (os_poll(1, &time_travel_ext_fd) != 0) {
84 			/* nothing */
85 		}
86 		if (disabled)
87 			local_irq_disable();
88 	}
89 
90 	ret = os_read_file(time_travel_ext_fd, msg, sizeof(*msg));
91 
92 	if (ret == 0)
93 		panic("time-travel external link is broken\n");
94 	if (ret != sizeof(*msg))
95 		panic("invalid time-travel message - %d bytes\n", ret);
96 
97 	switch (msg->op) {
98 	default:
99 		WARN_ONCE(1, "time-travel: unexpected message %lld\n",
100 			  (unsigned long long)msg->op);
101 		break;
102 	case UM_TIMETRAVEL_ACK:
103 		return;
104 	case UM_TIMETRAVEL_RUN:
105 		time_travel_set_time(msg->time);
106 		break;
107 	case UM_TIMETRAVEL_FREE_UNTIL:
108 		time_travel_ext_free_until_valid = true;
109 		time_travel_ext_free_until = msg->time;
110 		break;
111 	}
112 
113 	resp.seq = msg->seq;
114 	os_write_file(time_travel_ext_fd, &resp, sizeof(resp));
115 }
116 
117 static u64 time_travel_ext_req(u32 op, u64 time)
118 {
119 	static int seq;
120 	int mseq = ++seq;
121 	struct um_timetravel_msg msg = {
122 		.op = op,
123 		.time = time,
124 		.seq = mseq,
125 	};
126 	unsigned long flags;
127 
128 	/*
129 	 * We need to save interrupts here and only restore when we
130 	 * got the ACK - otherwise we can get interrupted and send
131 	 * another request while we're still waiting for an ACK, but
132 	 * the peer doesn't know we got interrupted and will send
133 	 * the ACKs in the same order as the message, but we'd need
134 	 * to see them in the opposite order ...
135 	 *
136 	 * This wouldn't matter *too* much, but some ACKs carry the
137 	 * current time (for UM_TIMETRAVEL_GET) and getting another
138 	 * ACK without a time would confuse us a lot!
139 	 *
140 	 * The sequence number assignment that happens here lets us
141 	 * debug such message handling issues more easily.
142 	 */
143 	local_irq_save(flags);
144 	os_write_file(time_travel_ext_fd, &msg, sizeof(msg));
145 
146 	while (msg.op != UM_TIMETRAVEL_ACK)
147 		time_travel_handle_message(&msg, TTMH_READ);
148 
149 	if (msg.seq != mseq)
150 		panic("time-travel: ACK message has different seqno! op=%d, seq=%d != %d time=%lld\n",
151 		      msg.op, msg.seq, mseq, msg.time);
152 
153 	if (op == UM_TIMETRAVEL_GET)
154 		time_travel_set_time(msg.time);
155 	local_irq_restore(flags);
156 
157 	return msg.time;
158 }
159 
160 void __time_travel_wait_readable(int fd)
161 {
162 	int fds[2] = { fd, time_travel_ext_fd };
163 	int ret;
164 
165 	if (time_travel_mode != TT_MODE_EXTERNAL)
166 		return;
167 
168 	while ((ret = os_poll(2, fds))) {
169 		struct um_timetravel_msg msg;
170 
171 		if (ret == 1)
172 			time_travel_handle_message(&msg, TTMH_READ);
173 	}
174 }
175 EXPORT_SYMBOL_GPL(__time_travel_wait_readable);
176 
177 static void time_travel_ext_update_request(unsigned long long time)
178 {
179 	if (time_travel_mode != TT_MODE_EXTERNAL)
180 		return;
181 
182 	/* asked for exactly this time previously */
183 	if (time_travel_ext_prev_request_valid &&
184 	    time == time_travel_ext_prev_request)
185 		return;
186 
187 	/*
188 	 * if we're running and are allowed to run past the request
189 	 * then we don't need to update it either
190 	 */
191 	if (!time_travel_ext_waiting && time_travel_ext_free_until_valid &&
192 	    time < time_travel_ext_free_until)
193 		return;
194 
195 	time_travel_ext_prev_request = time;
196 	time_travel_ext_prev_request_valid = true;
197 	time_travel_ext_req(UM_TIMETRAVEL_REQUEST, time);
198 }
199 
200 void __time_travel_propagate_time(void)
201 {
202 	static unsigned long long last_propagated;
203 
204 	if (last_propagated == time_travel_time)
205 		return;
206 
207 	time_travel_ext_req(UM_TIMETRAVEL_UPDATE, time_travel_time);
208 	last_propagated = time_travel_time;
209 }
210 EXPORT_SYMBOL_GPL(__time_travel_propagate_time);
211 
212 /* returns true if we must do a wait to the simtime device */
213 static bool time_travel_ext_request(unsigned long long time)
214 {
215 	/*
216 	 * If we received an external sync point ("free until") then we
217 	 * don't have to request/wait for anything until then, unless
218 	 * we're already waiting.
219 	 */
220 	if (!time_travel_ext_waiting && time_travel_ext_free_until_valid &&
221 	    time < time_travel_ext_free_until)
222 		return false;
223 
224 	time_travel_ext_update_request(time);
225 	return true;
226 }
227 
228 static void time_travel_ext_wait(bool idle)
229 {
230 	struct um_timetravel_msg msg = {
231 		.op = UM_TIMETRAVEL_ACK,
232 	};
233 
234 	time_travel_ext_prev_request_valid = false;
235 	time_travel_ext_free_until_valid = false;
236 	time_travel_ext_waiting++;
237 
238 	time_travel_ext_req(UM_TIMETRAVEL_WAIT, -1);
239 
240 	/*
241 	 * Here we are deep in the idle loop, so we have to break out of the
242 	 * kernel abstraction in a sense and implement this in terms of the
243 	 * UML system waiting on the VQ interrupt while sleeping, when we get
244 	 * the signal it'll call time_travel_ext_vq_notify_done() completing the
245 	 * call.
246 	 */
247 	while (msg.op != UM_TIMETRAVEL_RUN)
248 		time_travel_handle_message(&msg, idle ? TTMH_IDLE : TTMH_POLL);
249 
250 	time_travel_ext_waiting--;
251 
252 	/* we might request more stuff while polling - reset when we run */
253 	time_travel_ext_prev_request_valid = false;
254 }
255 
256 static void time_travel_ext_get_time(void)
257 {
258 	time_travel_ext_req(UM_TIMETRAVEL_GET, -1);
259 }
260 
261 static void __time_travel_update_time(unsigned long long ns, bool idle)
262 {
263 	if (time_travel_mode == TT_MODE_EXTERNAL && time_travel_ext_request(ns))
264 		time_travel_ext_wait(idle);
265 	else
266 		time_travel_set_time(ns);
267 }
268 
269 static struct time_travel_event *time_travel_first_event(void)
270 {
271 	return list_first_entry_or_null(&time_travel_events,
272 					struct time_travel_event,
273 					list);
274 }
275 
276 static void __time_travel_add_event(struct time_travel_event *e,
277 				    unsigned long long time)
278 {
279 	struct time_travel_event *tmp;
280 	bool inserted = false;
281 	unsigned long flags;
282 
283 	if (e->pending)
284 		return;
285 
286 	e->pending = true;
287 	e->time = time;
288 
289 	local_irq_save(flags);
290 	list_for_each_entry(tmp, &time_travel_events, list) {
291 		/*
292 		 * Add the new entry before one with higher time,
293 		 * or if they're equal and both on stack, because
294 		 * in that case we need to unwind the stack in the
295 		 * right order, and the later event (timer sleep
296 		 * or such) must be dequeued first.
297 		 */
298 		if ((tmp->time > e->time) ||
299 		    (tmp->time == e->time && tmp->onstack && e->onstack)) {
300 			list_add_tail(&e->list, &tmp->list);
301 			inserted = true;
302 			break;
303 		}
304 	}
305 
306 	if (!inserted)
307 		list_add_tail(&e->list, &time_travel_events);
308 
309 	tmp = time_travel_first_event();
310 	time_travel_ext_update_request(tmp->time);
311 	time_travel_next_event = tmp->time;
312 	local_irq_restore(flags);
313 }
314 
315 static void time_travel_add_event(struct time_travel_event *e,
316 				  unsigned long long time)
317 {
318 	if (WARN_ON(!e->fn))
319 		return;
320 
321 	__time_travel_add_event(e, time);
322 }
323 
324 void time_travel_add_event_rel(struct time_travel_event *e,
325 			       unsigned long long delay_ns)
326 {
327 	time_travel_add_event(e, time_travel_time + delay_ns);
328 }
329 
330 void time_travel_periodic_timer(struct time_travel_event *e)
331 {
332 	time_travel_add_event(&time_travel_timer_event,
333 			      time_travel_time + time_travel_timer_interval);
334 	deliver_alarm();
335 }
336 
337 void deliver_time_travel_irqs(void)
338 {
339 	struct time_travel_event *e;
340 	unsigned long flags;
341 
342 	/*
343 	 * Don't do anything for most cases. Note that because here we have
344 	 * to disable IRQs (and re-enable later) we'll actually recurse at
345 	 * the end of the function, so this is strictly necessary.
346 	 */
347 	if (likely(list_empty(&time_travel_irqs)))
348 		return;
349 
350 	local_irq_save(flags);
351 	irq_enter();
352 	while ((e = list_first_entry_or_null(&time_travel_irqs,
353 					     struct time_travel_event,
354 					     list))) {
355 		WARN(e->time != time_travel_time,
356 		     "time moved from %lld to %lld before IRQ delivery\n",
357 		     time_travel_time, e->time);
358 		list_del(&e->list);
359 		e->pending = false;
360 		e->fn(e);
361 	}
362 	irq_exit();
363 	local_irq_restore(flags);
364 }
365 
366 static void time_travel_deliver_event(struct time_travel_event *e)
367 {
368 	if (e == &time_travel_timer_event) {
369 		/*
370 		 * deliver_alarm() does the irq_enter/irq_exit
371 		 * by itself, so must handle it specially here
372 		 */
373 		e->fn(e);
374 	} else if (irqs_disabled()) {
375 		list_add_tail(&e->list, &time_travel_irqs);
376 		/*
377 		 * set pending again, it was set to false when the
378 		 * event was deleted from the original list, but
379 		 * now it's still pending until we deliver the IRQ.
380 		 */
381 		e->pending = true;
382 	} else {
383 		unsigned long flags;
384 
385 		local_irq_save(flags);
386 		irq_enter();
387 		e->fn(e);
388 		irq_exit();
389 		local_irq_restore(flags);
390 	}
391 }
392 
393 bool time_travel_del_event(struct time_travel_event *e)
394 {
395 	unsigned long flags;
396 
397 	if (!e->pending)
398 		return false;
399 	local_irq_save(flags);
400 	list_del(&e->list);
401 	e->pending = false;
402 	local_irq_restore(flags);
403 	return true;
404 }
405 
406 static void time_travel_update_time(unsigned long long next, bool idle)
407 {
408 	struct time_travel_event ne = {
409 		.onstack = true,
410 	};
411 	struct time_travel_event *e;
412 	bool finished = idle;
413 
414 	/* add it without a handler - we deal with that specifically below */
415 	__time_travel_add_event(&ne, next);
416 
417 	do {
418 		e = time_travel_first_event();
419 
420 		BUG_ON(!e);
421 		__time_travel_update_time(e->time, idle);
422 
423 		/* new events may have been inserted while we were waiting */
424 		if (e == time_travel_first_event()) {
425 			BUG_ON(!time_travel_del_event(e));
426 			BUG_ON(time_travel_time != e->time);
427 
428 			if (e == &ne) {
429 				finished = true;
430 			} else {
431 				if (e->onstack)
432 					panic("On-stack event dequeued outside of the stack! time=%lld, event time=%lld, event=%pS\n",
433 					      time_travel_time, e->time, e);
434 				time_travel_deliver_event(e);
435 			}
436 		}
437 
438 		e = time_travel_first_event();
439 		if (e)
440 			time_travel_ext_update_request(e->time);
441 	} while (ne.pending && !finished);
442 
443 	time_travel_del_event(&ne);
444 }
445 
446 void time_travel_ndelay(unsigned long nsec)
447 {
448 	time_travel_update_time(time_travel_time + nsec, false);
449 }
450 EXPORT_SYMBOL(time_travel_ndelay);
451 
452 void time_travel_add_irq_event(struct time_travel_event *e)
453 {
454 	BUG_ON(time_travel_mode != TT_MODE_EXTERNAL);
455 
456 	time_travel_ext_get_time();
457 	/*
458 	 * We could model interrupt latency here, for now just
459 	 * don't have any latency at all and request the exact
460 	 * same time (again) to run the interrupt...
461 	 */
462 	time_travel_add_event(e, time_travel_time);
463 }
464 EXPORT_SYMBOL_GPL(time_travel_add_irq_event);
465 
466 static void time_travel_oneshot_timer(struct time_travel_event *e)
467 {
468 	deliver_alarm();
469 }
470 
471 void time_travel_sleep(void)
472 {
473 	/*
474 	 * Wait "forever" (using S64_MAX because there are some potential
475 	 * wrapping issues, especially with the current TT_MODE_EXTERNAL
476 	 * controller application.
477 	 */
478 	unsigned long long next = S64_MAX;
479 
480 	if (time_travel_mode == TT_MODE_BASIC)
481 		os_timer_disable();
482 
483 	time_travel_update_time(next, true);
484 
485 	if (time_travel_mode == TT_MODE_BASIC &&
486 	    time_travel_timer_event.pending) {
487 		if (time_travel_timer_event.fn == time_travel_periodic_timer) {
488 			/*
489 			 * This is somewhat wrong - we should get the first
490 			 * one sooner like the os_timer_one_shot() below...
491 			 */
492 			os_timer_set_interval(time_travel_timer_interval);
493 		} else {
494 			os_timer_one_shot(time_travel_timer_event.time - next);
495 		}
496 	}
497 }
498 
499 static void time_travel_handle_real_alarm(void)
500 {
501 	time_travel_set_time(time_travel_next_event);
502 
503 	time_travel_del_event(&time_travel_timer_event);
504 
505 	if (time_travel_timer_event.fn == time_travel_periodic_timer)
506 		time_travel_add_event(&time_travel_timer_event,
507 				      time_travel_time +
508 				      time_travel_timer_interval);
509 }
510 
511 static void time_travel_set_interval(unsigned long long interval)
512 {
513 	time_travel_timer_interval = interval;
514 }
515 
516 static int time_travel_connect_external(const char *socket)
517 {
518 	const char *sep;
519 	unsigned long long id = (unsigned long long)-1;
520 	int rc;
521 
522 	if ((sep = strchr(socket, ':'))) {
523 		char buf[25] = {};
524 		if (sep - socket > sizeof(buf) - 1)
525 			goto invalid_number;
526 
527 		memcpy(buf, socket, sep - socket);
528 		if (kstrtoull(buf, 0, &id)) {
529 invalid_number:
530 			panic("time-travel: invalid external ID in string '%s'\n",
531 			      socket);
532 			return -EINVAL;
533 		}
534 
535 		socket = sep + 1;
536 	}
537 
538 	rc = os_connect_socket(socket);
539 	if (rc < 0) {
540 		panic("time-travel: failed to connect to external socket %s\n",
541 		      socket);
542 		return rc;
543 	}
544 
545 	time_travel_ext_fd = rc;
546 
547 	time_travel_ext_req(UM_TIMETRAVEL_START, id);
548 
549 	return 1;
550 }
551 
552 static void time_travel_set_start(void)
553 {
554 	if (time_travel_start_set)
555 		return;
556 
557 	switch (time_travel_mode) {
558 	case TT_MODE_EXTERNAL:
559 		time_travel_start = time_travel_ext_req(UM_TIMETRAVEL_GET_TOD, -1);
560 		/* controller gave us the *current* time, so adjust by that */
561 		time_travel_ext_get_time();
562 		time_travel_start -= time_travel_time;
563 		break;
564 	case TT_MODE_INFCPU:
565 	case TT_MODE_BASIC:
566 		if (!time_travel_start_set)
567 			time_travel_start = os_persistent_clock_emulation();
568 		break;
569 	case TT_MODE_OFF:
570 		/* we just read the host clock with os_persistent_clock_emulation() */
571 		break;
572 	}
573 
574 	time_travel_start_set = true;
575 }
576 #else /* CONFIG_UML_TIME_TRAVEL_SUPPORT */
577 #define time_travel_start_set 0
578 #define time_travel_start 0
579 #define time_travel_time 0
580 #define time_travel_ext_waiting 0
581 
582 static inline void time_travel_update_time(unsigned long long ns, bool retearly)
583 {
584 }
585 
586 static inline void time_travel_handle_real_alarm(void)
587 {
588 }
589 
590 static void time_travel_set_interval(unsigned long long interval)
591 {
592 }
593 
594 static inline void time_travel_set_start(void)
595 {
596 }
597 
598 /* fail link if this actually gets used */
599 extern u64 time_travel_ext_req(u32 op, u64 time);
600 
601 /* these are empty macros so the struct/fn need not exist */
602 #define time_travel_add_event(e, time) do { } while (0)
603 /* externally not usable - redefine here so we can */
604 #undef time_travel_del_event
605 #define time_travel_del_event(e) do { } while (0)
606 #endif
607 
608 void timer_handler(int sig, struct siginfo *unused_si, struct uml_pt_regs *regs)
609 {
610 	unsigned long flags;
611 
612 	/*
613 	 * In basic time-travel mode we still get real interrupts
614 	 * (signals) but since we don't read time from the OS, we
615 	 * must update the simulated time here to the expiry when
616 	 * we get a signal.
617 	 * This is not the case in inf-cpu mode, since there we
618 	 * never get any real signals from the OS.
619 	 */
620 	if (time_travel_mode == TT_MODE_BASIC)
621 		time_travel_handle_real_alarm();
622 
623 	local_irq_save(flags);
624 	do_IRQ(TIMER_IRQ, regs);
625 	local_irq_restore(flags);
626 }
627 
628 static int itimer_shutdown(struct clock_event_device *evt)
629 {
630 	if (time_travel_mode != TT_MODE_OFF)
631 		time_travel_del_event(&time_travel_timer_event);
632 
633 	if (time_travel_mode != TT_MODE_INFCPU &&
634 	    time_travel_mode != TT_MODE_EXTERNAL)
635 		os_timer_disable();
636 
637 	return 0;
638 }
639 
640 static int itimer_set_periodic(struct clock_event_device *evt)
641 {
642 	unsigned long long interval = NSEC_PER_SEC / HZ;
643 
644 	if (time_travel_mode != TT_MODE_OFF) {
645 		time_travel_del_event(&time_travel_timer_event);
646 		time_travel_set_event_fn(&time_travel_timer_event,
647 					 time_travel_periodic_timer);
648 		time_travel_set_interval(interval);
649 		time_travel_add_event(&time_travel_timer_event,
650 				      time_travel_time + interval);
651 	}
652 
653 	if (time_travel_mode != TT_MODE_INFCPU &&
654 	    time_travel_mode != TT_MODE_EXTERNAL)
655 		os_timer_set_interval(interval);
656 
657 	return 0;
658 }
659 
660 static int itimer_next_event(unsigned long delta,
661 			     struct clock_event_device *evt)
662 {
663 	delta += 1;
664 
665 	if (time_travel_mode != TT_MODE_OFF) {
666 		time_travel_del_event(&time_travel_timer_event);
667 		time_travel_set_event_fn(&time_travel_timer_event,
668 					 time_travel_oneshot_timer);
669 		time_travel_add_event(&time_travel_timer_event,
670 				      time_travel_time + delta);
671 	}
672 
673 	if (time_travel_mode != TT_MODE_INFCPU &&
674 	    time_travel_mode != TT_MODE_EXTERNAL)
675 		return os_timer_one_shot(delta);
676 
677 	return 0;
678 }
679 
680 static int itimer_one_shot(struct clock_event_device *evt)
681 {
682 	return itimer_next_event(0, evt);
683 }
684 
685 static struct clock_event_device timer_clockevent = {
686 	.name			= "posix-timer",
687 	.rating			= 250,
688 	.cpumask		= cpu_possible_mask,
689 	.features		= CLOCK_EVT_FEAT_PERIODIC |
690 				  CLOCK_EVT_FEAT_ONESHOT,
691 	.set_state_shutdown	= itimer_shutdown,
692 	.set_state_periodic	= itimer_set_periodic,
693 	.set_state_oneshot	= itimer_one_shot,
694 	.set_next_event		= itimer_next_event,
695 	.shift			= 0,
696 	.max_delta_ns		= 0xffffffff,
697 	.max_delta_ticks	= 0xffffffff,
698 	.min_delta_ns		= TIMER_MIN_DELTA,
699 	.min_delta_ticks	= TIMER_MIN_DELTA, // microsecond resolution should be enough for anyone, same as 640K RAM
700 	.irq			= 0,
701 	.mult			= 1,
702 };
703 
704 static irqreturn_t um_timer(int irq, void *dev)
705 {
706 	if (get_current()->mm != NULL)
707 	{
708         /* userspace - relay signal, results in correct userspace timers */
709 		os_alarm_process(get_current()->mm->context.id.u.pid);
710 	}
711 
712 	(*timer_clockevent.event_handler)(&timer_clockevent);
713 
714 	return IRQ_HANDLED;
715 }
716 
717 static u64 timer_read(struct clocksource *cs)
718 {
719 	if (time_travel_mode != TT_MODE_OFF) {
720 		/*
721 		 * We make reading the timer cost a bit so that we don't get
722 		 * stuck in loops that expect time to move more than the
723 		 * exact requested sleep amount, e.g. python's socket server,
724 		 * see https://bugs.python.org/issue37026.
725 		 *
726 		 * However, don't do that when we're in interrupt or such as
727 		 * then we might recurse into our own processing, and get to
728 		 * even more waiting, and that's not good - it messes up the
729 		 * "what do I do next" and onstack event we use to know when
730 		 * to return from time_travel_update_time().
731 		 */
732 		if (!irqs_disabled() && !in_interrupt() && !in_softirq() &&
733 		    !time_travel_ext_waiting)
734 			time_travel_update_time(time_travel_time +
735 						TIMER_MULTIPLIER,
736 						false);
737 		return time_travel_time / TIMER_MULTIPLIER;
738 	}
739 
740 	return os_nsecs() / TIMER_MULTIPLIER;
741 }
742 
743 static struct clocksource timer_clocksource = {
744 	.name		= "timer",
745 	.rating		= 300,
746 	.read		= timer_read,
747 	.mask		= CLOCKSOURCE_MASK(64),
748 	.flags		= CLOCK_SOURCE_IS_CONTINUOUS,
749 };
750 
751 static void __init um_timer_setup(void)
752 {
753 	int err;
754 
755 	err = request_irq(TIMER_IRQ, um_timer, IRQF_TIMER, "hr timer", NULL);
756 	if (err != 0)
757 		printk(KERN_ERR "register_timer : request_irq failed - "
758 		       "errno = %d\n", -err);
759 
760 	err = os_timer_create();
761 	if (err != 0) {
762 		printk(KERN_ERR "creation of timer failed - errno = %d\n", -err);
763 		return;
764 	}
765 
766 	err = clocksource_register_hz(&timer_clocksource, NSEC_PER_SEC/TIMER_MULTIPLIER);
767 	if (err) {
768 		printk(KERN_ERR "clocksource_register_hz returned %d\n", err);
769 		return;
770 	}
771 	clockevents_register_device(&timer_clockevent);
772 }
773 
774 void read_persistent_clock64(struct timespec64 *ts)
775 {
776 	long long nsecs;
777 
778 	time_travel_set_start();
779 
780 	if (time_travel_mode != TT_MODE_OFF)
781 		nsecs = time_travel_start + time_travel_time;
782 	else
783 		nsecs = os_persistent_clock_emulation();
784 
785 	set_normalized_timespec64(ts, nsecs / NSEC_PER_SEC,
786 				  nsecs % NSEC_PER_SEC);
787 }
788 
789 void __init time_init(void)
790 {
791 	timer_set_signal_handler();
792 	late_time_init = um_timer_setup;
793 }
794 
795 #ifdef CONFIG_UML_TIME_TRAVEL_SUPPORT
796 unsigned long calibrate_delay_is_known(void)
797 {
798 	if (time_travel_mode == TT_MODE_INFCPU ||
799 	    time_travel_mode == TT_MODE_EXTERNAL)
800 		return 1;
801 	return 0;
802 }
803 
804 int setup_time_travel(char *str)
805 {
806 	if (strcmp(str, "=inf-cpu") == 0) {
807 		time_travel_mode = TT_MODE_INFCPU;
808 		timer_clockevent.name = "time-travel-timer-infcpu";
809 		timer_clocksource.name = "time-travel-clock";
810 		return 1;
811 	}
812 
813 	if (strncmp(str, "=ext:", 5) == 0) {
814 		time_travel_mode = TT_MODE_EXTERNAL;
815 		timer_clockevent.name = "time-travel-timer-external";
816 		timer_clocksource.name = "time-travel-clock-external";
817 		return time_travel_connect_external(str + 5);
818 	}
819 
820 	if (!*str) {
821 		time_travel_mode = TT_MODE_BASIC;
822 		timer_clockevent.name = "time-travel-timer";
823 		timer_clocksource.name = "time-travel-clock";
824 		return 1;
825 	}
826 
827 	return -EINVAL;
828 }
829 
830 __setup("time-travel", setup_time_travel);
831 __uml_help(setup_time_travel,
832 "time-travel\n"
833 "This option just enables basic time travel mode, in which the clock/timers\n"
834 "inside the UML instance skip forward when there's nothing to do, rather than\n"
835 "waiting for real time to elapse. However, instance CPU speed is limited by\n"
836 "the real CPU speed, so e.g. a 10ms timer will always fire after ~10ms wall\n"
837 "clock (but quicker when there's nothing to do).\n"
838 "\n"
839 "time-travel=inf-cpu\n"
840 "This enables time travel mode with infinite processing power, in which there\n"
841 "are no wall clock timers, and any CPU processing happens - as seen from the\n"
842 "guest - instantly. This can be useful for accurate simulation regardless of\n"
843 "debug overhead, physical CPU speed, etc. but is somewhat dangerous as it can\n"
844 "easily lead to getting stuck (e.g. if anything in the system busy loops).\n"
845 "\n"
846 "time-travel=ext:[ID:]/path/to/socket\n"
847 "This enables time travel mode similar to =inf-cpu, except the system will\n"
848 "use the given socket to coordinate with a central scheduler, in order to\n"
849 "have more than one system simultaneously be on simulated time. The virtio\n"
850 "driver code in UML knows about this so you can also simulate networks and\n"
851 "devices using it, assuming the device has the right capabilities.\n"
852 "The optional ID is a 64-bit integer that's sent to the central scheduler.\n");
853 
854 int setup_time_travel_start(char *str)
855 {
856 	int err;
857 
858 	err = kstrtoull(str, 0, &time_travel_start);
859 	if (err)
860 		return err;
861 
862 	time_travel_start_set = 1;
863 	return 1;
864 }
865 
866 __setup("time-travel-start", setup_time_travel_start);
867 __uml_help(setup_time_travel_start,
868 "time-travel-start=<seconds>\n"
869 "Configure the UML instance's wall clock to start at this value rather than\n"
870 "the host's wall clock at the time of UML boot.\n");
871 #endif
872