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