1 /* 2 * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 3 * Use is subject to license terms. 4 */ 5 6 #pragma ident "%Z%%M% %I% %E% SMI" 7 8 /* 9 * Copyright (c) 1982, 1986 Regents of the University of California. 10 * All rights reserved. The Berkeley software License Agreement 11 * specifies the terms and conditions for redistribution. 12 */ 13 14 #include <sys/param.h> 15 #include <sys/user.h> 16 #include <sys/vnode.h> 17 #include <sys/proc.h> 18 #include <sys/time.h> 19 #include <sys/systm.h> 20 #include <sys/kmem.h> 21 #include <sys/cmn_err.h> 22 #include <sys/cpuvar.h> 23 #include <sys/timer.h> 24 #include <sys/debug.h> 25 #include <sys/sysmacros.h> 26 #include <sys/cyclic.h> 27 28 static void realitexpire(void *); 29 static void realprofexpire(void *); 30 static void timeval_advance(struct timeval *, struct timeval *); 31 32 kmutex_t tod_lock; /* protects time-of-day stuff */ 33 34 /* 35 * Constant to define the minimum interval value of the ITIMER_REALPROF timer. 36 * Value is in microseconds; defaults to 500 usecs. Setting this value 37 * significantly lower may allow for denial-of-service attacks. 38 */ 39 int itimer_realprof_minimum = 500; 40 41 /* 42 * macro to compare a timeval to a timestruc 43 */ 44 45 #define TVTSCMP(tvp, tsp, cmp) \ 46 /* CSTYLED */ \ 47 ((tvp)->tv_sec cmp (tsp)->tv_sec || \ 48 ((tvp)->tv_sec == (tsp)->tv_sec && \ 49 /* CSTYLED */ \ 50 (tvp)->tv_usec * 1000 cmp (tsp)->tv_nsec)) 51 52 /* 53 * Time of day and interval timer support. 54 * 55 * These routines provide the kernel entry points to get and set 56 * the time-of-day and per-process interval timers. Subroutines 57 * here provide support for adding and subtracting timeval structures 58 * and decrementing interval timers, optionally reloading the interval 59 * timers when they expire. 60 */ 61 62 /* 63 * SunOS function to generate monotonically increasing time values. 64 */ 65 void 66 uniqtime(struct timeval *tv) 67 { 68 static struct timeval last; 69 timestruc_t ts; 70 time_t sec; 71 int usec, nsec; 72 73 /* 74 * protect modification of last 75 */ 76 mutex_enter(&tod_lock); 77 gethrestime(&ts); 78 79 /* 80 * Fast algorithm to convert nsec to usec -- see hrt2ts() 81 * in common/os/timers.c for a full description. 82 */ 83 nsec = ts.tv_nsec; 84 usec = nsec + (nsec >> 2); 85 usec = nsec + (usec >> 1); 86 usec = nsec + (usec >> 2); 87 usec = nsec + (usec >> 4); 88 usec = nsec - (usec >> 3); 89 usec = nsec + (usec >> 2); 90 usec = nsec + (usec >> 3); 91 usec = nsec + (usec >> 4); 92 usec = nsec + (usec >> 1); 93 usec = nsec + (usec >> 6); 94 usec = usec >> 10; 95 sec = ts.tv_sec; 96 97 /* 98 * Try to keep timestamps unique, but don't be obsessive about 99 * it in the face of large differences. 100 */ 101 if ((sec <= last.tv_sec) && /* same or lower seconds, and */ 102 ((sec != last.tv_sec) || /* either different second or */ 103 (usec <= last.tv_usec)) && /* lower microsecond, and */ 104 ((last.tv_sec - sec) <= 5)) { /* not way back in time */ 105 sec = last.tv_sec; 106 usec = last.tv_usec + 1; 107 if (usec >= MICROSEC) { 108 usec -= MICROSEC; 109 sec++; 110 } 111 } 112 last.tv_sec = sec; 113 last.tv_usec = usec; 114 mutex_exit(&tod_lock); 115 116 tv->tv_sec = sec; 117 tv->tv_usec = usec; 118 } 119 120 /* 121 * Timestamps are exported from the kernel in several places. 122 * Such timestamps are commonly used for either uniqueness or for 123 * sequencing - truncation to 32-bits is fine for uniqueness, 124 * but sequencing is going to take more work as we get closer to 2038! 125 */ 126 void 127 uniqtime32(struct timeval32 *tv32p) 128 { 129 struct timeval tv; 130 131 uniqtime(&tv); 132 TIMEVAL_TO_TIMEVAL32(tv32p, &tv); 133 } 134 135 int 136 gettimeofday(struct timeval *tp) 137 { 138 struct timeval atv; 139 140 if (tp) { 141 uniqtime(&atv); 142 if (get_udatamodel() == DATAMODEL_NATIVE) { 143 if (copyout(&atv, tp, sizeof (atv))) 144 return (set_errno(EFAULT)); 145 } else { 146 struct timeval32 tv32; 147 148 if (TIMEVAL_OVERFLOW(&atv)) 149 return (set_errno(EOVERFLOW)); 150 TIMEVAL_TO_TIMEVAL32(&tv32, &atv); 151 152 if (copyout(&tv32, tp, sizeof (tv32))) 153 return (set_errno(EFAULT)); 154 } 155 } 156 return (0); 157 } 158 159 int 160 getitimer(uint_t which, struct itimerval *itv) 161 { 162 int error; 163 164 if (get_udatamodel() == DATAMODEL_NATIVE) 165 error = xgetitimer(which, itv, 0); 166 else { 167 struct itimerval kitv; 168 169 if ((error = xgetitimer(which, &kitv, 1)) == 0) { 170 if (ITIMERVAL_OVERFLOW(&kitv)) { 171 error = EOVERFLOW; 172 } else { 173 struct itimerval32 itv32; 174 175 ITIMERVAL_TO_ITIMERVAL32(&itv32, &kitv); 176 if (copyout(&itv32, itv, sizeof (itv32)) != 0) 177 error = EFAULT; 178 } 179 } 180 } 181 182 return (error ? (set_errno(error)) : 0); 183 } 184 185 int 186 xgetitimer(uint_t which, struct itimerval *itv, int iskaddr) 187 { 188 struct proc *p = curproc; 189 struct timeval now; 190 struct itimerval aitv; 191 hrtime_t ts, first, interval, remain; 192 193 mutex_enter(&p->p_lock); 194 195 switch (which) { 196 case ITIMER_VIRTUAL: 197 case ITIMER_PROF: 198 aitv = ttolwp(curthread)->lwp_timer[which]; 199 break; 200 201 case ITIMER_REAL: 202 uniqtime(&now); 203 aitv = p->p_realitimer; 204 205 if (timerisset(&aitv.it_value)) { 206 /*CSTYLED*/ 207 if (timercmp(&aitv.it_value, &now, <)) { 208 timerclear(&aitv.it_value); 209 } else { 210 timevalsub(&aitv.it_value, &now); 211 } 212 } 213 break; 214 215 case ITIMER_REALPROF: 216 if (curproc->p_rprof_cyclic == CYCLIC_NONE) { 217 bzero(&aitv, sizeof (aitv)); 218 break; 219 } 220 221 aitv = curproc->p_rprof_timer; 222 223 first = tv2hrt(&aitv.it_value); 224 interval = tv2hrt(&aitv.it_interval); 225 226 if ((ts = gethrtime()) < first) { 227 /* 228 * We haven't gone off for the first time; the time 229 * remaining is simply the first time we will go 230 * off minus the current time. 231 */ 232 remain = first - ts; 233 } else { 234 if (interval == 0) { 235 /* 236 * This was set as a one-shot, and we've 237 * already gone off; there is no time 238 * remaining. 239 */ 240 remain = 0; 241 } else { 242 /* 243 * We have a non-zero interval; we need to 244 * determine how far we are into the current 245 * interval, and subtract that from the 246 * interval to determine the time remaining. 247 */ 248 remain = interval - ((ts - first) % interval); 249 } 250 } 251 252 hrt2tv(remain, &aitv.it_value); 253 break; 254 255 default: 256 mutex_exit(&p->p_lock); 257 return (EINVAL); 258 } 259 260 mutex_exit(&p->p_lock); 261 262 if (iskaddr) { 263 bcopy(&aitv, itv, sizeof (*itv)); 264 } else { 265 ASSERT(get_udatamodel() == DATAMODEL_NATIVE); 266 if (copyout(&aitv, itv, sizeof (*itv))) 267 return (EFAULT); 268 } 269 270 return (0); 271 } 272 273 274 int 275 setitimer(uint_t which, struct itimerval *itv, struct itimerval *oitv) 276 { 277 int error; 278 279 if (oitv != NULL) 280 if ((error = getitimer(which, oitv)) != 0) 281 return (error); 282 283 if (itv == NULL) 284 return (0); 285 286 if (get_udatamodel() == DATAMODEL_NATIVE) 287 error = xsetitimer(which, itv, 0); 288 else { 289 struct itimerval32 itv32; 290 struct itimerval kitv; 291 292 if (copyin(itv, &itv32, sizeof (itv32))) 293 error = EFAULT; 294 ITIMERVAL32_TO_ITIMERVAL(&kitv, &itv32); 295 error = xsetitimer(which, &kitv, 1); 296 } 297 298 return (error ? (set_errno(error)) : 0); 299 } 300 301 int 302 xsetitimer(uint_t which, struct itimerval *itv, int iskaddr) 303 { 304 struct itimerval aitv; 305 struct timeval now; 306 struct proc *p = curproc; 307 kthread_t *t; 308 timeout_id_t tmp_id; 309 cyc_handler_t hdlr; 310 cyc_time_t when; 311 cyclic_id_t cyclic; 312 hrtime_t ts; 313 int min; 314 315 if (itv == NULL) 316 return (0); 317 318 if (iskaddr) { 319 bcopy(itv, &aitv, sizeof (aitv)); 320 } else { 321 ASSERT(get_udatamodel() == DATAMODEL_NATIVE); 322 if (copyin(itv, &aitv, sizeof (aitv))) 323 return (EFAULT); 324 } 325 326 if (which == ITIMER_REALPROF) { 327 min = MAX((int)(cyclic_getres() / (NANOSEC / MICROSEC)), 328 itimer_realprof_minimum); 329 } else { 330 min = usec_per_tick; 331 } 332 333 if (itimerfix(&aitv.it_value, min) || 334 (itimerfix(&aitv.it_interval, min) && timerisset(&aitv.it_value))) 335 return (EINVAL); 336 337 mutex_enter(&p->p_lock); 338 switch (which) { 339 case ITIMER_REAL: 340 /* 341 * The SITBUSY flag prevents conflicts with multiple 342 * threads attempting to perform setitimer(ITIMER_REAL) 343 * at the same time, even when we drop p->p_lock below. 344 * Any blocked thread returns successfully because the 345 * effect is the same as if it got here first, finished, 346 * and the other thread then came through and destroyed 347 * what it did. We are just protecting the system from 348 * malfunctioning due to the race condition. 349 */ 350 if (p->p_flag & SITBUSY) { 351 mutex_exit(&p->p_lock); 352 return (0); 353 } 354 p->p_flag |= SITBUSY; 355 while ((tmp_id = p->p_itimerid) != 0) { 356 /* 357 * Avoid deadlock in callout_delete (called from 358 * untimeout) which may go to sleep (while holding 359 * p_lock). Drop p_lock and re-acquire it after 360 * untimeout returns. Need to clear p_itimerid 361 * while holding p_lock. 362 */ 363 p->p_itimerid = 0; 364 mutex_exit(&p->p_lock); 365 (void) untimeout(tmp_id); 366 mutex_enter(&p->p_lock); 367 } 368 if (timerisset(&aitv.it_value)) { 369 uniqtime(&now); 370 timevaladd(&aitv.it_value, &now); 371 p->p_itimerid = realtime_timeout(realitexpire, 372 p, hzto(&aitv.it_value)); 373 } 374 p->p_realitimer = aitv; 375 p->p_flag &= ~SITBUSY; 376 break; 377 378 case ITIMER_REALPROF: 379 cyclic = p->p_rprof_cyclic; 380 p->p_rprof_cyclic = CYCLIC_NONE; 381 382 mutex_exit(&p->p_lock); 383 384 /* 385 * We're now going to acquire cpu_lock, remove the old cyclic 386 * if necessary, and add our new cyclic. 387 */ 388 mutex_enter(&cpu_lock); 389 390 if (cyclic != CYCLIC_NONE) 391 cyclic_remove(cyclic); 392 393 if (!timerisset(&aitv.it_value)) { 394 /* 395 * If we were passed a value of 0, we're done. 396 */ 397 mutex_exit(&cpu_lock); 398 return (0); 399 } 400 401 hdlr.cyh_func = realprofexpire; 402 hdlr.cyh_arg = p; 403 hdlr.cyh_level = CY_LOW_LEVEL; 404 405 when.cyt_when = (ts = gethrtime() + tv2hrt(&aitv.it_value)); 406 when.cyt_interval = tv2hrt(&aitv.it_interval); 407 408 if (when.cyt_interval == 0) { 409 /* 410 * Using the same logic as for CLOCK_HIGHRES timers, we 411 * set the interval to be INT64_MAX - when.cyt_when to 412 * effect a one-shot; see the comment in clock_highres.c 413 * for more details on why this works. 414 */ 415 when.cyt_interval = INT64_MAX - when.cyt_when; 416 } 417 418 cyclic = cyclic_add(&hdlr, &when); 419 420 mutex_exit(&cpu_lock); 421 422 /* 423 * We have now successfully added the cyclic. Reacquire 424 * p_lock, and see if anyone has snuck in. 425 */ 426 mutex_enter(&p->p_lock); 427 428 if (p->p_rprof_cyclic != CYCLIC_NONE) { 429 /* 430 * We're racing with another thread establishing an 431 * ITIMER_REALPROF interval timer. We'll let the other 432 * thread win (this is a race at the application level, 433 * so letting the other thread win is acceptable). 434 */ 435 mutex_exit(&p->p_lock); 436 mutex_enter(&cpu_lock); 437 cyclic_remove(cyclic); 438 mutex_exit(&cpu_lock); 439 440 return (0); 441 } 442 443 /* 444 * Success. Set our tracking variables in the proc structure, 445 * cancel any outstanding ITIMER_PROF, and allocate the 446 * per-thread SIGPROF buffers, if possible. 447 */ 448 hrt2tv(ts, &aitv.it_value); 449 p->p_rprof_timer = aitv; 450 p->p_rprof_cyclic = cyclic; 451 452 t = p->p_tlist; 453 do { 454 struct itimerval *itvp; 455 456 itvp = &ttolwp(t)->lwp_timer[ITIMER_PROF]; 457 timerclear(&itvp->it_interval); 458 timerclear(&itvp->it_value); 459 460 if (t->t_rprof != NULL) 461 continue; 462 463 t->t_rprof = 464 kmem_zalloc(sizeof (struct rprof), KM_NOSLEEP); 465 aston(t); 466 } while ((t = t->t_forw) != p->p_tlist); 467 468 break; 469 470 case ITIMER_VIRTUAL: 471 ttolwp(curthread)->lwp_timer[ITIMER_VIRTUAL] = aitv; 472 break; 473 474 case ITIMER_PROF: 475 if (p->p_rprof_cyclic != CYCLIC_NONE) { 476 /* 477 * Silently ignore ITIMER_PROF if ITIMER_REALPROF 478 * is in effect. 479 */ 480 break; 481 } 482 483 ttolwp(curthread)->lwp_timer[ITIMER_PROF] = aitv; 484 break; 485 486 default: 487 mutex_exit(&p->p_lock); 488 return (EINVAL); 489 } 490 mutex_exit(&p->p_lock); 491 return (0); 492 } 493 494 /* 495 * Real interval timer expired: 496 * send process whose timer expired an alarm signal. 497 * If time is not set up to reload, then just return. 498 * Else compute next time timer should go off which is > current time. 499 * This is where delay in processing this timeout causes multiple 500 * SIGALRM calls to be compressed into one. 501 */ 502 static void 503 realitexpire(void *arg) 504 { 505 struct proc *p = arg; 506 struct timeval *valp = &p->p_realitimer.it_value; 507 struct timeval *intervalp = &p->p_realitimer.it_interval; 508 #if !defined(_LP64) 509 clock_t ticks; 510 #endif 511 512 mutex_enter(&p->p_lock); 513 #if !defined(_LP64) 514 if ((ticks = hzto(valp)) > 1) { 515 /* 516 * If we are executing before we were meant to, it must be 517 * because of an overflow in a prior hzto() calculation. 518 * In this case, we want to go to sleep for the recalculated 519 * number of ticks. For the special meaning of the value "1" 520 * see comment in timespectohz(). 521 */ 522 p->p_itimerid = realtime_timeout(realitexpire, p, ticks); 523 mutex_exit(&p->p_lock); 524 return; 525 } 526 #endif 527 sigtoproc(p, NULL, SIGALRM); 528 if (!timerisset(intervalp)) { 529 timerclear(valp); 530 p->p_itimerid = 0; 531 } else { 532 /* advance timer value past current time */ 533 timeval_advance(valp, intervalp); 534 p->p_itimerid = realtime_timeout(realitexpire, p, hzto(valp)); 535 } 536 mutex_exit(&p->p_lock); 537 } 538 539 /* 540 * Real time profiling interval timer expired: 541 * Increment microstate counters for each lwp in the process 542 * and ensure that running lwps are kicked into the kernel. 543 * If time is not set up to reload, then just return. 544 * Else compute next time timer should go off which is > current time, 545 * as above. 546 */ 547 static void 548 realprofexpire(void *arg) 549 { 550 struct proc *p = arg; 551 kthread_t *t; 552 553 mutex_enter(&p->p_lock); 554 if ((t = p->p_tlist) == NULL) { 555 mutex_exit(&p->p_lock); 556 return; 557 } 558 do { 559 int mstate; 560 561 /* 562 * Attempt to allocate the SIGPROF buffer, but don't sleep. 563 */ 564 if (t->t_rprof == NULL) 565 t->t_rprof = kmem_zalloc(sizeof (struct rprof), 566 KM_NOSLEEP); 567 if (t->t_rprof == NULL) 568 continue; 569 570 thread_lock(t); 571 switch (t->t_state) { 572 case TS_SLEEP: 573 /* 574 * Don't touch the lwp is it is swapped out. 575 */ 576 if (!(t->t_schedflag & TS_LOAD)) { 577 mstate = LMS_SLEEP; 578 break; 579 } 580 switch (mstate = ttolwp(t)->lwp_mstate.ms_prev) { 581 case LMS_TFAULT: 582 case LMS_DFAULT: 583 case LMS_KFAULT: 584 case LMS_USER_LOCK: 585 break; 586 default: 587 mstate = LMS_SLEEP; 588 break; 589 } 590 break; 591 case TS_RUN: 592 mstate = LMS_WAIT_CPU; 593 break; 594 case TS_ONPROC: 595 switch (mstate = t->t_mstate) { 596 case LMS_USER: 597 case LMS_SYSTEM: 598 case LMS_TRAP: 599 break; 600 default: 601 mstate = LMS_SYSTEM; 602 break; 603 } 604 break; 605 default: 606 mstate = t->t_mstate; 607 break; 608 } 609 t->t_rprof->rp_anystate = 1; 610 t->t_rprof->rp_state[mstate]++; 611 aston(t); 612 /* 613 * force the thread into the kernel 614 * if it is not already there. 615 */ 616 if (t->t_state == TS_ONPROC && t->t_cpu != CPU) 617 poke_cpu(t->t_cpu->cpu_id); 618 thread_unlock(t); 619 } while ((t = t->t_forw) != p->p_tlist); 620 621 mutex_exit(&p->p_lock); 622 } 623 624 /* 625 * Advances timer value past the current time of day. See the detailed 626 * comment for this logic in realitsexpire(), above. 627 */ 628 static void 629 timeval_advance(struct timeval *valp, struct timeval *intervalp) 630 { 631 int cnt2nth; 632 struct timeval interval2nth; 633 634 for (;;) { 635 interval2nth = *intervalp; 636 for (cnt2nth = 0; ; cnt2nth++) { 637 timevaladd(valp, &interval2nth); 638 /*CSTYLED*/ 639 if (TVTSCMP(valp, &hrestime, >)) 640 break; 641 timevaladd(&interval2nth, &interval2nth); 642 } 643 if (cnt2nth == 0) 644 break; 645 timevalsub(valp, &interval2nth); 646 } 647 } 648 649 /* 650 * Check that a proposed value to load into the .it_value or .it_interval 651 * part of an interval timer is acceptable, and set it to at least a 652 * specified minimal value. 653 */ 654 int 655 itimerfix(struct timeval *tv, int minimum) 656 { 657 if (tv->tv_sec < 0 || tv->tv_sec > 100000000 || 658 tv->tv_usec < 0 || tv->tv_usec >= MICROSEC) 659 return (EINVAL); 660 if (tv->tv_sec == 0 && tv->tv_usec != 0 && tv->tv_usec < minimum) 661 tv->tv_usec = minimum; 662 return (0); 663 } 664 665 /* 666 * Same as itimerfix, except a) it takes a timespec instead of a timeval and 667 * b) it doesn't truncate based on timeout granularity; consumers of this 668 * interface (e.g. timer_settime()) depend on the passed timespec not being 669 * modified implicitly. 670 */ 671 int 672 itimerspecfix(timespec_t *tv) 673 { 674 if (tv->tv_sec < 0 || tv->tv_nsec < 0 || tv->tv_nsec >= NANOSEC) 675 return (EINVAL); 676 return (0); 677 } 678 679 /* 680 * Decrement an interval timer by a specified number 681 * of microseconds, which must be less than a second, 682 * i.e. < 1000000. If the timer expires, then reload 683 * it. In this case, carry over (usec - old value) to 684 * reducint the value reloaded into the timer so that 685 * the timer does not drift. This routine assumes 686 * that it is called in a context where the timers 687 * on which it is operating cannot change in value. 688 */ 689 int 690 itimerdecr(struct itimerval *itp, int usec) 691 { 692 if (itp->it_value.tv_usec < usec) { 693 if (itp->it_value.tv_sec == 0) { 694 /* expired, and already in next interval */ 695 usec -= itp->it_value.tv_usec; 696 goto expire; 697 } 698 itp->it_value.tv_usec += MICROSEC; 699 itp->it_value.tv_sec--; 700 } 701 itp->it_value.tv_usec -= usec; 702 usec = 0; 703 if (timerisset(&itp->it_value)) 704 return (1); 705 /* expired, exactly at end of interval */ 706 expire: 707 if (timerisset(&itp->it_interval)) { 708 itp->it_value = itp->it_interval; 709 itp->it_value.tv_usec -= usec; 710 if (itp->it_value.tv_usec < 0) { 711 itp->it_value.tv_usec += MICROSEC; 712 itp->it_value.tv_sec--; 713 } 714 } else 715 itp->it_value.tv_usec = 0; /* sec is already 0 */ 716 return (0); 717 } 718 719 /* 720 * Add and subtract routines for timevals. 721 * N.B.: subtract routine doesn't deal with 722 * results which are before the beginning, 723 * it just gets very confused in this case. 724 * Caveat emptor. 725 */ 726 void 727 timevaladd(struct timeval *t1, struct timeval *t2) 728 { 729 t1->tv_sec += t2->tv_sec; 730 t1->tv_usec += t2->tv_usec; 731 timevalfix(t1); 732 } 733 734 void 735 timevalsub(struct timeval *t1, struct timeval *t2) 736 { 737 t1->tv_sec -= t2->tv_sec; 738 t1->tv_usec -= t2->tv_usec; 739 timevalfix(t1); 740 } 741 742 void 743 timevalfix(struct timeval *t1) 744 { 745 if (t1->tv_usec < 0) { 746 t1->tv_sec--; 747 t1->tv_usec += MICROSEC; 748 } 749 if (t1->tv_usec >= MICROSEC) { 750 t1->tv_sec++; 751 t1->tv_usec -= MICROSEC; 752 } 753 } 754 755 /* 756 * Same as the routines above. These routines take a timespec instead 757 * of a timeval. 758 */ 759 void 760 timespecadd(timespec_t *t1, timespec_t *t2) 761 { 762 t1->tv_sec += t2->tv_sec; 763 t1->tv_nsec += t2->tv_nsec; 764 timespecfix(t1); 765 } 766 767 void 768 timespecsub(timespec_t *t1, timespec_t *t2) 769 { 770 t1->tv_sec -= t2->tv_sec; 771 t1->tv_nsec -= t2->tv_nsec; 772 timespecfix(t1); 773 } 774 775 void 776 timespecfix(timespec_t *t1) 777 { 778 if (t1->tv_nsec < 0) { 779 t1->tv_sec--; 780 t1->tv_nsec += NANOSEC; 781 } else { 782 if (t1->tv_nsec >= NANOSEC) { 783 t1->tv_sec++; 784 t1->tv_nsec -= NANOSEC; 785 } 786 } 787 } 788 789 /* 790 * Compute number of hz until specified time. 791 * Used to compute third argument to timeout() from an absolute time. 792 */ 793 clock_t 794 hzto(struct timeval *tv) 795 { 796 timespec_t ts, now; 797 798 ts.tv_sec = tv->tv_sec; 799 ts.tv_nsec = tv->tv_usec * 1000; 800 gethrestime_lasttick(&now); 801 802 return (timespectohz(&ts, now)); 803 } 804 805 /* 806 * Compute number of hz until specified time for a given timespec value. 807 * Used to compute third argument to timeout() from an absolute time. 808 */ 809 clock_t 810 timespectohz(timespec_t *tv, timespec_t now) 811 { 812 clock_t ticks; 813 time_t sec; 814 int nsec; 815 816 /* 817 * Compute number of ticks we will see between now and 818 * the target time; returns "1" if the destination time 819 * is before the next tick, so we always get some delay, 820 * and returns LONG_MAX ticks if we would overflow. 821 */ 822 sec = tv->tv_sec - now.tv_sec; 823 nsec = tv->tv_nsec - now.tv_nsec + nsec_per_tick - 1; 824 825 if (nsec < 0) { 826 sec--; 827 nsec += NANOSEC; 828 } else if (nsec >= NANOSEC) { 829 sec++; 830 nsec -= NANOSEC; 831 } 832 833 ticks = NSEC_TO_TICK(nsec); 834 835 /* 836 * Compute ticks, accounting for negative and overflow as above. 837 * Overflow protection kicks in at about 70 weeks for hz=50 838 * and at about 35 weeks for hz=100. (Rather longer for the 64-bit 839 * kernel :-) 840 */ 841 if (sec < 0 || (sec == 0 && ticks < 1)) 842 ticks = 1; /* protect vs nonpositive */ 843 else if (sec > (LONG_MAX - ticks) / hz) 844 ticks = LONG_MAX; /* protect vs overflow */ 845 else 846 ticks += sec * hz; /* common case */ 847 848 return (ticks); 849 } 850 851 /* 852 * Same as timespectohz() except that we adjust the clock ticks down a bit. 853 * If we will be waiting for a long time, we may encounter skewing problems 854 * due to adjtime() system calls. Since we can skew up to 1/16 lbolt rate 855 * if adjtime is going crazy, we reduce the time delta since timeout() takes 856 * clock ticks rather than wallclock elapsed time. This may cause the caller 857 * (who calls timeout()) to return with a timeout prematurely and callers 858 * must accommodate this. See lwp_timeout(), queue_lwptimer() and 859 * cv_waituntil_sig(), currently the only callers of this function. 860 */ 861 clock_t 862 timespectohz_adj(timespec_t *tv, timespec_t now) 863 { 864 timespec_t wait_time = *tv; 865 866 timespecsub(&wait_time, &now); 867 wait_time.tv_sec -= wait_time.tv_sec >> 4; 868 wait_time.tv_nsec -= wait_time.tv_nsec >> 4; 869 timespecadd(&wait_time, &now); 870 return (timespectohz(&wait_time, now)); 871 } 872 873 /* 874 * hrt2ts(): convert from hrtime_t to timestruc_t. 875 * 876 * All this routine really does is: 877 * 878 * tsp->sec = hrt / NANOSEC; 879 * tsp->nsec = hrt % NANOSEC; 880 * 881 * The black magic below avoids doing a 64-bit by 32-bit integer divide, 882 * which is quite expensive. There's actually much more going on here than 883 * it might first appear -- don't try this at home. 884 * 885 * For the adventuresome, here's an explanation of how it works. 886 * 887 * Multiplication by a fixed constant is easy -- you just do the appropriate 888 * shifts and adds. For example, to multiply by 10, we observe that 889 * 890 * x * 10 = x * (8 + 2) 891 * = (x * 8) + (x * 2) 892 * = (x << 3) + (x << 1). 893 * 894 * In general, you can read the algorithm right off the bits: the number 10 895 * is 1010 in binary; bits 1 and 3 are ones, so x * 10 = (x << 1) + (x << 3). 896 * 897 * Sometimes you can do better. For example, 15 is 1111 binary, so the normal 898 * shift/add computation is x * 15 = (x << 0) + (x << 1) + (x << 2) + (x << 3). 899 * But, it's cheaper if you capitalize on the fact that you have a run of ones: 900 * 1111 = 10000 - 1, hence x * 15 = (x << 4) - (x << 0). [You would never 901 * actually perform the operation << 0, since it's a no-op; I'm just writing 902 * it that way for clarity.] 903 * 904 * The other way you can win is if you get lucky with the prime factorization 905 * of your constant. The number 1,000,000,000, which we have to multiply 906 * by below, is a good example. One billion is 111011100110101100101000000000 907 * in binary. If you apply the bit-grouping trick, it doesn't buy you very 908 * much, because it's only a win for groups of three or more equal bits: 909 * 910 * 111011100110101100101000000000 = 1000000000000000000000000000000 911 * - 000100011001010011011000000000 912 * 913 * Thus, instead of the 13 shift/add pairs (26 operations) implied by the LHS, 914 * we have reduced this to 10 shift/add pairs (20 operations) on the RHS. 915 * This is better, but not great. 916 * 917 * However, we can factor 1,000,000,000 = 2^9 * 5^9 = 2^9 * 125 * 125 * 125, 918 * and multiply by each factor. Multiplication by 125 is particularly easy, 919 * since 128 is nearby: x * 125 = (x << 7) - x - x - x, which is just four 920 * operations. So, to multiply by 1,000,000,000, we perform three multipli- 921 * cations by 125, then << 9, a total of only 3 * 4 + 1 = 13 operations. 922 * This is the algorithm we actually use in both hrt2ts() and ts2hrt(). 923 * 924 * Division is harder; there is no equivalent of the simple shift-add algorithm 925 * we used for multiplication. However, we can convert the division problem 926 * into a multiplication problem by pre-computing the binary representation 927 * of the reciprocal of the divisor. For the case of interest, we have 928 * 929 * 1 / 1,000,000,000 = 1.0001001011100000101111101000001B-30, 930 * 931 * to 32 bits of precision. (The notation B-30 means "* 2^-30", just like 932 * E-18 means "* 10^-18".) 933 * 934 * So, to compute x / 1,000,000,000, we just multiply x by the 32-bit 935 * integer 10001001011100000101111101000001, then normalize (shift) the 936 * result. This constant has several large bits runs, so the multiply 937 * is relatively cheap: 938 * 939 * 10001001011100000101111101000001 = 10001001100000000110000001000001 940 * - 00000000000100000000000100000000 941 * 942 * Again, you can just read the algorithm right off the bits: 943 * 944 * sec = hrt; 945 * sec += (hrt << 6); 946 * sec -= (hrt << 8); 947 * sec += (hrt << 13); 948 * sec += (hrt << 14); 949 * sec -= (hrt << 20); 950 * sec += (hrt << 23); 951 * sec += (hrt << 24); 952 * sec += (hrt << 27); 953 * sec += (hrt << 31); 954 * sec >>= (32 + 30); 955 * 956 * Voila! The only problem is, since hrt is 64 bits, we need to use 96-bit 957 * arithmetic to perform this calculation. That's a waste, because ultimately 958 * we only need the highest 32 bits of the result. 959 * 960 * The first thing we do is to realize that we don't need to use all of hrt 961 * in the calculation. The lowest 30 bits can contribute at most 1 to the 962 * quotient (2^30 / 1,000,000,000 = 1.07...), so we'll deal with them later. 963 * The highest 2 bits have to be zero, or hrt won't fit in a timestruc_t. 964 * Thus, the only bits of hrt that matter for division are bits 30..61. 965 * These 32 bits are just the lower-order word of (hrt >> 30). This brings 966 * us down from 96-bit math to 64-bit math, and our algorithm becomes: 967 * 968 * tmp = (uint32_t) (hrt >> 30); 969 * sec = tmp; 970 * sec += (tmp << 6); 971 * sec -= (tmp << 8); 972 * sec += (tmp << 13); 973 * sec += (tmp << 14); 974 * sec -= (tmp << 20); 975 * sec += (tmp << 23); 976 * sec += (tmp << 24); 977 * sec += (tmp << 27); 978 * sec += (tmp << 31); 979 * sec >>= 32; 980 * 981 * Next, we're going to reduce this 64-bit computation to a 32-bit 982 * computation. We begin by rewriting the above algorithm to use relative 983 * shifts instead of absolute shifts. That is, instead of computing 984 * tmp << 6, tmp << 8, tmp << 13, etc, we'll just shift incrementally: 985 * tmp <<= 6, tmp <<= 2 (== 8 - 6), tmp <<= 5 (== 13 - 8), etc: 986 * 987 * tmp = (uint32_t) (hrt >> 30); 988 * sec = tmp; 989 * tmp <<= 6; sec += tmp; 990 * tmp <<= 2; sec -= tmp; 991 * tmp <<= 5; sec += tmp; 992 * tmp <<= 1; sec += tmp; 993 * tmp <<= 6; sec -= tmp; 994 * tmp <<= 3; sec += tmp; 995 * tmp <<= 1; sec += tmp; 996 * tmp <<= 3; sec += tmp; 997 * tmp <<= 4; sec += tmp; 998 * sec >>= 32; 999 * 1000 * Now for the final step. Instead of throwing away the low 32 bits at 1001 * the end, we can throw them away as we go, only keeping the high 32 bits 1002 * of the product at each step. So, for example, where we now have 1003 * 1004 * tmp <<= 6; sec = sec + tmp; 1005 * we will instead have 1006 * tmp <<= 6; sec = (sec + tmp) >> 6; 1007 * which is equivalent to 1008 * sec = (sec >> 6) + tmp; 1009 * 1010 * The final shift ("sec >>= 32") goes away. 1011 * 1012 * All we're really doing here is long multiplication, just like we learned in 1013 * grade school, except that at each step, we only look at the leftmost 32 1014 * columns. The cumulative error is, at most, the sum of all the bits we 1015 * throw away, which is 2^-32 + 2^-31 + ... + 2^-2 + 2^-1 == 1 - 2^-32. 1016 * Thus, the final result ("sec") is correct to +/- 1. 1017 * 1018 * It turns out to be important to keep "sec" positive at each step, because 1019 * we don't want to have to explicitly extend the sign bit. Therefore, 1020 * starting with the last line of code above, each line that would have read 1021 * "sec = (sec >> n) - tmp" must be changed to "sec = tmp - (sec >> n)", and 1022 * the operators (+ or -) in all previous lines must be toggled accordingly. 1023 * Thus, we end up with: 1024 * 1025 * tmp = (uint32_t) (hrt >> 30); 1026 * sec = tmp + (sec >> 6); 1027 * sec = tmp - (tmp >> 2); 1028 * sec = tmp - (sec >> 5); 1029 * sec = tmp + (sec >> 1); 1030 * sec = tmp - (sec >> 6); 1031 * sec = tmp - (sec >> 3); 1032 * sec = tmp + (sec >> 1); 1033 * sec = tmp + (sec >> 3); 1034 * sec = tmp + (sec >> 4); 1035 * 1036 * This yields a value for sec that is accurate to +1/-1, so we have two 1037 * cases to deal with. The mysterious-looking "+ 7" in the code below biases 1038 * the rounding toward zero, so that sec is always less than or equal to 1039 * the correct value. With this modified code, sec is accurate to +0/-2, with 1040 * the -2 case being very rare in practice. With this change, we only have to 1041 * deal with one case (sec too small) in the cleanup code. 1042 * 1043 * The other modification we make is to delete the second line above 1044 * ("sec = tmp + (sec >> 6);"), since it only has an effect when bit 31 is 1045 * set, and the cleanup code can handle that rare case. This reduces the 1046 * *guaranteed* accuracy of sec to +0/-3, but speeds up the common cases. 1047 * 1048 * Finally, we compute nsec = hrt - (sec * 1,000,000,000). nsec will always 1049 * be positive (since sec is never too large), and will at most be equal to 1050 * the error in sec (times 1,000,000,000) plus the low-order 30 bits of hrt. 1051 * Thus, nsec < 3 * 1,000,000,000 + 2^30, which is less than 2^32, so we can 1052 * safely assume that nsec fits in 32 bits. Consequently, when we compute 1053 * sec * 1,000,000,000, we only need the low 32 bits, so we can just do 32-bit 1054 * arithmetic and let the high-order bits fall off the end. 1055 * 1056 * Since nsec < 3 * 1,000,000,000 + 2^30 == 4,073,741,824, the cleanup loop: 1057 * 1058 * while (nsec >= NANOSEC) { 1059 * nsec -= NANOSEC; 1060 * sec++; 1061 * } 1062 * 1063 * is guaranteed to complete in at most 4 iterations. In practice, the loop 1064 * completes in 0 or 1 iteration over 95% of the time. 1065 * 1066 * On an SS2, this implementation of hrt2ts() takes 1.7 usec, versus about 1067 * 35 usec for software division -- about 20 times faster. 1068 */ 1069 void 1070 hrt2ts(hrtime_t hrt, timestruc_t *tsp) 1071 { 1072 uint32_t sec, nsec, tmp; 1073 1074 tmp = (uint32_t)(hrt >> 30); 1075 sec = tmp - (tmp >> 2); 1076 sec = tmp - (sec >> 5); 1077 sec = tmp + (sec >> 1); 1078 sec = tmp - (sec >> 6) + 7; 1079 sec = tmp - (sec >> 3); 1080 sec = tmp + (sec >> 1); 1081 sec = tmp + (sec >> 3); 1082 sec = tmp + (sec >> 4); 1083 tmp = (sec << 7) - sec - sec - sec; 1084 tmp = (tmp << 7) - tmp - tmp - tmp; 1085 tmp = (tmp << 7) - tmp - tmp - tmp; 1086 nsec = (uint32_t)hrt - (tmp << 9); 1087 while (nsec >= NANOSEC) { 1088 nsec -= NANOSEC; 1089 sec++; 1090 } 1091 tsp->tv_sec = (time_t)sec; 1092 tsp->tv_nsec = nsec; 1093 } 1094 1095 /* 1096 * Convert from timestruc_t to hrtime_t. 1097 * 1098 * The code below is equivalent to: 1099 * 1100 * hrt = tsp->tv_sec * NANOSEC + tsp->tv_nsec; 1101 * 1102 * but requires no integer multiply. 1103 */ 1104 hrtime_t 1105 ts2hrt(const timestruc_t *tsp) 1106 { 1107 hrtime_t hrt; 1108 1109 hrt = tsp->tv_sec; 1110 hrt = (hrt << 7) - hrt - hrt - hrt; 1111 hrt = (hrt << 7) - hrt - hrt - hrt; 1112 hrt = (hrt << 7) - hrt - hrt - hrt; 1113 hrt = (hrt << 9) + tsp->tv_nsec; 1114 return (hrt); 1115 } 1116 1117 /* 1118 * For the various 32-bit "compatibility" paths in the system. 1119 */ 1120 void 1121 hrt2ts32(hrtime_t hrt, timestruc32_t *ts32p) 1122 { 1123 timestruc_t ts; 1124 1125 hrt2ts(hrt, &ts); 1126 TIMESPEC_TO_TIMESPEC32(ts32p, &ts); 1127 } 1128 1129 /* 1130 * If this ever becomes performance critical (ha!), we can borrow the 1131 * code from ts2hrt(), above, to multiply tv_sec by 1,000,000 and the 1132 * straightforward (x << 10) - (x << 5) + (x << 3) to multiply tv_usec by 1133 * 1,000. For now, we'll opt for readability (besides, the compiler does 1134 * a passable job of optimizing constant multiplication into shifts and adds). 1135 */ 1136 hrtime_t 1137 tv2hrt(struct timeval *tvp) 1138 { 1139 return ((hrtime_t)tvp->tv_sec * NANOSEC + 1140 (hrtime_t)tvp->tv_usec * (NANOSEC / MICROSEC)); 1141 } 1142 1143 void 1144 hrt2tv(hrtime_t hrt, struct timeval *tvp) 1145 { 1146 uint32_t sec, nsec, tmp; 1147 uint32_t q, r, t; 1148 1149 tmp = (uint32_t)(hrt >> 30); 1150 sec = tmp - (tmp >> 2); 1151 sec = tmp - (sec >> 5); 1152 sec = tmp + (sec >> 1); 1153 sec = tmp - (sec >> 6) + 7; 1154 sec = tmp - (sec >> 3); 1155 sec = tmp + (sec >> 1); 1156 sec = tmp + (sec >> 3); 1157 sec = tmp + (sec >> 4); 1158 tmp = (sec << 7) - sec - sec - sec; 1159 tmp = (tmp << 7) - tmp - tmp - tmp; 1160 tmp = (tmp << 7) - tmp - tmp - tmp; 1161 nsec = (uint32_t)hrt - (tmp << 9); 1162 while (nsec >= NANOSEC) { 1163 nsec -= NANOSEC; 1164 sec++; 1165 } 1166 tvp->tv_sec = (time_t)sec; 1167 /* 1168 * this routine is very similar to hr2ts, but requires microseconds 1169 * instead of nanoseconds, so an interger divide by 1000 routine 1170 * completes the conversion 1171 */ 1172 t = (nsec >> 7) + (nsec >> 8) + (nsec >> 12); 1173 q = (nsec >> 1) + t + (nsec >> 15) + (t >> 11) + (t >> 14); 1174 q = q >> 9; 1175 r = nsec - q*1000; 1176 tvp->tv_usec = q + ((r + 24) >> 10); 1177 1178 } 1179 1180 int 1181 nanosleep(timespec_t *rqtp, timespec_t *rmtp) 1182 { 1183 timespec_t rqtime; 1184 timespec_t rmtime; 1185 timespec_t now; 1186 int timecheck; 1187 int ret = 1; 1188 model_t datamodel = get_udatamodel(); 1189 1190 if (datamodel == DATAMODEL_NATIVE) { 1191 if (copyin(rqtp, &rqtime, sizeof (rqtime))) 1192 return (set_errno(EFAULT)); 1193 } else { 1194 timespec32_t rqtime32; 1195 1196 if (copyin(rqtp, &rqtime32, sizeof (rqtime32))) 1197 return (set_errno(EFAULT)); 1198 TIMESPEC32_TO_TIMESPEC(&rqtime, &rqtime32); 1199 } 1200 1201 if (rqtime.tv_sec < 0 || rqtime.tv_nsec < 0 || 1202 rqtime.tv_nsec >= NANOSEC) 1203 return (set_errno(EINVAL)); 1204 1205 if (timerspecisset(&rqtime)) { 1206 timecheck = timechanged; 1207 gethrestime(&now); 1208 timespecadd(&rqtime, &now); 1209 mutex_enter(&curthread->t_delay_lock); 1210 while ((ret = cv_waituntil_sig(&curthread->t_delay_cv, 1211 &curthread->t_delay_lock, &rqtime, timecheck)) > 0) 1212 continue; 1213 mutex_exit(&curthread->t_delay_lock); 1214 } 1215 1216 if (rmtp) { 1217 /* 1218 * If cv_waituntil_sig() returned due to a signal, and 1219 * there is time remaining, then set the time remaining. 1220 * Else set time remaining to zero 1221 */ 1222 rmtime.tv_sec = rmtime.tv_nsec = 0; 1223 if (ret == 0) { 1224 gethrestime(&now); 1225 if ((now.tv_sec < rqtime.tv_sec) || 1226 ((now.tv_sec == rqtime.tv_sec) && 1227 (now.tv_nsec < rqtime.tv_nsec))) { 1228 rmtime = rqtime; 1229 timespecsub(&rmtime, &now); 1230 } 1231 } 1232 1233 if (datamodel == DATAMODEL_NATIVE) { 1234 if (copyout(&rmtime, rmtp, sizeof (rmtime))) 1235 return (set_errno(EFAULT)); 1236 } else { 1237 timespec32_t rmtime32; 1238 1239 TIMESPEC_TO_TIMESPEC32(&rmtime32, &rmtime); 1240 if (copyout(&rmtime32, rmtp, sizeof (rmtime32))) 1241 return (set_errno(EFAULT)); 1242 } 1243 } 1244 1245 if (ret == 0) 1246 return (set_errno(EINTR)); 1247 return (0); 1248 } 1249 1250 /* 1251 * Routines to convert standard UNIX time (seconds since Jan 1, 1970) 1252 * into year/month/day/hour/minute/second format, and back again. 1253 * Note: these routines require tod_lock held to protect cached state. 1254 */ 1255 static int days_thru_month[64] = { 1256 0, 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366, 0, 0, 1257 0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365, 0, 0, 1258 0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365, 0, 0, 1259 0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365, 0, 0, 1260 }; 1261 1262 todinfo_t saved_tod; 1263 int saved_utc = -60; 1264 1265 todinfo_t 1266 utc_to_tod(time_t utc) 1267 { 1268 long dse, day, month, year; 1269 todinfo_t tod; 1270 1271 ASSERT(MUTEX_HELD(&tod_lock)); 1272 1273 if (utc < 0) /* should never happen */ 1274 utc = 0; 1275 1276 saved_tod.tod_sec += utc - saved_utc; 1277 saved_utc = utc; 1278 if (saved_tod.tod_sec >= 0 && saved_tod.tod_sec < 60) 1279 return (saved_tod); /* only the seconds changed */ 1280 1281 dse = utc / 86400; /* days since epoch */ 1282 1283 tod.tod_sec = utc % 60; 1284 tod.tod_min = (utc % 3600) / 60; 1285 tod.tod_hour = (utc % 86400) / 3600; 1286 tod.tod_dow = (dse + 4) % 7 + 1; /* epoch was a Thursday */ 1287 1288 year = dse / 365 + 72; /* first guess -- always a bit too large */ 1289 do { 1290 year--; 1291 day = dse - 365 * (year - 70) - ((year - 69) >> 2); 1292 } while (day < 0); 1293 1294 month = ((year & 3) << 4) + 1; 1295 while (day >= days_thru_month[month + 1]) 1296 month++; 1297 1298 tod.tod_day = day - days_thru_month[month] + 1; 1299 tod.tod_month = month & 15; 1300 tod.tod_year = year; 1301 1302 saved_tod = tod; 1303 return (tod); 1304 } 1305 1306 time_t 1307 tod_to_utc(todinfo_t tod) 1308 { 1309 time_t utc; 1310 int year = tod.tod_year; 1311 int month = tod.tod_month + ((year & 3) << 4); 1312 #ifdef DEBUG 1313 /* only warn once, not each time called */ 1314 static int year_warn = 1; 1315 static int month_warn = 1; 1316 static int day_warn = 1; 1317 static int hour_warn = 1; 1318 static int min_warn = 1; 1319 static int sec_warn = 1; 1320 int days_diff = days_thru_month[month + 1] - days_thru_month[month]; 1321 #endif 1322 1323 ASSERT(MUTEX_HELD(&tod_lock)); 1324 1325 #ifdef DEBUG 1326 if (year_warn && (year < 70 || year > 8029)) { 1327 cmn_err(CE_WARN, 1328 "The hardware real-time clock appears to have the " 1329 "wrong years value %d -- time needs to be reset\n", 1330 year); 1331 year_warn = 0; 1332 } 1333 1334 if (month_warn && (tod.tod_month < 1 || tod.tod_month > 12)) { 1335 cmn_err(CE_WARN, 1336 "The hardware real-time clock appears to have the " 1337 "wrong months value %d -- time needs to be reset\n", 1338 tod.tod_month); 1339 month_warn = 0; 1340 } 1341 1342 if (day_warn && (tod.tod_day < 1 || tod.tod_day > days_diff)) { 1343 cmn_err(CE_WARN, 1344 "The hardware real-time clock appears to have the " 1345 "wrong days value %d -- time needs to be reset\n", 1346 tod.tod_day); 1347 day_warn = 0; 1348 } 1349 1350 if (hour_warn && (tod.tod_hour < 0 || tod.tod_hour > 23)) { 1351 cmn_err(CE_WARN, 1352 "The hardware real-time clock appears to have the " 1353 "wrong hours value %d -- time needs to be reset\n", 1354 tod.tod_hour); 1355 hour_warn = 0; 1356 } 1357 1358 if (min_warn && (tod.tod_min < 0 || tod.tod_min > 59)) { 1359 cmn_err(CE_WARN, 1360 "The hardware real-time clock appears to have the " 1361 "wrong minutes value %d -- time needs to be reset\n", 1362 tod.tod_min); 1363 min_warn = 0; 1364 } 1365 1366 if (sec_warn && (tod.tod_sec < 0 || tod.tod_sec > 59)) { 1367 cmn_err(CE_WARN, 1368 "The hardware real-time clock appears to have the " 1369 "wrong seconds value %d -- time needs to be reset\n", 1370 tod.tod_sec); 1371 sec_warn = 0; 1372 } 1373 #endif 1374 1375 utc = (year - 70); /* next 3 lines: utc = 365y + y/4 */ 1376 utc += (utc << 3) + (utc << 6); 1377 utc += (utc << 2) + ((year - 69) >> 2); 1378 utc += days_thru_month[month] + tod.tod_day - 1; 1379 utc = (utc << 3) + (utc << 4) + tod.tod_hour; /* 24 * day + hour */ 1380 utc = (utc << 6) - (utc << 2) + tod.tod_min; /* 60 * hour + min */ 1381 utc = (utc << 6) - (utc << 2) + tod.tod_sec; /* 60 * min + sec */ 1382 1383 return (utc); 1384 } 1385