xref: /linux/arch/um/kernel/time.c (revision 5d7f3375cd574fc83f0cd30839b21455c0e79ae2)
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 <skas.h>
23 #include <linux/delay.h>
24 #include <linux/time-internal.h>
25 #include <linux/um_timetravel.h>
26 #include <shared/init.h>
27 
28 #ifdef CONFIG_UML_TIME_TRAVEL_SUPPORT
29 #include <linux/sched/clock.h>
30 
31 enum time_travel_mode time_travel_mode;
32 EXPORT_SYMBOL_GPL(time_travel_mode);
33 
34 static bool time_travel_start_set;
35 static unsigned long long time_travel_start;
36 static unsigned long long time_travel_time;
37 static unsigned long long time_travel_shm_offset;
38 static LIST_HEAD(time_travel_events);
39 static LIST_HEAD(time_travel_irqs);
40 static unsigned long long time_travel_timer_interval;
41 static unsigned long long time_travel_next_event;
42 static struct time_travel_event time_travel_timer_event;
43 static int time_travel_ext_fd = -1;
44 static unsigned int time_travel_ext_waiting;
45 static bool time_travel_ext_prev_request_valid;
46 static unsigned long long time_travel_ext_prev_request;
47 static unsigned long long *time_travel_ext_free_until;
48 static unsigned long long _time_travel_ext_free_until;
49 static u16 time_travel_shm_id;
50 static struct um_timetravel_schedshm *time_travel_shm;
51 static union um_timetravel_schedshm_client *time_travel_shm_client;
52 
53 unsigned long tt_extra_sched_jiffies;
54 
55 notrace unsigned long long sched_clock(void)
56 {
57 	return (unsigned long long)(jiffies - INITIAL_JIFFIES +
58 				    tt_extra_sched_jiffies)
59 					* (NSEC_PER_SEC / HZ);
60 }
61 
62 static void time_travel_set_time(unsigned long long ns)
63 {
64 	if (unlikely(ns < time_travel_time))
65 		panic("time-travel: time goes backwards %lld -> %lld\n",
66 		      time_travel_time, ns);
67 	else if (unlikely(ns >= S64_MAX))
68 		panic("The system was going to sleep forever, aborting");
69 
70 	time_travel_time = ns;
71 }
72 
73 enum time_travel_message_handling {
74 	TTMH_IDLE,
75 	TTMH_POLL,
76 	TTMH_READ,
77 	TTMH_READ_START_ACK,
78 };
79 
80 static u64 bc_message;
81 int time_travel_should_print_bc_msg;
82 
83 void _time_travel_print_bc_msg(void)
84 {
85 	time_travel_should_print_bc_msg = 0;
86 	printk(KERN_INFO "time-travel: received broadcast 0x%llx\n", bc_message);
87 }
88 
89 static void time_travel_setup_shm(int fd, u16 id)
90 {
91 	u32 len;
92 
93 	time_travel_shm = os_mmap_rw_shared(fd, sizeof(*time_travel_shm));
94 
95 	if (!time_travel_shm)
96 		goto out;
97 
98 	len = time_travel_shm->len;
99 
100 	if (time_travel_shm->version != UM_TIMETRAVEL_SCHEDSHM_VERSION ||
101 	    len < struct_size(time_travel_shm, clients, id + 1)) {
102 		os_unmap_memory(time_travel_shm, sizeof(*time_travel_shm));
103 		time_travel_shm = NULL;
104 		goto out;
105 	}
106 
107 	time_travel_shm = os_mremap_rw_shared(time_travel_shm,
108 					      sizeof(*time_travel_shm),
109 					      len);
110 	if (!time_travel_shm)
111 		goto out;
112 
113 	time_travel_shm_offset = time_travel_shm->current_time;
114 	time_travel_shm_client = &time_travel_shm->clients[id];
115 	time_travel_shm_client->capa |= UM_TIMETRAVEL_SCHEDSHM_CAP_TIME_SHARE;
116 	time_travel_shm_id = id;
117 	/* always look at that free_until from now on */
118 	time_travel_ext_free_until = &time_travel_shm->free_until;
119 out:
120 	os_close_file(fd);
121 }
122 
123 static void time_travel_handle_message(struct um_timetravel_msg *msg,
124 				       enum time_travel_message_handling mode)
125 {
126 	struct um_timetravel_msg resp = {
127 		.op = UM_TIMETRAVEL_ACK,
128 	};
129 	int ret;
130 
131 	/*
132 	 * We can't unlock here, but interrupt signals with a timetravel_handler
133 	 * (see um_request_irq_tt) get to the timetravel_handler anyway.
134 	 */
135 	if (mode != TTMH_READ) {
136 		BUG_ON(mode == TTMH_IDLE && !irqs_disabled());
137 
138 		while (os_poll(1, &time_travel_ext_fd) != 0) {
139 			/* nothing */
140 		}
141 	}
142 
143 	if (unlikely(mode == TTMH_READ_START_ACK)) {
144 		int fd[UM_TIMETRAVEL_SHARED_MAX_FDS];
145 
146 		ret = os_rcv_fd_msg(time_travel_ext_fd, fd,
147 				    ARRAY_SIZE(fd), msg, sizeof(*msg));
148 		if (ret == sizeof(*msg)) {
149 			time_travel_setup_shm(fd[UM_TIMETRAVEL_SHARED_MEMFD],
150 					      msg->time & UM_TIMETRAVEL_START_ACK_ID);
151 			/* we don't use the logging for now */
152 			os_close_file(fd[UM_TIMETRAVEL_SHARED_LOGFD]);
153 		}
154 	} else {
155 		ret = os_read_file(time_travel_ext_fd, msg, sizeof(*msg));
156 	}
157 
158 	if (ret == 0)
159 		panic("time-travel external link is broken\n");
160 	if (ret != sizeof(*msg))
161 		panic("invalid time-travel message - %d bytes\n", ret);
162 
163 	switch (msg->op) {
164 	default:
165 		WARN_ONCE(1, "time-travel: unexpected message %lld\n",
166 			  (unsigned long long)msg->op);
167 		break;
168 	case UM_TIMETRAVEL_ACK:
169 		return;
170 	case UM_TIMETRAVEL_RUN:
171 		time_travel_set_time(msg->time);
172 		if (time_travel_shm) {
173 			/* no request right now since we're running */
174 			time_travel_shm_client->flags &=
175 				~UM_TIMETRAVEL_SCHEDSHM_FLAGS_REQ_RUN;
176 			/* no ack for shared memory RUN */
177 			return;
178 		}
179 		break;
180 	case UM_TIMETRAVEL_FREE_UNTIL:
181 		/* not supposed to get this with shm, but ignore it */
182 		if (time_travel_shm)
183 			break;
184 		time_travel_ext_free_until = &_time_travel_ext_free_until;
185 		_time_travel_ext_free_until = msg->time;
186 		break;
187 	case UM_TIMETRAVEL_BROADCAST:
188 		bc_message = msg->time;
189 		time_travel_should_print_bc_msg = 1;
190 		break;
191 	}
192 
193 	resp.seq = msg->seq;
194 	os_write_file(time_travel_ext_fd, &resp, sizeof(resp));
195 }
196 
197 static u64 time_travel_ext_req(u32 op, u64 time)
198 {
199 	static int seq;
200 	int mseq = ++seq;
201 	struct um_timetravel_msg msg = {
202 		.op = op,
203 		.time = time,
204 		.seq = mseq,
205 	};
206 
207 	/*
208 	 * We need to block even the timetravel handlers of SIGIO here and
209 	 * only restore their use when we got the ACK - otherwise we may
210 	 * (will) get interrupted by that, try to queue the IRQ for future
211 	 * processing and thus send another request while we're still waiting
212 	 * for an ACK, but the peer doesn't know we got interrupted and will
213 	 * send the ACKs in the same order as the message, but we'd need to
214 	 * see them in the opposite order ...
215 	 *
216 	 * This wouldn't matter *too* much, but some ACKs carry the
217 	 * current time (for UM_TIMETRAVEL_GET) and getting another
218 	 * ACK without a time would confuse us a lot!
219 	 *
220 	 * The sequence number assignment that happens here lets us
221 	 * debug such message handling issues more easily.
222 	 */
223 	block_signals_hard();
224 	os_write_file(time_travel_ext_fd, &msg, sizeof(msg));
225 
226 	/* no ACK expected for WAIT in shared memory mode */
227 	if (msg.op == UM_TIMETRAVEL_WAIT && time_travel_shm)
228 		goto done;
229 
230 	while (msg.op != UM_TIMETRAVEL_ACK)
231 		time_travel_handle_message(&msg,
232 					   op == UM_TIMETRAVEL_START ?
233 						TTMH_READ_START_ACK :
234 						TTMH_READ);
235 
236 	if (msg.seq != mseq)
237 		panic("time-travel: ACK message has different seqno! op=%d, seq=%d != %d time=%lld\n",
238 		      msg.op, msg.seq, mseq, msg.time);
239 
240 	if (op == UM_TIMETRAVEL_GET)
241 		time_travel_set_time(msg.time);
242 done:
243 	unblock_signals_hard();
244 
245 	return msg.time;
246 }
247 
248 void __time_travel_wait_readable(int fd)
249 {
250 	int fds[2] = { fd, time_travel_ext_fd };
251 	int ret;
252 
253 	if (time_travel_mode != TT_MODE_EXTERNAL)
254 		return;
255 
256 	while ((ret = os_poll(2, fds))) {
257 		struct um_timetravel_msg msg;
258 
259 		if (ret == 1)
260 			time_travel_handle_message(&msg, TTMH_READ);
261 	}
262 }
263 EXPORT_SYMBOL_GPL(__time_travel_wait_readable);
264 
265 static void time_travel_ext_update_request(unsigned long long time)
266 {
267 	if (time_travel_mode != TT_MODE_EXTERNAL)
268 		return;
269 
270 	/* asked for exactly this time previously */
271 	if (time_travel_ext_prev_request_valid &&
272 	    time == time_travel_ext_prev_request)
273 		return;
274 
275 	/*
276 	 * if we're running and are allowed to run past the request
277 	 * then we don't need to update it either
278 	 *
279 	 * Note for shm we ignore FREE_UNTIL messages and leave the pointer
280 	 * to shared memory, and for non-shm the offset is 0.
281 	 */
282 	if (!time_travel_ext_waiting && time_travel_ext_free_until &&
283 	    time < (*time_travel_ext_free_until - time_travel_shm_offset))
284 		return;
285 
286 	time_travel_ext_prev_request = time;
287 	time_travel_ext_prev_request_valid = true;
288 
289 	if (time_travel_shm) {
290 		union um_timetravel_schedshm_client *running;
291 
292 		running = &time_travel_shm->clients[time_travel_shm->running_id];
293 
294 		if (running->capa & UM_TIMETRAVEL_SCHEDSHM_CAP_TIME_SHARE) {
295 			time_travel_shm_client->flags |=
296 				UM_TIMETRAVEL_SCHEDSHM_FLAGS_REQ_RUN;
297 			time += time_travel_shm_offset;
298 			time_travel_shm_client->req_time = time;
299 			if (time < time_travel_shm->free_until)
300 				time_travel_shm->free_until = time;
301 			return;
302 		}
303 	}
304 
305 	time_travel_ext_req(UM_TIMETRAVEL_REQUEST, time);
306 }
307 
308 void __time_travel_propagate_time(void)
309 {
310 	static unsigned long long last_propagated;
311 
312 	if (time_travel_shm) {
313 		if (time_travel_shm->running_id != time_travel_shm_id)
314 			panic("time-travel: setting time while not running\n");
315 		time_travel_shm->current_time = time_travel_time +
316 						time_travel_shm_offset;
317 		return;
318 	}
319 
320 	if (last_propagated == time_travel_time)
321 		return;
322 
323 	time_travel_ext_req(UM_TIMETRAVEL_UPDATE, time_travel_time);
324 	last_propagated = time_travel_time;
325 }
326 EXPORT_SYMBOL_GPL(__time_travel_propagate_time);
327 
328 /* returns true if we must do a wait to the simtime device */
329 static bool time_travel_ext_request(unsigned long long time)
330 {
331 	/*
332 	 * If we received an external sync point ("free until") then we
333 	 * don't have to request/wait for anything until then, unless
334 	 * we're already waiting.
335 	 *
336 	 * Note for shm we ignore FREE_UNTIL messages and leave the pointer
337 	 * to shared memory, and for non-shm the offset is 0.
338 	 */
339 	if (!time_travel_ext_waiting && time_travel_ext_free_until &&
340 	    time < (*time_travel_ext_free_until - time_travel_shm_offset))
341 		return false;
342 
343 	time_travel_ext_update_request(time);
344 	return true;
345 }
346 
347 static void time_travel_ext_wait(bool idle)
348 {
349 	struct um_timetravel_msg msg = {
350 		.op = UM_TIMETRAVEL_ACK,
351 	};
352 
353 	time_travel_ext_prev_request_valid = false;
354 	if (!time_travel_shm)
355 		time_travel_ext_free_until = NULL;
356 	time_travel_ext_waiting++;
357 
358 	time_travel_ext_req(UM_TIMETRAVEL_WAIT, -1);
359 
360 	/*
361 	 * Here we are deep in the idle loop, so we have to break out of the
362 	 * kernel abstraction in a sense and implement this in terms of the
363 	 * UML system waiting on the VQ interrupt while sleeping, when we get
364 	 * the signal it'll call time_travel_ext_vq_notify_done() completing the
365 	 * call.
366 	 */
367 	while (msg.op != UM_TIMETRAVEL_RUN)
368 		time_travel_handle_message(&msg, idle ? TTMH_IDLE : TTMH_POLL);
369 
370 	time_travel_ext_waiting--;
371 
372 	/* we might request more stuff while polling - reset when we run */
373 	time_travel_ext_prev_request_valid = false;
374 }
375 
376 static void time_travel_ext_get_time(void)
377 {
378 	if (time_travel_shm)
379 		time_travel_set_time(time_travel_shm->current_time -
380 				     time_travel_shm_offset);
381 	else
382 		time_travel_ext_req(UM_TIMETRAVEL_GET, -1);
383 }
384 
385 static void __time_travel_update_time(unsigned long long ns, bool idle)
386 {
387 	if (time_travel_mode == TT_MODE_EXTERNAL && time_travel_ext_request(ns))
388 		time_travel_ext_wait(idle);
389 	else
390 		time_travel_set_time(ns);
391 }
392 
393 static struct time_travel_event *time_travel_first_event(void)
394 {
395 	return list_first_entry_or_null(&time_travel_events,
396 					struct time_travel_event,
397 					list);
398 }
399 
400 static void __time_travel_add_event(struct time_travel_event *e,
401 				    unsigned long long time)
402 {
403 	struct time_travel_event *tmp;
404 	bool inserted = false;
405 	unsigned long flags;
406 
407 	if (e->pending)
408 		return;
409 
410 	e->pending = true;
411 	e->time = time;
412 
413 	local_irq_save(flags);
414 	list_for_each_entry(tmp, &time_travel_events, list) {
415 		/*
416 		 * Add the new entry before one with higher time,
417 		 * or if they're equal and both on stack, because
418 		 * in that case we need to unwind the stack in the
419 		 * right order, and the later event (timer sleep
420 		 * or such) must be dequeued first.
421 		 */
422 		if ((tmp->time > e->time) ||
423 		    (tmp->time == e->time && tmp->onstack && e->onstack)) {
424 			list_add_tail(&e->list, &tmp->list);
425 			inserted = true;
426 			break;
427 		}
428 	}
429 
430 	if (!inserted)
431 		list_add_tail(&e->list, &time_travel_events);
432 
433 	tmp = time_travel_first_event();
434 	time_travel_ext_update_request(tmp->time);
435 	time_travel_next_event = tmp->time;
436 	local_irq_restore(flags);
437 }
438 
439 static void time_travel_add_event(struct time_travel_event *e,
440 				  unsigned long long time)
441 {
442 	if (WARN_ON(!e->fn))
443 		return;
444 
445 	__time_travel_add_event(e, time);
446 }
447 
448 void time_travel_add_event_rel(struct time_travel_event *e,
449 			       unsigned long long delay_ns)
450 {
451 	time_travel_add_event(e, time_travel_time + delay_ns);
452 }
453 
454 static void time_travel_periodic_timer(struct time_travel_event *e)
455 {
456 	time_travel_add_event(&time_travel_timer_event,
457 			      time_travel_time + time_travel_timer_interval);
458 
459 	/* clock tick; decrease extra jiffies by keeping sched_clock constant */
460 	if (tt_extra_sched_jiffies > 0)
461 		tt_extra_sched_jiffies -= 1;
462 
463 	deliver_alarm();
464 }
465 
466 void deliver_time_travel_irqs(void)
467 {
468 	struct time_travel_event *e;
469 	unsigned long flags;
470 
471 	/*
472 	 * Don't do anything for most cases. Note that because here we have
473 	 * to disable IRQs (and re-enable later) we'll actually recurse at
474 	 * the end of the function, so this is strictly necessary.
475 	 */
476 	if (likely(list_empty(&time_travel_irqs)))
477 		return;
478 
479 	local_irq_save(flags);
480 	irq_enter();
481 	while ((e = list_first_entry_or_null(&time_travel_irqs,
482 					     struct time_travel_event,
483 					     list))) {
484 		list_del(&e->list);
485 		e->pending = false;
486 		e->fn(e);
487 	}
488 	irq_exit();
489 	local_irq_restore(flags);
490 }
491 
492 static void time_travel_deliver_event(struct time_travel_event *e)
493 {
494 	if (e == &time_travel_timer_event) {
495 		/*
496 		 * deliver_alarm() does the irq_enter/irq_exit
497 		 * by itself, so must handle it specially here
498 		 */
499 		e->fn(e);
500 	} else if (irqs_disabled()) {
501 		list_add_tail(&e->list, &time_travel_irqs);
502 		/*
503 		 * set pending again, it was set to false when the
504 		 * event was deleted from the original list, but
505 		 * now it's still pending until we deliver the IRQ.
506 		 */
507 		e->pending = true;
508 	} else {
509 		unsigned long flags;
510 
511 		local_irq_save(flags);
512 		irq_enter();
513 		e->fn(e);
514 		irq_exit();
515 		local_irq_restore(flags);
516 	}
517 }
518 
519 bool time_travel_del_event(struct time_travel_event *e)
520 {
521 	unsigned long flags;
522 
523 	if (!e->pending)
524 		return false;
525 	local_irq_save(flags);
526 	list_del(&e->list);
527 	e->pending = false;
528 	local_irq_restore(flags);
529 	return true;
530 }
531 
532 static void time_travel_update_time(unsigned long long next, bool idle)
533 {
534 	struct time_travel_event ne = {
535 		.onstack = true,
536 	};
537 	struct time_travel_event *e;
538 	bool finished = idle;
539 
540 	/* add it without a handler - we deal with that specifically below */
541 	__time_travel_add_event(&ne, next);
542 
543 	do {
544 		e = time_travel_first_event();
545 
546 		BUG_ON(!e);
547 		__time_travel_update_time(e->time, idle);
548 
549 		/* new events may have been inserted while we were waiting */
550 		if (e == time_travel_first_event()) {
551 			BUG_ON(!time_travel_del_event(e));
552 			BUG_ON(time_travel_time != e->time);
553 
554 			if (e == &ne) {
555 				finished = true;
556 			} else {
557 				if (e->onstack)
558 					panic("On-stack event dequeued outside of the stack! time=%lld, event time=%lld, event=%pS\n",
559 					      time_travel_time, e->time, e);
560 				time_travel_deliver_event(e);
561 			}
562 		}
563 
564 		e = time_travel_first_event();
565 		if (e)
566 			time_travel_ext_update_request(e->time);
567 	} while (ne.pending && !finished);
568 
569 	time_travel_del_event(&ne);
570 }
571 
572 static void time_travel_update_time_rel(unsigned long long offs)
573 {
574 	unsigned long flags;
575 
576 	/*
577 	 * Disable interrupts before calculating the new time so
578 	 * that a real timer interrupt (signal) can't happen at
579 	 * a bad time e.g. after we read time_travel_time but
580 	 * before we've completed updating the time.
581 	 */
582 	local_irq_save(flags);
583 	time_travel_update_time(time_travel_time + offs, false);
584 	local_irq_restore(flags);
585 }
586 
587 void time_travel_ndelay(unsigned long nsec)
588 {
589 	/*
590 	 * Not strictly needed to use _rel() version since this is
591 	 * only used in INFCPU/EXT modes, but it doesn't hurt and
592 	 * is more readable too.
593 	 */
594 	time_travel_update_time_rel(nsec);
595 }
596 EXPORT_SYMBOL(time_travel_ndelay);
597 
598 void time_travel_add_irq_event(struct time_travel_event *e)
599 {
600 	BUG_ON(time_travel_mode != TT_MODE_EXTERNAL);
601 
602 	time_travel_ext_get_time();
603 	/*
604 	 * We could model interrupt latency here, for now just
605 	 * don't have any latency at all and request the exact
606 	 * same time (again) to run the interrupt...
607 	 */
608 	time_travel_add_event(e, time_travel_time);
609 }
610 EXPORT_SYMBOL_GPL(time_travel_add_irq_event);
611 
612 static void time_travel_oneshot_timer(struct time_travel_event *e)
613 {
614 	/* clock tick; decrease extra jiffies by keeping sched_clock constant */
615 	if (tt_extra_sched_jiffies > 0)
616 		tt_extra_sched_jiffies -= 1;
617 
618 	deliver_alarm();
619 }
620 
621 void time_travel_sleep(void)
622 {
623 	/*
624 	 * Wait "forever" (using S64_MAX because there are some potential
625 	 * wrapping issues, especially with the current TT_MODE_EXTERNAL
626 	 * controller application.
627 	 */
628 	unsigned long long next = S64_MAX;
629 	int cpu = raw_smp_processor_id();
630 
631 	if (time_travel_mode == TT_MODE_BASIC)
632 		os_timer_disable(cpu);
633 
634 	time_travel_update_time(next, true);
635 
636 	if (time_travel_mode == TT_MODE_BASIC &&
637 	    time_travel_timer_event.pending) {
638 		if (time_travel_timer_event.fn == time_travel_periodic_timer) {
639 			/*
640 			 * This is somewhat wrong - we should get the first
641 			 * one sooner like the os_timer_one_shot() below...
642 			 */
643 			os_timer_set_interval(cpu, time_travel_timer_interval);
644 		} else {
645 			os_timer_one_shot(cpu, time_travel_timer_event.time - next);
646 		}
647 	}
648 }
649 
650 static void time_travel_handle_real_alarm(void)
651 {
652 	time_travel_set_time(time_travel_next_event);
653 
654 	time_travel_del_event(&time_travel_timer_event);
655 
656 	if (time_travel_timer_event.fn == time_travel_periodic_timer)
657 		time_travel_add_event(&time_travel_timer_event,
658 				      time_travel_time +
659 				      time_travel_timer_interval);
660 }
661 
662 static void time_travel_set_interval(unsigned long long interval)
663 {
664 	time_travel_timer_interval = interval;
665 }
666 
667 static int time_travel_connect_external(const char *socket)
668 {
669 	const char *sep;
670 	unsigned long long id = (unsigned long long)-1;
671 	int rc;
672 
673 	if ((sep = strchr(socket, ':'))) {
674 		char buf[25] = {};
675 		if (sep - socket > sizeof(buf) - 1)
676 			goto invalid_number;
677 
678 		memcpy(buf, socket, sep - socket);
679 		if (kstrtoull(buf, 0, &id)) {
680 invalid_number:
681 			panic("time-travel: invalid external ID in string '%s'\n",
682 			      socket);
683 			return -EINVAL;
684 		}
685 
686 		socket = sep + 1;
687 	}
688 
689 	rc = os_connect_socket(socket);
690 	if (rc < 0) {
691 		panic("time-travel: failed to connect to external socket %s\n",
692 		      socket);
693 		return rc;
694 	}
695 
696 	time_travel_ext_fd = rc;
697 
698 	time_travel_ext_req(UM_TIMETRAVEL_START, id);
699 
700 	return 1;
701 }
702 
703 static void time_travel_set_start(void)
704 {
705 	if (time_travel_start_set)
706 		return;
707 
708 	switch (time_travel_mode) {
709 	case TT_MODE_EXTERNAL:
710 		time_travel_start = time_travel_ext_req(UM_TIMETRAVEL_GET_TOD, -1);
711 		/* controller gave us the *current* time, so adjust by that */
712 		time_travel_ext_get_time();
713 		time_travel_start -= time_travel_time;
714 		break;
715 	case TT_MODE_INFCPU:
716 	case TT_MODE_BASIC:
717 		if (!time_travel_start_set)
718 			time_travel_start = os_persistent_clock_emulation();
719 		break;
720 	case TT_MODE_OFF:
721 		/* we just read the host clock with os_persistent_clock_emulation() */
722 		break;
723 	}
724 
725 	time_travel_start_set = true;
726 }
727 #else /* CONFIG_UML_TIME_TRAVEL_SUPPORT */
728 #define time_travel_start_set 0
729 #define time_travel_start 0
730 #define time_travel_time 0
731 #define time_travel_ext_waiting 0
732 
733 static inline void time_travel_update_time(unsigned long long ns, bool idle)
734 {
735 }
736 
737 static inline void time_travel_update_time_rel(unsigned long long offs)
738 {
739 }
740 
741 static inline void time_travel_handle_real_alarm(void)
742 {
743 }
744 
745 static void time_travel_set_interval(unsigned long long interval)
746 {
747 }
748 
749 static inline void time_travel_set_start(void)
750 {
751 }
752 
753 /* fail link if this actually gets used */
754 extern u64 time_travel_ext_req(u32 op, u64 time);
755 
756 /* these are empty macros so the struct/fn need not exist */
757 #define time_travel_add_event(e, time) do { } while (0)
758 /* externally not usable - redefine here so we can */
759 #undef time_travel_del_event
760 #define time_travel_del_event(e) do { } while (0)
761 #endif
762 
763 static struct clock_event_device timer_clockevent[NR_CPUS];
764 
765 void timer_handler(int sig, struct siginfo *unused_si, struct uml_pt_regs *regs)
766 {
767 	unsigned long flags;
768 
769 	/*
770 	 * In basic time-travel mode we still get real interrupts
771 	 * (signals) but since we don't read time from the OS, we
772 	 * must update the simulated time here to the expiry when
773 	 * we get a signal.
774 	 * This is not the case in inf-cpu mode, since there we
775 	 * never get any real signals from the OS.
776 	 */
777 	if (time_travel_mode == TT_MODE_BASIC)
778 		time_travel_handle_real_alarm();
779 
780 	local_irq_save(flags);
781 	do_IRQ(TIMER_IRQ, regs);
782 	local_irq_restore(flags);
783 }
784 
785 static int itimer_shutdown(struct clock_event_device *evt)
786 {
787 	int cpu = evt - &timer_clockevent[0];
788 
789 	if (time_travel_mode != TT_MODE_OFF)
790 		time_travel_del_event(&time_travel_timer_event);
791 
792 	if (time_travel_mode != TT_MODE_INFCPU &&
793 	    time_travel_mode != TT_MODE_EXTERNAL)
794 		os_timer_disable(cpu);
795 
796 	return 0;
797 }
798 
799 static int itimer_set_periodic(struct clock_event_device *evt)
800 {
801 	unsigned long long interval = NSEC_PER_SEC / HZ;
802 	int cpu = evt - &timer_clockevent[0];
803 
804 	if (time_travel_mode != TT_MODE_OFF) {
805 		time_travel_del_event(&time_travel_timer_event);
806 		time_travel_set_event_fn(&time_travel_timer_event,
807 					 time_travel_periodic_timer);
808 		time_travel_set_interval(interval);
809 		time_travel_add_event(&time_travel_timer_event,
810 				      time_travel_time + interval);
811 	}
812 
813 	if (time_travel_mode != TT_MODE_INFCPU &&
814 	    time_travel_mode != TT_MODE_EXTERNAL)
815 		os_timer_set_interval(cpu, interval);
816 
817 	return 0;
818 }
819 
820 static int itimer_next_event(unsigned long delta,
821 			     struct clock_event_device *evt)
822 {
823 	delta += 1;
824 
825 	if (time_travel_mode != TT_MODE_OFF) {
826 		time_travel_del_event(&time_travel_timer_event);
827 		time_travel_set_event_fn(&time_travel_timer_event,
828 					 time_travel_oneshot_timer);
829 		time_travel_add_event(&time_travel_timer_event,
830 				      time_travel_time + delta);
831 	}
832 
833 	if (time_travel_mode != TT_MODE_INFCPU &&
834 	    time_travel_mode != TT_MODE_EXTERNAL)
835 		return os_timer_one_shot(raw_smp_processor_id(), delta);
836 
837 	return 0;
838 }
839 
840 static int itimer_one_shot(struct clock_event_device *evt)
841 {
842 	return itimer_next_event(0, evt);
843 }
844 
845 static struct clock_event_device _timer_clockevent = {
846 	.name			= "posix-timer",
847 	.rating			= 250,
848 	.features		= CLOCK_EVT_FEAT_PERIODIC |
849 				  CLOCK_EVT_FEAT_ONESHOT,
850 	.set_state_shutdown	= itimer_shutdown,
851 	.set_state_periodic	= itimer_set_periodic,
852 	.set_state_oneshot	= itimer_one_shot,
853 	.set_next_event		= itimer_next_event,
854 	.shift			= 0,
855 	.max_delta_ns		= 0xffffffff,
856 	.max_delta_ticks	= 0xffffffff,
857 	.min_delta_ns		= TIMER_MIN_DELTA,
858 	.min_delta_ticks	= TIMER_MIN_DELTA, // microsecond resolution should be enough for anyone, same as 640K RAM
859 	.irq			= 0,
860 	.mult			= 1,
861 };
862 
863 static irqreturn_t um_timer(int irq, void *dev)
864 {
865 	int cpu = raw_smp_processor_id();
866 	struct clock_event_device *evt = &timer_clockevent[cpu];
867 
868 	/*
869 	 * Interrupt the (possibly) running userspace process, technically this
870 	 * should only happen if userspace is currently executing.
871 	 * With infinite CPU time-travel, we can only get here when userspace
872 	 * is not executing. Do not notify there and avoid spurious scheduling.
873 	 */
874 	if (time_travel_mode != TT_MODE_INFCPU &&
875 	    time_travel_mode != TT_MODE_EXTERNAL &&
876 	    get_current()->mm)
877 		os_alarm_process(current_mm_id()->pid);
878 
879 	evt->event_handler(evt);
880 
881 	return IRQ_HANDLED;
882 }
883 
884 static u64 timer_read(struct clocksource *cs)
885 {
886 	if (time_travel_mode != TT_MODE_OFF) {
887 		/*
888 		 * We make reading the timer cost a bit so that we don't get
889 		 * stuck in loops that expect time to move more than the
890 		 * exact requested sleep amount, e.g. python's socket server,
891 		 * see https://bugs.python.org/issue37026.
892 		 *
893 		 * However, don't do that when we're in interrupt or such as
894 		 * then we might recurse into our own processing, and get to
895 		 * even more waiting, and that's not good - it messes up the
896 		 * "what do I do next" and onstack event we use to know when
897 		 * to return from time_travel_update_time().
898 		 */
899 		if (!irqs_disabled() && !in_interrupt() && !in_softirq() &&
900 		    !time_travel_ext_waiting)
901 			time_travel_update_time_rel(TIMER_MULTIPLIER);
902 		return time_travel_time / TIMER_MULTIPLIER;
903 	}
904 
905 	return os_nsecs() / TIMER_MULTIPLIER;
906 }
907 
908 static struct clocksource timer_clocksource = {
909 	.name		= "timer",
910 	.rating		= 300,
911 	.read		= timer_read,
912 	.mask		= CLOCKSOURCE_MASK(64),
913 	.flags		= CLOCK_SOURCE_IS_CONTINUOUS,
914 };
915 
916 int um_setup_timer(void)
917 {
918 	int cpu = raw_smp_processor_id();
919 	struct clock_event_device *evt = &timer_clockevent[cpu];
920 	int err;
921 
922 	err = os_timer_create();
923 	if (err)
924 		return err;
925 
926 	memcpy(evt, &_timer_clockevent, sizeof(*evt));
927 	evt->cpumask = cpumask_of(cpu);
928 	clockevents_register_device(evt);
929 
930 	return 0;
931 }
932 
933 static void __init um_timer_init(void)
934 {
935 	int err;
936 
937 	err = request_irq(TIMER_IRQ, um_timer, IRQF_TIMER, "hr timer", NULL);
938 	if (err != 0)
939 		printk(KERN_ERR "register_timer : request_irq failed - "
940 		       "errno = %d\n", -err);
941 
942 	err = um_setup_timer();
943 	if (err) {
944 		printk(KERN_ERR "creation of timer failed - errno = %d\n", -err);
945 		return;
946 	}
947 
948 	err = clocksource_register_hz(&timer_clocksource, NSEC_PER_SEC/TIMER_MULTIPLIER);
949 	if (err) {
950 		printk(KERN_ERR "clocksource_register_hz returned %d\n", err);
951 		return;
952 	}
953 }
954 
955 void read_persistent_clock64(struct timespec64 *ts)
956 {
957 	long long nsecs;
958 
959 	time_travel_set_start();
960 
961 	if (time_travel_mode != TT_MODE_OFF)
962 		nsecs = time_travel_start + time_travel_time;
963 	else
964 		nsecs = os_persistent_clock_emulation();
965 
966 	set_normalized_timespec64(ts, nsecs / NSEC_PER_SEC,
967 				  nsecs % NSEC_PER_SEC);
968 }
969 
970 void __init time_init(void)
971 {
972 	timer_set_signal_handler();
973 	late_time_init = um_timer_init;
974 }
975 
976 #ifdef CONFIG_UML_TIME_TRAVEL_SUPPORT
977 unsigned long calibrate_delay_is_known(void)
978 {
979 	if (time_travel_mode == TT_MODE_INFCPU ||
980 	    time_travel_mode == TT_MODE_EXTERNAL)
981 		return 1;
982 	return 0;
983 }
984 
985 static int setup_time_travel(char *str)
986 {
987 	if (strcmp(str, "=inf-cpu") == 0) {
988 		time_travel_mode = TT_MODE_INFCPU;
989 		_timer_clockevent.name = "time-travel-timer-infcpu";
990 		timer_clocksource.name = "time-travel-clock";
991 		return 1;
992 	}
993 
994 	if (strncmp(str, "=ext:", 5) == 0) {
995 		time_travel_mode = TT_MODE_EXTERNAL;
996 		_timer_clockevent.name = "time-travel-timer-external";
997 		timer_clocksource.name = "time-travel-clock-external";
998 		return time_travel_connect_external(str + 5);
999 	}
1000 
1001 	if (!*str) {
1002 		time_travel_mode = TT_MODE_BASIC;
1003 		_timer_clockevent.name = "time-travel-timer";
1004 		timer_clocksource.name = "time-travel-clock";
1005 		return 1;
1006 	}
1007 
1008 	return -EINVAL;
1009 }
1010 
1011 __setup("time-travel", setup_time_travel);
1012 __uml_help(setup_time_travel,
1013 "time-travel\n"
1014 "    This option just enables basic time travel mode, in which the clock/timers\n"
1015 "    inside the UML instance skip forward when there's nothing to do, rather than\n"
1016 "    waiting for real time to elapse. However, instance CPU speed is limited by\n"
1017 "    the real CPU speed, so e.g. a 10ms timer will always fire after ~10ms wall\n"
1018 "    clock (but quicker when there's nothing to do).\n"
1019 "\n"
1020 "time-travel=inf-cpu\n"
1021 "    This enables time travel mode with infinite processing power, in which there\n"
1022 "    are no wall clock timers, and any CPU processing happens - as seen from the\n"
1023 "    guest - instantly. This can be useful for accurate simulation regardless of\n"
1024 "    debug overhead, physical CPU speed, etc. but is somewhat dangerous as it can\n"
1025 "    easily lead to getting stuck (e.g. if anything in the system busy loops).\n"
1026 "\n"
1027 "time-travel=ext:[ID:]/path/to/socket\n"
1028 "    This enables time travel mode similar to =inf-cpu, except the system will\n"
1029 "    use the given socket to coordinate with a central scheduler, in order to\n"
1030 "    have more than one system simultaneously be on simulated time. The virtio\n"
1031 "    driver code in UML knows about this so you can also simulate networks and\n"
1032 "    devices using it, assuming the device has the right capabilities.\n"
1033 "    The optional ID is a 64-bit integer that's sent to the central scheduler.\n\n");
1034 
1035 static int setup_time_travel_start(char *str)
1036 {
1037 	int err;
1038 
1039 	err = kstrtoull(str, 0, &time_travel_start);
1040 	if (err)
1041 		return err;
1042 
1043 	time_travel_start_set = 1;
1044 	return 1;
1045 }
1046 
1047 __setup("time-travel-start=", setup_time_travel_start);
1048 __uml_help(setup_time_travel_start,
1049 "time-travel-start=<nanoseconds>\n"
1050 "    Configure the UML instance's wall clock to start at this value rather than\n"
1051 "    the host's wall clock at the time of UML boot.\n\n");
1052 
1053 static struct kobject *bc_time_kobject;
1054 
1055 static ssize_t bc_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
1056 {
1057 	return sprintf(buf, "0x%llx", bc_message);
1058 }
1059 
1060 static ssize_t bc_store(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t count)
1061 {
1062 	int ret;
1063 	u64 user_bc_message;
1064 
1065 	ret = kstrtou64(buf, 0, &user_bc_message);
1066 	if (ret)
1067 		return ret;
1068 
1069 	bc_message = user_bc_message;
1070 
1071 	time_travel_ext_req(UM_TIMETRAVEL_BROADCAST, bc_message);
1072 	pr_info("um: time: sent broadcast message: 0x%llx\n", bc_message);
1073 	return count;
1074 }
1075 
1076 static struct kobj_attribute bc_attribute = __ATTR(bc-message, 0660, bc_show, bc_store);
1077 
1078 static int __init um_bc_start(void)
1079 {
1080 	if (time_travel_mode != TT_MODE_EXTERNAL)
1081 		return 0;
1082 
1083 	bc_time_kobject = kobject_create_and_add("um-ext-time", kernel_kobj);
1084 	if (!bc_time_kobject)
1085 		return 0;
1086 
1087 	if (sysfs_create_file(bc_time_kobject, &bc_attribute.attr))
1088 		pr_debug("failed to create the bc file in /sys/kernel/um_time");
1089 
1090 	return 0;
1091 }
1092 late_initcall(um_bc_start);
1093 #endif
1094