1 /* $OpenBSD: kern_tc.c,v 1.78 2022/09/18 20:47:09 cheloha Exp $ */ 2 3 /* 4 * Copyright (c) 2000 Poul-Henning Kamp <phk@FreeBSD.org> 5 * 6 * Permission to use, copy, modify, and distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 */ 18 19 /* 20 * If we meet some day, and you think this stuff is worth it, you 21 * can buy me a beer in return. Poul-Henning Kamp 22 */ 23 24 #include <sys/param.h> 25 #include <sys/atomic.h> 26 #include <sys/kernel.h> 27 #include <sys/mutex.h> 28 #include <sys/rwlock.h> 29 #include <sys/stdint.h> 30 #include <sys/timeout.h> 31 #include <sys/sysctl.h> 32 #include <sys/syslog.h> 33 #include <sys/systm.h> 34 #include <sys/timetc.h> 35 #include <sys/queue.h> 36 #include <sys/malloc.h> 37 38 u_int dummy_get_timecount(struct timecounter *); 39 40 int sysctl_tc_hardware(void *, size_t *, void *, size_t); 41 int sysctl_tc_choice(void *, size_t *, void *, size_t); 42 43 /* 44 * Implement a dummy timecounter which we can use until we get a real one 45 * in the air. This allows the console and other early stuff to use 46 * time services. 47 */ 48 49 u_int 50 dummy_get_timecount(struct timecounter *tc) 51 { 52 static u_int now; 53 54 return atomic_inc_int_nv(&now); 55 } 56 57 static struct timecounter dummy_timecounter = { 58 .tc_get_timecount = dummy_get_timecount, 59 .tc_poll_pps = NULL, 60 .tc_counter_mask = ~0u, 61 .tc_frequency = 1000000, 62 .tc_name = "dummy", 63 .tc_quality = -1000000, 64 .tc_priv = NULL, 65 .tc_user = 0, 66 }; 67 68 /* 69 * Locks used to protect struct members, global variables in this file: 70 * I immutable after initialization 71 * T tc_lock 72 * W windup_mtx 73 */ 74 75 struct timehands { 76 /* These fields must be initialized by the driver. */ 77 struct timecounter *th_counter; /* [W] */ 78 int64_t th_adjtimedelta; /* [T,W] */ 79 struct bintime th_next_ntp_update; /* [T,W] */ 80 int64_t th_adjustment; /* [W] */ 81 u_int64_t th_scale; /* [W] */ 82 u_int th_offset_count; /* [W] */ 83 struct bintime th_boottime; /* [T,W] */ 84 struct bintime th_offset; /* [W] */ 85 struct bintime th_naptime; /* [W] */ 86 struct timeval th_microtime; /* [W] */ 87 struct timespec th_nanotime; /* [W] */ 88 /* Fields not to be copied in tc_windup start with th_generation. */ 89 volatile u_int th_generation; /* [W] */ 90 struct timehands *th_next; /* [I] */ 91 }; 92 93 static struct timehands th0; 94 static struct timehands th1 = { 95 .th_next = &th0 96 }; 97 static struct timehands th0 = { 98 .th_counter = &dummy_timecounter, 99 .th_scale = UINT64_MAX / 1000000, 100 .th_offset = { .sec = 1, .frac = 0 }, 101 .th_generation = 1, 102 .th_next = &th1 103 }; 104 105 struct rwlock tc_lock = RWLOCK_INITIALIZER("tc_lock"); 106 107 /* 108 * tc_windup() must be called before leaving this mutex. 109 */ 110 struct mutex windup_mtx = MUTEX_INITIALIZER(IPL_CLOCK); 111 112 static struct timehands *volatile timehands = &th0; /* [W] */ 113 struct timecounter *timecounter = &dummy_timecounter; /* [T] */ 114 static SLIST_HEAD(, timecounter) tc_list = SLIST_HEAD_INITIALIZER(tc_list); 115 116 /* 117 * These are updated from tc_windup(). They are useful when 118 * examining kernel core dumps. 119 */ 120 volatile time_t naptime = 0; 121 volatile time_t time_second = 1; 122 volatile time_t time_uptime = 0; 123 124 static int timestepwarnings; 125 126 void ntp_update_second(struct timehands *); 127 void tc_windup(struct bintime *, struct bintime *, int64_t *); 128 129 /* 130 * Return the difference between the timehands' counter value now and what 131 * was when we copied it to the timehands' offset_count. 132 */ 133 static __inline u_int 134 tc_delta(struct timehands *th) 135 { 136 struct timecounter *tc; 137 138 tc = th->th_counter; 139 return ((tc->tc_get_timecount(tc) - th->th_offset_count) & 140 tc->tc_counter_mask); 141 } 142 143 /* 144 * Functions for reading the time. We have to loop until we are sure that 145 * the timehands that we operated on was not updated under our feet. See 146 * the comment in <sys/time.h> for a description of these functions. 147 */ 148 149 void 150 binboottime(struct bintime *bt) 151 { 152 struct timehands *th; 153 u_int gen; 154 155 do { 156 th = timehands; 157 gen = th->th_generation; 158 membar_consumer(); 159 *bt = th->th_boottime; 160 membar_consumer(); 161 } while (gen == 0 || gen != th->th_generation); 162 } 163 164 void 165 microboottime(struct timeval *tvp) 166 { 167 struct bintime bt; 168 169 binboottime(&bt); 170 BINTIME_TO_TIMEVAL(&bt, tvp); 171 } 172 173 void 174 nanoboottime(struct timespec *tsp) 175 { 176 struct bintime bt; 177 178 binboottime(&bt); 179 BINTIME_TO_TIMESPEC(&bt, tsp); 180 } 181 182 void 183 binuptime(struct bintime *bt) 184 { 185 struct timehands *th; 186 u_int gen; 187 188 do { 189 th = timehands; 190 gen = th->th_generation; 191 membar_consumer(); 192 TIMECOUNT_TO_BINTIME(tc_delta(th), th->th_scale, bt); 193 bintimeadd(bt, &th->th_offset, bt); 194 membar_consumer(); 195 } while (gen == 0 || gen != th->th_generation); 196 } 197 198 void 199 getbinuptime(struct bintime *bt) 200 { 201 struct timehands *th; 202 u_int gen; 203 204 do { 205 th = timehands; 206 gen = th->th_generation; 207 membar_consumer(); 208 *bt = th->th_offset; 209 membar_consumer(); 210 } while (gen == 0 || gen != th->th_generation); 211 } 212 213 void 214 nanouptime(struct timespec *tsp) 215 { 216 struct bintime bt; 217 218 binuptime(&bt); 219 BINTIME_TO_TIMESPEC(&bt, tsp); 220 } 221 222 void 223 microuptime(struct timeval *tvp) 224 { 225 struct bintime bt; 226 227 binuptime(&bt); 228 BINTIME_TO_TIMEVAL(&bt, tvp); 229 } 230 231 time_t 232 getuptime(void) 233 { 234 #if defined(__LP64__) 235 return time_uptime; /* atomic */ 236 #else 237 time_t now; 238 struct timehands *th; 239 u_int gen; 240 241 do { 242 th = timehands; 243 gen = th->th_generation; 244 membar_consumer(); 245 now = th->th_offset.sec; 246 membar_consumer(); 247 } while (gen == 0 || gen != th->th_generation); 248 249 return now; 250 #endif 251 } 252 253 uint64_t 254 nsecuptime(void) 255 { 256 struct bintime bt; 257 258 binuptime(&bt); 259 return BINTIME_TO_NSEC(&bt); 260 } 261 262 uint64_t 263 getnsecuptime(void) 264 { 265 struct bintime bt; 266 267 getbinuptime(&bt); 268 return BINTIME_TO_NSEC(&bt); 269 } 270 271 void 272 binruntime(struct bintime *bt) 273 { 274 struct timehands *th; 275 u_int gen; 276 277 do { 278 th = timehands; 279 gen = th->th_generation; 280 membar_consumer(); 281 TIMECOUNT_TO_BINTIME(tc_delta(th), th->th_scale, bt); 282 bintimeadd(bt, &th->th_offset, bt); 283 bintimesub(bt, &th->th_naptime, bt); 284 membar_consumer(); 285 } while (gen == 0 || gen != th->th_generation); 286 } 287 288 void 289 nanoruntime(struct timespec *ts) 290 { 291 struct bintime bt; 292 293 binruntime(&bt); 294 BINTIME_TO_TIMESPEC(&bt, ts); 295 } 296 297 void 298 bintime(struct bintime *bt) 299 { 300 struct timehands *th; 301 u_int gen; 302 303 do { 304 th = timehands; 305 gen = th->th_generation; 306 membar_consumer(); 307 TIMECOUNT_TO_BINTIME(tc_delta(th), th->th_scale, bt); 308 bintimeadd(bt, &th->th_offset, bt); 309 bintimeadd(bt, &th->th_boottime, bt); 310 membar_consumer(); 311 } while (gen == 0 || gen != th->th_generation); 312 } 313 314 void 315 nanotime(struct timespec *tsp) 316 { 317 struct bintime bt; 318 319 bintime(&bt); 320 BINTIME_TO_TIMESPEC(&bt, tsp); 321 } 322 323 void 324 microtime(struct timeval *tvp) 325 { 326 struct bintime bt; 327 328 bintime(&bt); 329 BINTIME_TO_TIMEVAL(&bt, tvp); 330 } 331 332 time_t 333 gettime(void) 334 { 335 #if defined(__LP64__) 336 return time_second; /* atomic */ 337 #else 338 time_t now; 339 struct timehands *th; 340 u_int gen; 341 342 do { 343 th = timehands; 344 gen = th->th_generation; 345 membar_consumer(); 346 now = th->th_microtime.tv_sec; 347 membar_consumer(); 348 } while (gen == 0 || gen != th->th_generation); 349 350 return now; 351 #endif 352 } 353 354 void 355 getnanouptime(struct timespec *tsp) 356 { 357 struct timehands *th; 358 u_int gen; 359 360 do { 361 th = timehands; 362 gen = th->th_generation; 363 membar_consumer(); 364 BINTIME_TO_TIMESPEC(&th->th_offset, tsp); 365 membar_consumer(); 366 } while (gen == 0 || gen != th->th_generation); 367 } 368 369 void 370 getmicrouptime(struct timeval *tvp) 371 { 372 struct timehands *th; 373 u_int gen; 374 375 do { 376 th = timehands; 377 gen = th->th_generation; 378 membar_consumer(); 379 BINTIME_TO_TIMEVAL(&th->th_offset, tvp); 380 membar_consumer(); 381 } while (gen == 0 || gen != th->th_generation); 382 } 383 384 void 385 getnanotime(struct timespec *tsp) 386 { 387 struct timehands *th; 388 u_int gen; 389 390 do { 391 th = timehands; 392 gen = th->th_generation; 393 membar_consumer(); 394 *tsp = th->th_nanotime; 395 membar_consumer(); 396 } while (gen == 0 || gen != th->th_generation); 397 } 398 399 void 400 getmicrotime(struct timeval *tvp) 401 { 402 struct timehands *th; 403 u_int gen; 404 405 do { 406 th = timehands; 407 gen = th->th_generation; 408 membar_consumer(); 409 *tvp = th->th_microtime; 410 membar_consumer(); 411 } while (gen == 0 || gen != th->th_generation); 412 } 413 414 /* 415 * Initialize a new timecounter and possibly use it. 416 */ 417 void 418 tc_init(struct timecounter *tc) 419 { 420 u_int64_t tmp; 421 u_int u; 422 423 u = tc->tc_frequency / tc->tc_counter_mask; 424 /* XXX: We need some margin here, 10% is a guess */ 425 u *= 11; 426 u /= 10; 427 if (tc->tc_quality >= 0) { 428 if (u > hz) { 429 tc->tc_quality = -2000; 430 printf("Timecounter \"%s\" frequency %lu Hz", 431 tc->tc_name, (unsigned long)tc->tc_frequency); 432 printf(" -- Insufficient hz, needs at least %u\n", u); 433 } 434 } 435 436 /* Determine the counter's precision. */ 437 for (tmp = 1; (tmp & tc->tc_counter_mask) == 0; tmp <<= 1) 438 continue; 439 tc->tc_precision = tmp; 440 441 SLIST_INSERT_HEAD(&tc_list, tc, tc_next); 442 443 /* 444 * Never automatically use a timecounter with negative quality. 445 * Even though we run on the dummy counter, switching here may be 446 * worse since this timecounter may not be monotonic. 447 */ 448 if (tc->tc_quality < 0) 449 return; 450 if (tc->tc_quality < timecounter->tc_quality) 451 return; 452 if (tc->tc_quality == timecounter->tc_quality && 453 tc->tc_frequency < timecounter->tc_frequency) 454 return; 455 (void)tc->tc_get_timecount(tc); 456 enqueue_randomness(tc->tc_get_timecount(tc)); 457 458 timecounter = tc; 459 } 460 461 /* 462 * Change the given timecounter's quality. If it is the active 463 * counter and it is no longer the best counter, activate the 464 * best counter. 465 */ 466 void 467 tc_reset_quality(struct timecounter *tc, int quality) 468 { 469 struct timecounter *best = &dummy_timecounter, *tmp; 470 471 if (tc == &dummy_timecounter) 472 panic("%s: cannot change dummy counter quality", __func__); 473 474 tc->tc_quality = quality; 475 if (timecounter == tc) { 476 SLIST_FOREACH(tmp, &tc_list, tc_next) { 477 if (tmp->tc_quality < 0) 478 continue; 479 if (tmp->tc_quality < best->tc_quality) 480 continue; 481 if (tmp->tc_quality == best->tc_quality && 482 tmp->tc_frequency < best->tc_frequency) 483 continue; 484 best = tmp; 485 } 486 if (best != tc) { 487 enqueue_randomness(best->tc_get_timecount(best)); 488 timecounter = best; 489 printf("timecounter: active counter changed: %s -> %s\n", 490 tc->tc_name, best->tc_name); 491 } 492 } 493 } 494 495 /* Report the frequency of the current timecounter. */ 496 u_int64_t 497 tc_getfrequency(void) 498 { 499 return (timehands->th_counter->tc_frequency); 500 } 501 502 /* Report the precision of the current timecounter. */ 503 u_int64_t 504 tc_getprecision(void) 505 { 506 return (timehands->th_counter->tc_precision); 507 } 508 509 /* 510 * Step our concept of UTC, aka the realtime clock. 511 * This is done by modifying our estimate of when we booted. 512 * 513 * Any ongoing adjustment is meaningless after a clock jump, 514 * so we zero adjtimedelta here as well. 515 */ 516 void 517 tc_setrealtimeclock(const struct timespec *ts) 518 { 519 struct bintime boottime, old_utc, uptime, utc; 520 struct timespec tmp; 521 int64_t zero = 0; 522 523 TIMESPEC_TO_BINTIME(ts, &utc); 524 525 rw_enter_write(&tc_lock); 526 mtx_enter(&windup_mtx); 527 528 binuptime(&uptime); 529 bintimesub(&utc, &uptime, &boottime); 530 bintimeadd(&timehands->th_boottime, &uptime, &old_utc); 531 /* XXX fiddle all the little crinkly bits around the fiords... */ 532 tc_windup(&boottime, NULL, &zero); 533 534 mtx_leave(&windup_mtx); 535 rw_exit_write(&tc_lock); 536 537 enqueue_randomness(ts->tv_sec); 538 539 if (timestepwarnings) { 540 BINTIME_TO_TIMESPEC(&old_utc, &tmp); 541 log(LOG_INFO, "Time stepped from %lld.%09ld to %lld.%09ld\n", 542 (long long)tmp.tv_sec, tmp.tv_nsec, 543 (long long)ts->tv_sec, ts->tv_nsec); 544 } 545 } 546 547 /* 548 * Step the monotonic and realtime clocks, triggering any timeouts that 549 * should have occurred across the interval. 550 */ 551 void 552 tc_setclock(const struct timespec *ts) 553 { 554 struct bintime new_naptime, old_naptime, uptime, utc; 555 struct timespec tmp; 556 static int first = 1; 557 #ifndef SMALL_KERNEL 558 struct bintime elapsed; 559 long long adj_ticks; 560 #endif 561 562 /* 563 * When we're called for the first time, during boot when 564 * the root partition is mounted, we need to set boottime. 565 */ 566 if (first) { 567 tc_setrealtimeclock(ts); 568 first = 0; 569 return; 570 } 571 572 enqueue_randomness(ts->tv_sec); 573 574 TIMESPEC_TO_BINTIME(ts, &utc); 575 576 mtx_enter(&windup_mtx); 577 578 bintimesub(&utc, &timehands->th_boottime, &uptime); 579 old_naptime = timehands->th_naptime; 580 /* XXX fiddle all the little crinkly bits around the fiords... */ 581 tc_windup(NULL, &uptime, NULL); 582 new_naptime = timehands->th_naptime; 583 584 mtx_leave(&windup_mtx); 585 586 if (bintimecmp(&old_naptime, &new_naptime, ==)) { 587 BINTIME_TO_TIMESPEC(&uptime, &tmp); 588 printf("%s: cannot rewind uptime to %lld.%09ld\n", 589 __func__, (long long)tmp.tv_sec, tmp.tv_nsec); 590 } 591 592 #ifndef SMALL_KERNEL 593 /* convert the bintime to ticks */ 594 bintimesub(&new_naptime, &old_naptime, &elapsed); 595 adj_ticks = BINTIME_TO_NSEC(&elapsed) / tick_nsec; 596 if (adj_ticks > 0) { 597 if (adj_ticks > INT_MAX) 598 adj_ticks = INT_MAX; 599 timeout_adjust_ticks(adj_ticks); 600 } 601 #endif 602 } 603 604 void 605 tc_update_timekeep(void) 606 { 607 static struct timecounter *last_tc = NULL; 608 struct timehands *th; 609 610 MUTEX_ASSERT_LOCKED(&windup_mtx); 611 612 if (timekeep == NULL) 613 return; 614 615 th = timehands; 616 timekeep->tk_generation = 0; 617 membar_producer(); 618 timekeep->tk_scale = th->th_scale; 619 timekeep->tk_offset_count = th->th_offset_count; 620 timekeep->tk_offset = th->th_offset; 621 timekeep->tk_naptime = th->th_naptime; 622 timekeep->tk_boottime = th->th_boottime; 623 if (last_tc != th->th_counter) { 624 timekeep->tk_counter_mask = th->th_counter->tc_counter_mask; 625 timekeep->tk_user = th->th_counter->tc_user; 626 last_tc = th->th_counter; 627 } 628 membar_producer(); 629 timekeep->tk_generation = th->th_generation; 630 631 return; 632 } 633 634 /* 635 * Initialize the next struct timehands in the ring and make 636 * it the active timehands. Along the way we might switch to a different 637 * timecounter and/or do seconds processing in NTP. Slightly magic. 638 */ 639 void 640 tc_windup(struct bintime *new_boottime, struct bintime *new_offset, 641 int64_t *new_adjtimedelta) 642 { 643 struct bintime bt; 644 struct timecounter *active_tc; 645 struct timehands *th, *tho; 646 u_int64_t scale; 647 u_int delta, ncount, ogen; 648 649 if (new_boottime != NULL || new_adjtimedelta != NULL) 650 rw_assert_wrlock(&tc_lock); 651 MUTEX_ASSERT_LOCKED(&windup_mtx); 652 653 active_tc = timecounter; 654 655 /* 656 * Make the next timehands a copy of the current one, but do not 657 * overwrite the generation or next pointer. While we update 658 * the contents, the generation must be zero. 659 */ 660 tho = timehands; 661 ogen = tho->th_generation; 662 th = tho->th_next; 663 th->th_generation = 0; 664 membar_producer(); 665 memcpy(th, tho, offsetof(struct timehands, th_generation)); 666 667 /* 668 * Capture a timecounter delta on the current timecounter and if 669 * changing timecounters, a counter value from the new timecounter. 670 * Update the offset fields accordingly. 671 */ 672 delta = tc_delta(th); 673 if (th->th_counter != active_tc) 674 ncount = active_tc->tc_get_timecount(active_tc); 675 else 676 ncount = 0; 677 th->th_offset_count += delta; 678 th->th_offset_count &= th->th_counter->tc_counter_mask; 679 TIMECOUNT_TO_BINTIME(delta, th->th_scale, &bt); 680 bintimeadd(&th->th_offset, &bt, &th->th_offset); 681 682 /* 683 * Ignore new offsets that predate the current offset. 684 * If changing the offset, first increase the naptime 685 * accordingly. 686 */ 687 if (new_offset != NULL && bintimecmp(&th->th_offset, new_offset, <)) { 688 bintimesub(new_offset, &th->th_offset, &bt); 689 bintimeadd(&th->th_naptime, &bt, &th->th_naptime); 690 naptime = th->th_naptime.sec; 691 th->th_offset = *new_offset; 692 } 693 694 #ifdef notyet 695 /* 696 * Hardware latching timecounters may not generate interrupts on 697 * PPS events, so instead we poll them. There is a finite risk that 698 * the hardware might capture a count which is later than the one we 699 * got above, and therefore possibly in the next NTP second which might 700 * have a different rate than the current NTP second. It doesn't 701 * matter in practice. 702 */ 703 if (tho->th_counter->tc_poll_pps) 704 tho->th_counter->tc_poll_pps(tho->th_counter); 705 #endif 706 707 /* 708 * If changing the boot time or clock adjustment, do so before 709 * NTP processing. 710 */ 711 if (new_boottime != NULL) 712 th->th_boottime = *new_boottime; 713 if (new_adjtimedelta != NULL) { 714 th->th_adjtimedelta = *new_adjtimedelta; 715 /* Reset the NTP update period. */ 716 bintimesub(&th->th_offset, &th->th_naptime, 717 &th->th_next_ntp_update); 718 } 719 720 /* 721 * Deal with NTP second processing. The while-loop normally 722 * iterates at most once, but in extreme situations it might 723 * keep NTP sane if tc_windup() is not run for several seconds. 724 */ 725 bintimesub(&th->th_offset, &th->th_naptime, &bt); 726 while (bintimecmp(&th->th_next_ntp_update, &bt, <=)) { 727 ntp_update_second(th); 728 th->th_next_ntp_update.sec++; 729 } 730 731 /* Update the UTC timestamps used by the get*() functions. */ 732 bintimeadd(&th->th_boottime, &th->th_offset, &bt); 733 BINTIME_TO_TIMEVAL(&bt, &th->th_microtime); 734 BINTIME_TO_TIMESPEC(&bt, &th->th_nanotime); 735 736 /* Now is a good time to change timecounters. */ 737 if (th->th_counter != active_tc) { 738 th->th_counter = active_tc; 739 th->th_offset_count = ncount; 740 } 741 742 /*- 743 * Recalculate the scaling factor. We want the number of 1/2^64 744 * fractions of a second per period of the hardware counter, taking 745 * into account the th_adjustment factor which the NTP PLL/adjtime(2) 746 * processing provides us with. 747 * 748 * The th_adjustment is nanoseconds per second with 32 bit binary 749 * fraction and we want 64 bit binary fraction of second: 750 * 751 * x = a * 2^32 / 10^9 = a * 4.294967296 752 * 753 * The range of th_adjustment is +/- 5000PPM so inside a 64bit int 754 * we can only multiply by about 850 without overflowing, but that 755 * leaves suitably precise fractions for multiply before divide. 756 * 757 * Divide before multiply with a fraction of 2199/512 results in a 758 * systematic undercompensation of 10PPM of th_adjustment. On a 759 * 5000PPM adjustment this is a 0.05PPM error. This is acceptable. 760 * 761 * We happily sacrifice the lowest of the 64 bits of our result 762 * to the goddess of code clarity. 763 * 764 */ 765 scale = (u_int64_t)1 << 63; 766 scale += \ 767 ((th->th_adjustment + th->th_counter->tc_freq_adj) / 1024) * 2199; 768 scale /= th->th_counter->tc_frequency; 769 th->th_scale = scale * 2; 770 771 /* 772 * Now that the struct timehands is again consistent, set the new 773 * generation number, making sure to not make it zero. 774 */ 775 if (++ogen == 0) 776 ogen = 1; 777 membar_producer(); 778 th->th_generation = ogen; 779 780 /* Go live with the new struct timehands. */ 781 time_second = th->th_microtime.tv_sec; 782 time_uptime = th->th_offset.sec; 783 membar_producer(); 784 timehands = th; 785 786 tc_update_timekeep(); 787 } 788 789 /* Report or change the active timecounter hardware. */ 790 int 791 sysctl_tc_hardware(void *oldp, size_t *oldlenp, void *newp, size_t newlen) 792 { 793 char newname[32]; 794 struct timecounter *newtc, *tc; 795 int error; 796 797 tc = timecounter; 798 strlcpy(newname, tc->tc_name, sizeof(newname)); 799 800 error = sysctl_string(oldp, oldlenp, newp, newlen, newname, sizeof(newname)); 801 if (error != 0 || strcmp(newname, tc->tc_name) == 0) 802 return (error); 803 SLIST_FOREACH(newtc, &tc_list, tc_next) { 804 if (strcmp(newname, newtc->tc_name) != 0) 805 continue; 806 807 /* Warm up new timecounter. */ 808 (void)newtc->tc_get_timecount(newtc); 809 (void)newtc->tc_get_timecount(newtc); 810 811 rw_enter_write(&tc_lock); 812 timecounter = newtc; 813 rw_exit_write(&tc_lock); 814 815 return (0); 816 } 817 return (EINVAL); 818 } 819 820 /* Report or change the active timecounter hardware. */ 821 int 822 sysctl_tc_choice(void *oldp, size_t *oldlenp, void *newp, size_t newlen) 823 { 824 char buf[32], *spc, *choices; 825 struct timecounter *tc; 826 int error, maxlen; 827 828 if (SLIST_EMPTY(&tc_list)) 829 return (sysctl_rdstring(oldp, oldlenp, newp, "")); 830 831 spc = ""; 832 maxlen = 0; 833 SLIST_FOREACH(tc, &tc_list, tc_next) 834 maxlen += sizeof(buf); 835 choices = malloc(maxlen, M_TEMP, M_WAITOK); 836 *choices = '\0'; 837 SLIST_FOREACH(tc, &tc_list, tc_next) { 838 snprintf(buf, sizeof(buf), "%s%s(%d)", 839 spc, tc->tc_name, tc->tc_quality); 840 spc = " "; 841 strlcat(choices, buf, maxlen); 842 } 843 error = sysctl_rdstring(oldp, oldlenp, newp, choices); 844 free(choices, M_TEMP, maxlen); 845 return (error); 846 } 847 848 /* 849 * Timecounters need to be updated every so often to prevent the hardware 850 * counter from overflowing. Updating also recalculates the cached values 851 * used by the get*() family of functions, so their precision depends on 852 * the update frequency. 853 */ 854 static int tc_tick; 855 856 void 857 tc_ticktock(void) 858 { 859 static int count; 860 861 if (++count < tc_tick) 862 return; 863 if (!mtx_enter_try(&windup_mtx)) 864 return; 865 count = 0; 866 tc_windup(NULL, NULL, NULL); 867 mtx_leave(&windup_mtx); 868 } 869 870 void 871 inittimecounter(void) 872 { 873 #ifdef DEBUG 874 u_int p; 875 #endif 876 877 /* 878 * Set the initial timeout to 879 * max(1, <approx. number of hardclock ticks in a millisecond>). 880 * People should probably not use the sysctl to set the timeout 881 * to smaller than its initial value, since that value is the 882 * smallest reasonable one. If they want better timestamps they 883 * should use the non-"get"* functions. 884 */ 885 if (hz > 1000) 886 tc_tick = (hz + 500) / 1000; 887 else 888 tc_tick = 1; 889 #ifdef DEBUG 890 p = (tc_tick * 1000000) / hz; 891 printf("Timecounters tick every %d.%03u msec\n", p / 1000, p % 1000); 892 #endif 893 894 /* warm up new timecounter (again) and get rolling. */ 895 (void)timecounter->tc_get_timecount(timecounter); 896 (void)timecounter->tc_get_timecount(timecounter); 897 } 898 899 const struct sysctl_bounded_args tc_vars[] = { 900 { KERN_TIMECOUNTER_TICK, &tc_tick, SYSCTL_INT_READONLY }, 901 { KERN_TIMECOUNTER_TIMESTEPWARNINGS, ×tepwarnings, 0, 1 }, 902 }; 903 904 /* 905 * Return timecounter-related information. 906 */ 907 int 908 sysctl_tc(int *name, u_int namelen, void *oldp, size_t *oldlenp, 909 void *newp, size_t newlen) 910 { 911 if (namelen != 1) 912 return (ENOTDIR); 913 914 switch (name[0]) { 915 case KERN_TIMECOUNTER_HARDWARE: 916 return (sysctl_tc_hardware(oldp, oldlenp, newp, newlen)); 917 case KERN_TIMECOUNTER_CHOICE: 918 return (sysctl_tc_choice(oldp, oldlenp, newp, newlen)); 919 default: 920 return (sysctl_bounded_arr(tc_vars, nitems(tc_vars), name, 921 namelen, oldp, oldlenp, newp, newlen)); 922 } 923 /* NOTREACHED */ 924 } 925 926 /* 927 * Skew the timehands according to any adjtime(2) adjustment. 928 */ 929 void 930 ntp_update_second(struct timehands *th) 931 { 932 int64_t adj; 933 934 MUTEX_ASSERT_LOCKED(&windup_mtx); 935 936 if (th->th_adjtimedelta > 0) 937 adj = MIN(5000, th->th_adjtimedelta); 938 else 939 adj = MAX(-5000, th->th_adjtimedelta); 940 th->th_adjtimedelta -= adj; 941 th->th_adjustment = (adj * 1000) << 32; 942 } 943 944 void 945 tc_adjfreq(int64_t *old, int64_t *new) 946 { 947 if (old != NULL) { 948 rw_assert_anylock(&tc_lock); 949 *old = timecounter->tc_freq_adj; 950 } 951 if (new != NULL) { 952 rw_assert_wrlock(&tc_lock); 953 mtx_enter(&windup_mtx); 954 timecounter->tc_freq_adj = *new; 955 tc_windup(NULL, NULL, NULL); 956 mtx_leave(&windup_mtx); 957 } 958 } 959 960 void 961 tc_adjtime(int64_t *old, int64_t *new) 962 { 963 struct timehands *th; 964 u_int gen; 965 966 if (old != NULL) { 967 do { 968 th = timehands; 969 gen = th->th_generation; 970 membar_consumer(); 971 *old = th->th_adjtimedelta; 972 membar_consumer(); 973 } while (gen == 0 || gen != th->th_generation); 974 } 975 if (new != NULL) { 976 rw_assert_wrlock(&tc_lock); 977 mtx_enter(&windup_mtx); 978 tc_windup(NULL, NULL, new); 979 mtx_leave(&windup_mtx); 980 } 981 } 982