]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/kern/kern_time.c
add -n option to suppress clearing the build tree and add -DNO_CLEAN
[FreeBSD/FreeBSD.git] / sys / kern / kern_time.c
1 /*-
2  * Copyright (c) 1982, 1986, 1989, 1993
3  *      The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 4. Neither the name of the University nor the names of its contributors
14  *    may be used to endorse or promote products derived from this software
15  *    without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  *
29  *      @(#)kern_time.c 8.1 (Berkeley) 6/10/93
30  */
31
32 #include <sys/cdefs.h>
33 __FBSDID("$FreeBSD$");
34
35 #include <sys/param.h>
36 #include <sys/systm.h>
37 #include <sys/limits.h>
38 #include <sys/clock.h>
39 #include <sys/lock.h>
40 #include <sys/mutex.h>
41 #include <sys/sysproto.h>
42 #include <sys/eventhandler.h>
43 #include <sys/resourcevar.h>
44 #include <sys/signalvar.h>
45 #include <sys/kernel.h>
46 #include <sys/syscallsubr.h>
47 #include <sys/sysctl.h>
48 #include <sys/sysent.h>
49 #include <sys/priv.h>
50 #include <sys/proc.h>
51 #include <sys/posix4.h>
52 #include <sys/time.h>
53 #include <sys/timers.h>
54 #include <sys/timetc.h>
55 #include <sys/vnode.h>
56
57 #include <vm/vm.h>
58 #include <vm/vm_extern.h>
59
60 #define MAX_CLOCKS      (CLOCK_MONOTONIC+1)
61
62 static struct kclock    posix_clocks[MAX_CLOCKS];
63 static uma_zone_t       itimer_zone = NULL;
64
65 /*
66  * Time of day and interval timer support.
67  *
68  * These routines provide the kernel entry points to get and set
69  * the time-of-day and per-process interval timers.  Subroutines
70  * here provide support for adding and subtracting timeval structures
71  * and decrementing interval timers, optionally reloading the interval
72  * timers when they expire.
73  */
74
75 static int      settime(struct thread *, struct timeval *);
76 static void     timevalfix(struct timeval *);
77 static void     no_lease_updatetime(int);
78
79 static void     itimer_start(void);
80 static int      itimer_init(void *, int, int);
81 static void     itimer_fini(void *, int);
82 static void     itimer_enter(struct itimer *);
83 static void     itimer_leave(struct itimer *);
84 static struct itimer *itimer_find(struct proc *, int);
85 static void     itimers_alloc(struct proc *);
86 static void     itimers_event_hook_exec(void *arg, struct proc *p, struct image_params *imgp);
87 static void     itimers_event_hook_exit(void *arg, struct proc *p);
88 static int      realtimer_create(struct itimer *);
89 static int      realtimer_gettime(struct itimer *, struct itimerspec *);
90 static int      realtimer_settime(struct itimer *, int,
91                         struct itimerspec *, struct itimerspec *);
92 static int      realtimer_delete(struct itimer *);
93 static void     realtimer_clocktime(clockid_t, struct timespec *);
94 static void     realtimer_expire(void *);
95 static int      kern_timer_create(struct thread *, clockid_t,
96                         struct sigevent *, int *, int);
97 static int      kern_timer_delete(struct thread *, int);
98
99 int             register_posix_clock(int, struct kclock *);
100 void            itimer_fire(struct itimer *it);
101 int             itimespecfix(struct timespec *ts);
102
103 #define CLOCK_CALL(clock, call, arglist)                \
104         ((*posix_clocks[clock].call) arglist)
105
106 SYSINIT(posix_timer, SI_SUB_P1003_1B, SI_ORDER_FIRST+4, itimer_start, NULL);
107
108
109 static void 
110 no_lease_updatetime(deltat)
111         int deltat;
112 {
113 }
114
115 void (*lease_updatetime)(int)  = no_lease_updatetime;
116
117 static int
118 settime(struct thread *td, struct timeval *tv)
119 {
120         struct timeval delta, tv1, tv2;
121         static struct timeval maxtime, laststep;
122         struct timespec ts;
123         int s;
124
125         s = splclock();
126         microtime(&tv1);
127         delta = *tv;
128         timevalsub(&delta, &tv1);
129
130         /*
131          * If the system is secure, we do not allow the time to be 
132          * set to a value earlier than 1 second less than the highest
133          * time we have yet seen. The worst a miscreant can do in
134          * this circumstance is "freeze" time. He couldn't go
135          * back to the past.
136          *
137          * We similarly do not allow the clock to be stepped more
138          * than one second, nor more than once per second. This allows
139          * a miscreant to make the clock march double-time, but no worse.
140          */
141         if (securelevel_gt(td->td_ucred, 1) != 0) {
142                 if (delta.tv_sec < 0 || delta.tv_usec < 0) {
143                         /*
144                          * Update maxtime to latest time we've seen.
145                          */
146                         if (tv1.tv_sec > maxtime.tv_sec)
147                                 maxtime = tv1;
148                         tv2 = *tv;
149                         timevalsub(&tv2, &maxtime);
150                         if (tv2.tv_sec < -1) {
151                                 tv->tv_sec = maxtime.tv_sec - 1;
152                                 printf("Time adjustment clamped to -1 second\n");
153                         }
154                 } else {
155                         if (tv1.tv_sec == laststep.tv_sec) {
156                                 splx(s);
157                                 return (EPERM);
158                         }
159                         if (delta.tv_sec > 1) {
160                                 tv->tv_sec = tv1.tv_sec + 1;
161                                 printf("Time adjustment clamped to +1 second\n");
162                         }
163                         laststep = *tv;
164                 }
165         }
166
167         ts.tv_sec = tv->tv_sec;
168         ts.tv_nsec = tv->tv_usec * 1000;
169         mtx_lock(&Giant);
170         tc_setclock(&ts);
171         (void) splsoftclock();
172         lease_updatetime(delta.tv_sec);
173         splx(s);
174         resettodr();
175         mtx_unlock(&Giant);
176         return (0);
177 }
178
179 #ifndef _SYS_SYSPROTO_H_
180 struct clock_gettime_args {
181         clockid_t clock_id;
182         struct  timespec *tp;
183 };
184 #endif
185 /* ARGSUSED */
186 int
187 clock_gettime(struct thread *td, struct clock_gettime_args *uap)
188 {
189         struct timespec ats;
190         int error;
191
192         error = kern_clock_gettime(td, uap->clock_id, &ats);
193         if (error == 0)
194                 error = copyout(&ats, uap->tp, sizeof(ats));
195
196         return (error);
197 }
198
199 int
200 kern_clock_gettime(struct thread *td, clockid_t clock_id, struct timespec *ats)
201 {
202         struct timeval sys, user;
203         struct proc *p;
204         uint64_t runtime, curtime, switchtime;
205
206         p = td->td_proc;
207         switch (clock_id) {
208         case CLOCK_REALTIME:            /* Default to precise. */
209         case CLOCK_REALTIME_PRECISE:
210                 nanotime(ats);
211                 break;
212         case CLOCK_REALTIME_FAST:
213                 getnanotime(ats);
214                 break;
215         case CLOCK_VIRTUAL:
216                 PROC_LOCK(p);
217                 PROC_SLOCK(p);
218                 calcru(p, &user, &sys);
219                 PROC_SUNLOCK(p);
220                 PROC_UNLOCK(p);
221                 TIMEVAL_TO_TIMESPEC(&user, ats);
222                 break;
223         case CLOCK_PROF:
224                 PROC_LOCK(p);
225                 PROC_SLOCK(p);
226                 calcru(p, &user, &sys);
227                 PROC_SUNLOCK(p);
228                 PROC_UNLOCK(p);
229                 timevaladd(&user, &sys);
230                 TIMEVAL_TO_TIMESPEC(&user, ats);
231                 break;
232         case CLOCK_MONOTONIC:           /* Default to precise. */
233         case CLOCK_MONOTONIC_PRECISE:
234         case CLOCK_UPTIME:
235         case CLOCK_UPTIME_PRECISE:
236                 nanouptime(ats);
237                 break;
238         case CLOCK_UPTIME_FAST:
239         case CLOCK_MONOTONIC_FAST:
240                 getnanouptime(ats);
241                 break;
242         case CLOCK_SECOND:
243                 ats->tv_sec = time_second;
244                 ats->tv_nsec = 0;
245                 break;
246         case CLOCK_THREAD_CPUTIME_ID:
247                 critical_enter();
248                 switchtime = PCPU_GET(switchtime);
249                 curtime = cpu_ticks();
250                 runtime = td->td_runtime;
251                 critical_exit();
252                 runtime = cputick2usec(runtime + curtime - switchtime);
253                 ats->tv_sec = runtime / 1000000;
254                 ats->tv_nsec = runtime % 1000000 * 1000;
255                 break;
256         default:
257                 return (EINVAL);
258         }
259         return (0);
260 }
261
262 #ifndef _SYS_SYSPROTO_H_
263 struct clock_settime_args {
264         clockid_t clock_id;
265         const struct    timespec *tp;
266 };
267 #endif
268 /* ARGSUSED */
269 int
270 clock_settime(struct thread *td, struct clock_settime_args *uap)
271 {
272         struct timespec ats;
273         int error;
274
275         if ((error = copyin(uap->tp, &ats, sizeof(ats))) != 0)
276                 return (error);
277         return (kern_clock_settime(td, uap->clock_id, &ats));
278 }
279
280 int
281 kern_clock_settime(struct thread *td, clockid_t clock_id, struct timespec *ats)
282 {
283         struct timeval atv;
284         int error;
285
286         if ((error = priv_check(td, PRIV_CLOCK_SETTIME)) != 0)
287                 return (error);
288         if (clock_id != CLOCK_REALTIME)
289                 return (EINVAL);
290         if (ats->tv_nsec < 0 || ats->tv_nsec >= 1000000000)
291                 return (EINVAL);
292         /* XXX Don't convert nsec->usec and back */
293         TIMESPEC_TO_TIMEVAL(&atv, ats);
294         error = settime(td, &atv);
295         return (error);
296 }
297
298 #ifndef _SYS_SYSPROTO_H_
299 struct clock_getres_args {
300         clockid_t clock_id;
301         struct  timespec *tp;
302 };
303 #endif
304 int
305 clock_getres(struct thread *td, struct clock_getres_args *uap)
306 {
307         struct timespec ts;
308         int error;
309
310         if (uap->tp == NULL)
311                 return (0);
312
313         error = kern_clock_getres(td, uap->clock_id, &ts);
314         if (error == 0)
315                 error = copyout(&ts, uap->tp, sizeof(ts));
316         return (error);
317 }
318
319 int
320 kern_clock_getres(struct thread *td, clockid_t clock_id, struct timespec *ts)
321 {
322
323         ts->tv_sec = 0;
324         switch (clock_id) {
325         case CLOCK_REALTIME:
326         case CLOCK_REALTIME_FAST:
327         case CLOCK_REALTIME_PRECISE:
328         case CLOCK_MONOTONIC:
329         case CLOCK_MONOTONIC_FAST:
330         case CLOCK_MONOTONIC_PRECISE:
331         case CLOCK_UPTIME:
332         case CLOCK_UPTIME_FAST:
333         case CLOCK_UPTIME_PRECISE:
334                 /*
335                  * Round up the result of the division cheaply by adding 1.
336                  * Rounding up is especially important if rounding down
337                  * would give 0.  Perfect rounding is unimportant.
338                  */
339                 ts->tv_nsec = 1000000000 / tc_getfrequency() + 1;
340                 break;
341         case CLOCK_VIRTUAL:
342         case CLOCK_PROF:
343                 /* Accurately round up here because we can do so cheaply. */
344                 ts->tv_nsec = (1000000000 + hz - 1) / hz;
345                 break;
346         case CLOCK_SECOND:
347                 ts->tv_sec = 1;
348                 ts->tv_nsec = 0;
349                 break;
350         case CLOCK_THREAD_CPUTIME_ID:
351                 /* sync with cputick2usec */
352                 ts->tv_nsec = 1000000 / cpu_tickrate();
353                 if (ts->tv_nsec == 0)
354                         ts->tv_nsec = 1000;
355                 break;
356         default:
357                 return (EINVAL);
358         }
359         return (0);
360 }
361
362 static int nanowait;
363
364 int
365 kern_nanosleep(struct thread *td, struct timespec *rqt, struct timespec *rmt)
366 {
367         struct timespec ts, ts2, ts3;
368         struct timeval tv;
369         int error;
370
371         if (rqt->tv_nsec < 0 || rqt->tv_nsec >= 1000000000)
372                 return (EINVAL);
373         if (rqt->tv_sec < 0 || (rqt->tv_sec == 0 && rqt->tv_nsec == 0))
374                 return (0);
375         getnanouptime(&ts);
376         timespecadd(&ts, rqt);
377         TIMESPEC_TO_TIMEVAL(&tv, rqt);
378         for (;;) {
379                 error = tsleep(&nanowait, PWAIT | PCATCH, "nanslp",
380                     tvtohz(&tv));
381                 getnanouptime(&ts2);
382                 if (error != EWOULDBLOCK) {
383                         if (error == ERESTART)
384                                 error = EINTR;
385                         if (rmt != NULL) {
386                                 timespecsub(&ts, &ts2);
387                                 if (ts.tv_sec < 0)
388                                         timespecclear(&ts);
389                                 *rmt = ts;
390                         }
391                         return (error);
392                 }
393                 if (timespeccmp(&ts2, &ts, >=))
394                         return (0);
395                 ts3 = ts;
396                 timespecsub(&ts3, &ts2);
397                 TIMESPEC_TO_TIMEVAL(&tv, &ts3);
398         }
399 }
400
401 #ifndef _SYS_SYSPROTO_H_
402 struct nanosleep_args {
403         struct  timespec *rqtp;
404         struct  timespec *rmtp;
405 };
406 #endif
407 /* ARGSUSED */
408 int
409 nanosleep(struct thread *td, struct nanosleep_args *uap)
410 {
411         struct timespec rmt, rqt;
412         int error;
413
414         error = copyin(uap->rqtp, &rqt, sizeof(rqt));
415         if (error)
416                 return (error);
417
418         if (uap->rmtp &&
419             !useracc((caddr_t)uap->rmtp, sizeof(rmt), VM_PROT_WRITE))
420                         return (EFAULT);
421         error = kern_nanosleep(td, &rqt, &rmt);
422         if (error && uap->rmtp) {
423                 int error2;
424
425                 error2 = copyout(&rmt, uap->rmtp, sizeof(rmt));
426                 if (error2)
427                         error = error2;
428         }
429         return (error);
430 }
431
432 #ifndef _SYS_SYSPROTO_H_
433 struct gettimeofday_args {
434         struct  timeval *tp;
435         struct  timezone *tzp;
436 };
437 #endif
438 /* ARGSUSED */
439 int
440 gettimeofday(struct thread *td, struct gettimeofday_args *uap)
441 {
442         struct timeval atv;
443         struct timezone rtz;
444         int error = 0;
445
446         if (uap->tp) {
447                 microtime(&atv);
448                 error = copyout(&atv, uap->tp, sizeof (atv));
449         }
450         if (error == 0 && uap->tzp != NULL) {
451                 rtz.tz_minuteswest = tz_minuteswest;
452                 rtz.tz_dsttime = tz_dsttime;
453                 error = copyout(&rtz, uap->tzp, sizeof (rtz));
454         }
455         return (error);
456 }
457
458 #ifndef _SYS_SYSPROTO_H_
459 struct settimeofday_args {
460         struct  timeval *tv;
461         struct  timezone *tzp;
462 };
463 #endif
464 /* ARGSUSED */
465 int
466 settimeofday(struct thread *td, struct settimeofday_args *uap)
467 {
468         struct timeval atv, *tvp;
469         struct timezone atz, *tzp;
470         int error;
471
472         if (uap->tv) {
473                 error = copyin(uap->tv, &atv, sizeof(atv));
474                 if (error)
475                         return (error);
476                 tvp = &atv;
477         } else
478                 tvp = NULL;
479         if (uap->tzp) {
480                 error = copyin(uap->tzp, &atz, sizeof(atz));
481                 if (error)
482                         return (error);
483                 tzp = &atz;
484         } else
485                 tzp = NULL;
486         return (kern_settimeofday(td, tvp, tzp));
487 }
488
489 int
490 kern_settimeofday(struct thread *td, struct timeval *tv, struct timezone *tzp)
491 {
492         int error;
493
494         error = priv_check(td, PRIV_SETTIMEOFDAY);
495         if (error)
496                 return (error);
497         /* Verify all parameters before changing time. */
498         if (tv) {
499                 if (tv->tv_usec < 0 || tv->tv_usec >= 1000000)
500                         return (EINVAL);
501                 error = settime(td, tv);
502         }
503         if (tzp && error == 0) {
504                 tz_minuteswest = tzp->tz_minuteswest;
505                 tz_dsttime = tzp->tz_dsttime;
506         }
507         return (error);
508 }
509
510 /*
511  * Get value of an interval timer.  The process virtual and profiling virtual
512  * time timers are kept in the p_stats area, since they can be swapped out.
513  * These are kept internally in the way they are specified externally: in
514  * time until they expire.
515  *
516  * The real time interval timer is kept in the process table slot for the
517  * process, and its value (it_value) is kept as an absolute time rather than
518  * as a delta, so that it is easy to keep periodic real-time signals from
519  * drifting.
520  *
521  * Virtual time timers are processed in the hardclock() routine of
522  * kern_clock.c.  The real time timer is processed by a timeout routine,
523  * called from the softclock() routine.  Since a callout may be delayed in
524  * real time due to interrupt processing in the system, it is possible for
525  * the real time timeout routine (realitexpire, given below), to be delayed
526  * in real time past when it is supposed to occur.  It does not suffice,
527  * therefore, to reload the real timer .it_value from the real time timers
528  * .it_interval.  Rather, we compute the next time in absolute time the timer
529  * should go off.
530  */
531 #ifndef _SYS_SYSPROTO_H_
532 struct getitimer_args {
533         u_int   which;
534         struct  itimerval *itv;
535 };
536 #endif
537 int
538 getitimer(struct thread *td, struct getitimer_args *uap)
539 {
540         struct itimerval aitv;
541         int error;
542
543         error = kern_getitimer(td, uap->which, &aitv);
544         if (error != 0)
545                 return (error);
546         return (copyout(&aitv, uap->itv, sizeof (struct itimerval)));
547 }
548
549 int
550 kern_getitimer(struct thread *td, u_int which, struct itimerval *aitv)
551 {
552         struct proc *p = td->td_proc;
553         struct timeval ctv;
554
555         if (which > ITIMER_PROF)
556                 return (EINVAL);
557
558         if (which == ITIMER_REAL) {
559                 /*
560                  * Convert from absolute to relative time in .it_value
561                  * part of real time timer.  If time for real time timer
562                  * has passed return 0, else return difference between
563                  * current time and time for the timer to go off.
564                  */
565                 PROC_LOCK(p);
566                 *aitv = p->p_realtimer;
567                 PROC_UNLOCK(p);
568                 if (timevalisset(&aitv->it_value)) {
569                         getmicrouptime(&ctv);
570                         if (timevalcmp(&aitv->it_value, &ctv, <))
571                                 timevalclear(&aitv->it_value);
572                         else
573                                 timevalsub(&aitv->it_value, &ctv);
574                 }
575         } else {
576                 PROC_SLOCK(p);
577                 *aitv = p->p_stats->p_timer[which];
578                 PROC_SUNLOCK(p);
579         }
580         return (0);
581 }
582
583 #ifndef _SYS_SYSPROTO_H_
584 struct setitimer_args {
585         u_int   which;
586         struct  itimerval *itv, *oitv;
587 };
588 #endif
589 int
590 setitimer(struct thread *td, struct setitimer_args *uap)
591 {
592         struct itimerval aitv, oitv;
593         int error;
594
595         if (uap->itv == NULL) {
596                 uap->itv = uap->oitv;
597                 return (getitimer(td, (struct getitimer_args *)uap));
598         }
599
600         if ((error = copyin(uap->itv, &aitv, sizeof(struct itimerval))))
601                 return (error);
602         error = kern_setitimer(td, uap->which, &aitv, &oitv);
603         if (error != 0 || uap->oitv == NULL)
604                 return (error);
605         return (copyout(&oitv, uap->oitv, sizeof(struct itimerval)));
606 }
607
608 int
609 kern_setitimer(struct thread *td, u_int which, struct itimerval *aitv,
610     struct itimerval *oitv)
611 {
612         struct proc *p = td->td_proc;
613         struct timeval ctv;
614
615         if (aitv == NULL)
616                 return (kern_getitimer(td, which, oitv));
617
618         if (which > ITIMER_PROF)
619                 return (EINVAL);
620         if (itimerfix(&aitv->it_value))
621                 return (EINVAL);
622         if (!timevalisset(&aitv->it_value))
623                 timevalclear(&aitv->it_interval);
624         else if (itimerfix(&aitv->it_interval))
625                 return (EINVAL);
626
627         if (which == ITIMER_REAL) {
628                 PROC_LOCK(p);
629                 if (timevalisset(&p->p_realtimer.it_value))
630                         callout_stop(&p->p_itcallout);
631                 getmicrouptime(&ctv);
632                 if (timevalisset(&aitv->it_value)) {
633                         callout_reset(&p->p_itcallout, tvtohz(&aitv->it_value),
634                             realitexpire, p);
635                         timevaladd(&aitv->it_value, &ctv);
636                 }
637                 *oitv = p->p_realtimer;
638                 p->p_realtimer = *aitv;
639                 PROC_UNLOCK(p);
640                 if (timevalisset(&oitv->it_value)) {
641                         if (timevalcmp(&oitv->it_value, &ctv, <))
642                                 timevalclear(&oitv->it_value);
643                         else
644                                 timevalsub(&oitv->it_value, &ctv);
645                 }
646         } else {
647                 PROC_SLOCK(p);
648                 *oitv = p->p_stats->p_timer[which];
649                 p->p_stats->p_timer[which] = *aitv;
650                 PROC_SUNLOCK(p);
651         }
652         return (0);
653 }
654
655 /*
656  * Real interval timer expired:
657  * send process whose timer expired an alarm signal.
658  * If time is not set up to reload, then just return.
659  * Else compute next time timer should go off which is > current time.
660  * This is where delay in processing this timeout causes multiple
661  * SIGALRM calls to be compressed into one.
662  * tvtohz() always adds 1 to allow for the time until the next clock
663  * interrupt being strictly less than 1 clock tick, but we don't want
664  * that here since we want to appear to be in sync with the clock
665  * interrupt even when we're delayed.
666  */
667 void
668 realitexpire(void *arg)
669 {
670         struct proc *p;
671         struct timeval ctv, ntv;
672
673         p = (struct proc *)arg;
674         PROC_LOCK(p);
675         psignal(p, SIGALRM);
676         if (!timevalisset(&p->p_realtimer.it_interval)) {
677                 timevalclear(&p->p_realtimer.it_value);
678                 if (p->p_flag & P_WEXIT)
679                         wakeup(&p->p_itcallout);
680                 PROC_UNLOCK(p);
681                 return;
682         }
683         for (;;) {
684                 timevaladd(&p->p_realtimer.it_value,
685                     &p->p_realtimer.it_interval);
686                 getmicrouptime(&ctv);
687                 if (timevalcmp(&p->p_realtimer.it_value, &ctv, >)) {
688                         ntv = p->p_realtimer.it_value;
689                         timevalsub(&ntv, &ctv);
690                         callout_reset(&p->p_itcallout, tvtohz(&ntv) - 1,
691                             realitexpire, p);
692                         PROC_UNLOCK(p);
693                         return;
694                 }
695         }
696         /*NOTREACHED*/
697 }
698
699 /*
700  * Check that a proposed value to load into the .it_value or
701  * .it_interval part of an interval timer is acceptable, and
702  * fix it to have at least minimal value (i.e. if it is less
703  * than the resolution of the clock, round it up.)
704  */
705 int
706 itimerfix(struct timeval *tv)
707 {
708
709         if (tv->tv_sec < 0 || tv->tv_usec < 0 || tv->tv_usec >= 1000000)
710                 return (EINVAL);
711         if (tv->tv_sec == 0 && tv->tv_usec != 0 && tv->tv_usec < tick)
712                 tv->tv_usec = tick;
713         return (0);
714 }
715
716 /*
717  * Decrement an interval timer by a specified number
718  * of microseconds, which must be less than a second,
719  * i.e. < 1000000.  If the timer expires, then reload
720  * it.  In this case, carry over (usec - old value) to
721  * reduce the value reloaded into the timer so that
722  * the timer does not drift.  This routine assumes
723  * that it is called in a context where the timers
724  * on which it is operating cannot change in value.
725  */
726 int
727 itimerdecr(struct itimerval *itp, int usec)
728 {
729
730         if (itp->it_value.tv_usec < usec) {
731                 if (itp->it_value.tv_sec == 0) {
732                         /* expired, and already in next interval */
733                         usec -= itp->it_value.tv_usec;
734                         goto expire;
735                 }
736                 itp->it_value.tv_usec += 1000000;
737                 itp->it_value.tv_sec--;
738         }
739         itp->it_value.tv_usec -= usec;
740         usec = 0;
741         if (timevalisset(&itp->it_value))
742                 return (1);
743         /* expired, exactly at end of interval */
744 expire:
745         if (timevalisset(&itp->it_interval)) {
746                 itp->it_value = itp->it_interval;
747                 itp->it_value.tv_usec -= usec;
748                 if (itp->it_value.tv_usec < 0) {
749                         itp->it_value.tv_usec += 1000000;
750                         itp->it_value.tv_sec--;
751                 }
752         } else
753                 itp->it_value.tv_usec = 0;              /* sec is already 0 */
754         return (0);
755 }
756
757 /*
758  * Add and subtract routines for timevals.
759  * N.B.: subtract routine doesn't deal with
760  * results which are before the beginning,
761  * it just gets very confused in this case.
762  * Caveat emptor.
763  */
764 void
765 timevaladd(struct timeval *t1, const struct timeval *t2)
766 {
767
768         t1->tv_sec += t2->tv_sec;
769         t1->tv_usec += t2->tv_usec;
770         timevalfix(t1);
771 }
772
773 void
774 timevalsub(struct timeval *t1, const struct timeval *t2)
775 {
776
777         t1->tv_sec -= t2->tv_sec;
778         t1->tv_usec -= t2->tv_usec;
779         timevalfix(t1);
780 }
781
782 static void
783 timevalfix(struct timeval *t1)
784 {
785
786         if (t1->tv_usec < 0) {
787                 t1->tv_sec--;
788                 t1->tv_usec += 1000000;
789         }
790         if (t1->tv_usec >= 1000000) {
791                 t1->tv_sec++;
792                 t1->tv_usec -= 1000000;
793         }
794 }
795
796 /*
797  * ratecheck(): simple time-based rate-limit checking.
798  */
799 int
800 ratecheck(struct timeval *lasttime, const struct timeval *mininterval)
801 {
802         struct timeval tv, delta;
803         int rv = 0;
804
805         getmicrouptime(&tv);            /* NB: 10ms precision */
806         delta = tv;
807         timevalsub(&delta, lasttime);
808
809         /*
810          * check for 0,0 is so that the message will be seen at least once,
811          * even if interval is huge.
812          */
813         if (timevalcmp(&delta, mininterval, >=) ||
814             (lasttime->tv_sec == 0 && lasttime->tv_usec == 0)) {
815                 *lasttime = tv;
816                 rv = 1;
817         }
818
819         return (rv);
820 }
821
822 /*
823  * ppsratecheck(): packets (or events) per second limitation.
824  *
825  * Return 0 if the limit is to be enforced (e.g. the caller
826  * should drop a packet because of the rate limitation).
827  *
828  * maxpps of 0 always causes zero to be returned.  maxpps of -1
829  * always causes 1 to be returned; this effectively defeats rate
830  * limiting.
831  *
832  * Note that we maintain the struct timeval for compatibility
833  * with other bsd systems.  We reuse the storage and just monitor
834  * clock ticks for minimal overhead.  
835  */
836 int
837 ppsratecheck(struct timeval *lasttime, int *curpps, int maxpps)
838 {
839         int now;
840
841         /*
842          * Reset the last time and counter if this is the first call
843          * or more than a second has passed since the last update of
844          * lasttime.
845          */
846         now = ticks;
847         if (lasttime->tv_sec == 0 || (u_int)(now - lasttime->tv_sec) >= hz) {
848                 lasttime->tv_sec = now;
849                 *curpps = 1;
850                 return (maxpps != 0);
851         } else {
852                 (*curpps)++;            /* NB: ignore potential overflow */
853                 return (maxpps < 0 || *curpps < maxpps);
854         }
855 }
856
857 static void
858 itimer_start(void)
859 {
860         struct kclock rt_clock = {
861                 .timer_create  = realtimer_create,
862                 .timer_delete  = realtimer_delete,
863                 .timer_settime = realtimer_settime,
864                 .timer_gettime = realtimer_gettime,
865                 .event_hook    = NULL
866         };
867
868         itimer_zone = uma_zcreate("itimer", sizeof(struct itimer),
869                 NULL, NULL, itimer_init, itimer_fini, UMA_ALIGN_PTR, 0);
870         register_posix_clock(CLOCK_REALTIME,  &rt_clock);
871         register_posix_clock(CLOCK_MONOTONIC, &rt_clock);
872         p31b_setcfg(CTL_P1003_1B_TIMERS, 200112L);
873         p31b_setcfg(CTL_P1003_1B_DELAYTIMER_MAX, INT_MAX);
874         p31b_setcfg(CTL_P1003_1B_TIMER_MAX, TIMER_MAX);
875         EVENTHANDLER_REGISTER(process_exit, itimers_event_hook_exit,
876                 (void *)ITIMER_EV_EXIT, EVENTHANDLER_PRI_ANY);
877         EVENTHANDLER_REGISTER(process_exec, itimers_event_hook_exec,
878                 (void *)ITIMER_EV_EXEC, EVENTHANDLER_PRI_ANY);
879 }
880
881 int
882 register_posix_clock(int clockid, struct kclock *clk)
883 {
884         if ((unsigned)clockid >= MAX_CLOCKS) {
885                 printf("%s: invalid clockid\n", __func__);
886                 return (0);
887         }
888         posix_clocks[clockid] = *clk;
889         return (1);
890 }
891
892 static int
893 itimer_init(void *mem, int size, int flags)
894 {
895         struct itimer *it;
896
897         it = (struct itimer *)mem;
898         mtx_init(&it->it_mtx, "itimer lock", NULL, MTX_DEF);
899         return (0);
900 }
901
902 static void
903 itimer_fini(void *mem, int size)
904 {
905         struct itimer *it;
906
907         it = (struct itimer *)mem;
908         mtx_destroy(&it->it_mtx);
909 }
910
911 static void
912 itimer_enter(struct itimer *it)
913 {
914
915         mtx_assert(&it->it_mtx, MA_OWNED);
916         it->it_usecount++;
917 }
918
919 static void
920 itimer_leave(struct itimer *it)
921 {
922
923         mtx_assert(&it->it_mtx, MA_OWNED);
924         KASSERT(it->it_usecount > 0, ("invalid it_usecount"));
925
926         if (--it->it_usecount == 0 && (it->it_flags & ITF_WANTED) != 0)
927                 wakeup(it);
928 }
929
930 #ifndef _SYS_SYSPROTO_H_
931 struct ktimer_create_args {
932         clockid_t clock_id;
933         struct sigevent * evp;
934         int * timerid;
935 };
936 #endif
937 int
938 ktimer_create(struct thread *td, struct ktimer_create_args *uap)
939 {
940         struct sigevent *evp1, ev;
941         int id;
942         int error;
943
944         if (uap->evp != NULL) {
945                 error = copyin(uap->evp, &ev, sizeof(ev));
946                 if (error != 0)
947                         return (error);
948                 evp1 = &ev;
949         } else
950                 evp1 = NULL;
951
952         error = kern_timer_create(td, uap->clock_id, evp1, &id, -1);
953
954         if (error == 0) {
955                 error = copyout(&id, uap->timerid, sizeof(int));
956                 if (error != 0)
957                         kern_timer_delete(td, id);
958         }
959         return (error);
960 }
961
962 static int
963 kern_timer_create(struct thread *td, clockid_t clock_id,
964         struct sigevent *evp, int *timerid, int preset_id)
965 {
966         struct proc *p = td->td_proc;
967         struct itimer *it;
968         int id;
969         int error;
970
971         if (clock_id < 0 || clock_id >= MAX_CLOCKS)
972                 return (EINVAL);
973
974         if (posix_clocks[clock_id].timer_create == NULL)
975                 return (EINVAL);
976
977         if (evp != NULL) {
978                 if (evp->sigev_notify != SIGEV_NONE &&
979                     evp->sigev_notify != SIGEV_SIGNAL &&
980                     evp->sigev_notify != SIGEV_THREAD_ID)
981                         return (EINVAL);
982                 if ((evp->sigev_notify == SIGEV_SIGNAL ||
983                      evp->sigev_notify == SIGEV_THREAD_ID) &&
984                         !_SIG_VALID(evp->sigev_signo))
985                         return (EINVAL);
986         }
987         
988         if (p->p_itimers == NULL)
989                 itimers_alloc(p);
990         
991         it = uma_zalloc(itimer_zone, M_WAITOK);
992         it->it_flags = 0;
993         it->it_usecount = 0;
994         it->it_active = 0;
995         timespecclear(&it->it_time.it_value);
996         timespecclear(&it->it_time.it_interval);
997         it->it_overrun = 0;
998         it->it_overrun_last = 0;
999         it->it_clockid = clock_id;
1000         it->it_timerid = -1;
1001         it->it_proc = p;
1002         ksiginfo_init(&it->it_ksi);
1003         it->it_ksi.ksi_flags |= KSI_INS | KSI_EXT;
1004         error = CLOCK_CALL(clock_id, timer_create, (it));
1005         if (error != 0)
1006                 goto out;
1007
1008         PROC_LOCK(p);
1009         if (preset_id != -1) {
1010                 KASSERT(preset_id >= 0 && preset_id < 3, ("invalid preset_id"));
1011                 id = preset_id;
1012                 if (p->p_itimers->its_timers[id] != NULL) {
1013                         PROC_UNLOCK(p);
1014                         error = 0;
1015                         goto out;
1016                 }
1017         } else {
1018                 /*
1019                  * Find a free timer slot, skipping those reserved
1020                  * for setitimer().
1021                  */
1022                 for (id = 3; id < TIMER_MAX; id++)
1023                         if (p->p_itimers->its_timers[id] == NULL)
1024                                 break;
1025                 if (id == TIMER_MAX) {
1026                         PROC_UNLOCK(p);
1027                         error = EAGAIN;
1028                         goto out;
1029                 }
1030         }
1031         it->it_timerid = id;
1032         p->p_itimers->its_timers[id] = it;
1033         if (evp != NULL)
1034                 it->it_sigev = *evp;
1035         else {
1036                 it->it_sigev.sigev_notify = SIGEV_SIGNAL;
1037                 switch (clock_id) {
1038                 default:
1039                 case CLOCK_REALTIME:
1040                         it->it_sigev.sigev_signo = SIGALRM;
1041                         break;
1042                 case CLOCK_VIRTUAL:
1043                         it->it_sigev.sigev_signo = SIGVTALRM;
1044                         break;
1045                 case CLOCK_PROF:
1046                         it->it_sigev.sigev_signo = SIGPROF;
1047                         break;
1048                 }
1049                 it->it_sigev.sigev_value.sival_int = id;
1050         }
1051
1052         if (it->it_sigev.sigev_notify == SIGEV_SIGNAL ||
1053             it->it_sigev.sigev_notify == SIGEV_THREAD_ID) {
1054                 it->it_ksi.ksi_signo = it->it_sigev.sigev_signo;
1055                 it->it_ksi.ksi_code = SI_TIMER;
1056                 it->it_ksi.ksi_value = it->it_sigev.sigev_value;
1057                 it->it_ksi.ksi_timerid = id;
1058         }
1059         PROC_UNLOCK(p);
1060         *timerid = id;
1061         return (0);
1062
1063 out:
1064         ITIMER_LOCK(it);
1065         CLOCK_CALL(it->it_clockid, timer_delete, (it));
1066         ITIMER_UNLOCK(it);
1067         uma_zfree(itimer_zone, it);
1068         return (error);
1069 }
1070
1071 #ifndef _SYS_SYSPROTO_H_
1072 struct ktimer_delete_args {
1073         int timerid;
1074 };
1075 #endif
1076 int
1077 ktimer_delete(struct thread *td, struct ktimer_delete_args *uap)
1078 {
1079         return (kern_timer_delete(td, uap->timerid));
1080 }
1081
1082 static struct itimer *
1083 itimer_find(struct proc *p, int timerid)
1084 {
1085         struct itimer *it;
1086
1087         PROC_LOCK_ASSERT(p, MA_OWNED);
1088         if ((p->p_itimers == NULL) || (timerid >= TIMER_MAX) ||
1089             (it = p->p_itimers->its_timers[timerid]) == NULL) {
1090                 return (NULL);
1091         }
1092         ITIMER_LOCK(it);
1093         if ((it->it_flags & ITF_DELETING) != 0) {
1094                 ITIMER_UNLOCK(it);
1095                 it = NULL;
1096         }
1097         return (it);
1098 }
1099
1100 static int
1101 kern_timer_delete(struct thread *td, int timerid)
1102 {
1103         struct proc *p = td->td_proc;
1104         struct itimer *it;
1105
1106         PROC_LOCK(p);
1107         it = itimer_find(p, timerid);
1108         if (it == NULL) {
1109                 PROC_UNLOCK(p);
1110                 return (EINVAL);
1111         }
1112         PROC_UNLOCK(p);
1113
1114         it->it_flags |= ITF_DELETING;
1115         while (it->it_usecount > 0) {
1116                 it->it_flags |= ITF_WANTED;
1117                 msleep(it, &it->it_mtx, PPAUSE, "itimer", 0);
1118         }
1119         it->it_flags &= ~ITF_WANTED;
1120         CLOCK_CALL(it->it_clockid, timer_delete, (it));
1121         ITIMER_UNLOCK(it);
1122
1123         PROC_LOCK(p);
1124         if (KSI_ONQ(&it->it_ksi))
1125                 sigqueue_take(&it->it_ksi);
1126         p->p_itimers->its_timers[timerid] = NULL;
1127         PROC_UNLOCK(p);
1128         uma_zfree(itimer_zone, it);
1129         return (0);
1130 }
1131
1132 #ifndef _SYS_SYSPROTO_H_
1133 struct ktimer_settime_args {
1134         int timerid;
1135         int flags;
1136         const struct itimerspec * value;
1137         struct itimerspec * ovalue;
1138 };
1139 #endif
1140 int
1141 ktimer_settime(struct thread *td, struct ktimer_settime_args *uap)
1142 {
1143         struct proc *p = td->td_proc;
1144         struct itimer *it;
1145         struct itimerspec val, oval, *ovalp;
1146         int error;
1147
1148         error = copyin(uap->value, &val, sizeof(val));
1149         if (error != 0)
1150                 return (error);
1151         
1152         if (uap->ovalue != NULL)
1153                 ovalp = &oval;
1154         else
1155                 ovalp = NULL;
1156
1157         PROC_LOCK(p);
1158         if (uap->timerid < 3 ||
1159             (it = itimer_find(p, uap->timerid)) == NULL) {
1160                 PROC_UNLOCK(p);
1161                 error = EINVAL;
1162         } else {
1163                 PROC_UNLOCK(p);
1164                 itimer_enter(it);
1165                 error = CLOCK_CALL(it->it_clockid, timer_settime,
1166                                 (it, uap->flags, &val, ovalp));
1167                 itimer_leave(it);
1168                 ITIMER_UNLOCK(it);
1169         }
1170         if (error == 0 && uap->ovalue != NULL)
1171                 error = copyout(ovalp, uap->ovalue, sizeof(*ovalp));
1172         return (error);
1173 }
1174
1175 #ifndef _SYS_SYSPROTO_H_
1176 struct ktimer_gettime_args {
1177         int timerid;
1178         struct itimerspec * value;
1179 };
1180 #endif
1181 int
1182 ktimer_gettime(struct thread *td, struct ktimer_gettime_args *uap)
1183 {
1184         struct proc *p = td->td_proc;
1185         struct itimer *it;
1186         struct itimerspec val;
1187         int error;
1188
1189         PROC_LOCK(p);
1190         if (uap->timerid < 3 ||
1191            (it = itimer_find(p, uap->timerid)) == NULL) {
1192                 PROC_UNLOCK(p);
1193                 error = EINVAL;
1194         } else {
1195                 PROC_UNLOCK(p);
1196                 itimer_enter(it);
1197                 error = CLOCK_CALL(it->it_clockid, timer_gettime,
1198                                 (it, &val));
1199                 itimer_leave(it);
1200                 ITIMER_UNLOCK(it);
1201         }
1202         if (error == 0)
1203                 error = copyout(&val, uap->value, sizeof(val));
1204         return (error);
1205 }
1206
1207 #ifndef _SYS_SYSPROTO_H_
1208 struct timer_getoverrun_args {
1209         int timerid;
1210 };
1211 #endif
1212 int
1213 ktimer_getoverrun(struct thread *td, struct ktimer_getoverrun_args *uap)
1214 {
1215         struct proc *p = td->td_proc;
1216         struct itimer *it;
1217         int error ;
1218
1219         PROC_LOCK(p);
1220         if (uap->timerid < 3 ||
1221             (it = itimer_find(p, uap->timerid)) == NULL) {
1222                 PROC_UNLOCK(p);
1223                 error = EINVAL;
1224         } else {
1225                 td->td_retval[0] = it->it_overrun_last;
1226                 ITIMER_UNLOCK(it);
1227                 PROC_UNLOCK(p);
1228                 error = 0;
1229         }
1230         return (error);
1231 }
1232
1233 static int
1234 realtimer_create(struct itimer *it)
1235 {
1236         callout_init_mtx(&it->it_callout, &it->it_mtx, 0);
1237         return (0);
1238 }
1239
1240 static int
1241 realtimer_delete(struct itimer *it)
1242 {
1243         mtx_assert(&it->it_mtx, MA_OWNED);
1244         
1245         ITIMER_UNLOCK(it);
1246         callout_drain(&it->it_callout);
1247         ITIMER_LOCK(it);
1248         return (0);
1249 }
1250
1251 static int
1252 realtimer_gettime(struct itimer *it, struct itimerspec *ovalue)
1253 {
1254         struct timespec cts;
1255
1256         mtx_assert(&it->it_mtx, MA_OWNED);
1257
1258         realtimer_clocktime(it->it_clockid, &cts);
1259         *ovalue = it->it_time;
1260         if (ovalue->it_value.tv_sec != 0 || ovalue->it_value.tv_nsec != 0) {
1261                 timespecsub(&ovalue->it_value, &cts);
1262                 if (ovalue->it_value.tv_sec < 0 ||
1263                     (ovalue->it_value.tv_sec == 0 &&
1264                      ovalue->it_value.tv_nsec == 0)) {
1265                         ovalue->it_value.tv_sec  = 0;
1266                         ovalue->it_value.tv_nsec = 1;
1267                 }
1268         }
1269         return (0);
1270 }
1271
1272 static int
1273 realtimer_settime(struct itimer *it, int flags,
1274         struct itimerspec *value, struct itimerspec *ovalue)
1275 {
1276         struct timespec cts, ts;
1277         struct timeval tv;
1278         struct itimerspec val;
1279
1280         mtx_assert(&it->it_mtx, MA_OWNED);
1281
1282         val = *value;
1283         if (itimespecfix(&val.it_value))
1284                 return (EINVAL);
1285
1286         if (timespecisset(&val.it_value)) {
1287                 if (itimespecfix(&val.it_interval))
1288                         return (EINVAL);
1289         } else {
1290                 timespecclear(&val.it_interval);
1291         }
1292         
1293         if (ovalue != NULL)
1294                 realtimer_gettime(it, ovalue);
1295
1296         it->it_time = val;
1297         if (timespecisset(&val.it_value)) {
1298                 realtimer_clocktime(it->it_clockid, &cts);
1299                 ts = val.it_value;
1300                 if ((flags & TIMER_ABSTIME) == 0) {
1301                         /* Convert to absolute time. */
1302                         timespecadd(&it->it_time.it_value, &cts);
1303                 } else {
1304                         timespecsub(&ts, &cts);
1305                         /*
1306                          * We don't care if ts is negative, tztohz will
1307                          * fix it.
1308                          */
1309                 }
1310                 TIMESPEC_TO_TIMEVAL(&tv, &ts);
1311                 callout_reset(&it->it_callout, tvtohz(&tv),
1312                         realtimer_expire, it);
1313         } else {
1314                 callout_stop(&it->it_callout);
1315         }
1316
1317         return (0);
1318 }
1319
1320 static void
1321 realtimer_clocktime(clockid_t id, struct timespec *ts)
1322 {
1323         if (id == CLOCK_REALTIME)
1324                 getnanotime(ts);
1325         else    /* CLOCK_MONOTONIC */
1326                 getnanouptime(ts);
1327 }
1328
1329 int
1330 itimer_accept(struct proc *p, int timerid, ksiginfo_t *ksi)
1331 {
1332         struct itimer *it;
1333
1334         PROC_LOCK_ASSERT(p, MA_OWNED);
1335         it = itimer_find(p, timerid);
1336         if (it != NULL) {
1337                 ksi->ksi_overrun = it->it_overrun;
1338                 it->it_overrun_last = it->it_overrun;
1339                 it->it_overrun = 0;
1340                 ITIMER_UNLOCK(it);
1341                 return (0);
1342         }
1343         return (EINVAL);
1344 }
1345
1346 int
1347 itimespecfix(struct timespec *ts)
1348 {
1349
1350         if (ts->tv_sec < 0 || ts->tv_nsec < 0 || ts->tv_nsec >= 1000000000)
1351                 return (EINVAL);
1352         if (ts->tv_sec == 0 && ts->tv_nsec != 0 && ts->tv_nsec < tick * 1000)
1353                 ts->tv_nsec = tick * 1000;
1354         return (0);
1355 }
1356
1357 /* Timeout callback for realtime timer */
1358 static void
1359 realtimer_expire(void *arg)
1360 {
1361         struct timespec cts, ts;
1362         struct timeval tv;
1363         struct itimer *it;
1364         struct proc *p;
1365
1366         it = (struct itimer *)arg;
1367         p = it->it_proc;
1368
1369         realtimer_clocktime(it->it_clockid, &cts);
1370         /* Only fire if time is reached. */
1371         if (timespeccmp(&cts, &it->it_time.it_value, >=)) {
1372                 if (timespecisset(&it->it_time.it_interval)) {
1373                         timespecadd(&it->it_time.it_value,
1374                                     &it->it_time.it_interval);
1375                         while (timespeccmp(&cts, &it->it_time.it_value, >=)) {
1376                                 if (it->it_overrun < INT_MAX)
1377                                         it->it_overrun++;
1378                                 else
1379                                         it->it_ksi.ksi_errno = ERANGE;
1380                                 timespecadd(&it->it_time.it_value,
1381                                             &it->it_time.it_interval);
1382                         }
1383                 } else {
1384                         /* single shot timer ? */
1385                         timespecclear(&it->it_time.it_value);
1386                 }
1387                 if (timespecisset(&it->it_time.it_value)) {
1388                         ts = it->it_time.it_value;
1389                         timespecsub(&ts, &cts);
1390                         TIMESPEC_TO_TIMEVAL(&tv, &ts);
1391                         callout_reset(&it->it_callout, tvtohz(&tv),
1392                                  realtimer_expire, it);
1393                 }
1394                 ITIMER_UNLOCK(it);
1395                 itimer_fire(it);
1396                 ITIMER_LOCK(it);
1397         } else if (timespecisset(&it->it_time.it_value)) {
1398                 ts = it->it_time.it_value;
1399                 timespecsub(&ts, &cts);
1400                 TIMESPEC_TO_TIMEVAL(&tv, &ts);
1401                 callout_reset(&it->it_callout, tvtohz(&tv), realtimer_expire,
1402                         it);
1403         }
1404 }
1405
1406 void
1407 itimer_fire(struct itimer *it)
1408 {
1409         struct proc *p = it->it_proc;
1410         int ret;
1411
1412         if (it->it_sigev.sigev_notify == SIGEV_SIGNAL ||
1413             it->it_sigev.sigev_notify == SIGEV_THREAD_ID) {
1414                 PROC_LOCK(p);
1415                 if (!KSI_ONQ(&it->it_ksi)) {
1416                         it->it_ksi.ksi_errno = 0;
1417                         ret = psignal_event(p, &it->it_sigev, &it->it_ksi);
1418                         if (__predict_false(ret != 0)) {
1419                                 it->it_overrun++;
1420                                 /*
1421                                  * Broken userland code, thread went
1422                                  * away, disarm the timer.
1423                                  */
1424                                 if (ret == ESRCH) {
1425                                         ITIMER_LOCK(it);
1426                                         timespecclear(&it->it_time.it_value);
1427                                         timespecclear(&it->it_time.it_interval);
1428                                         callout_stop(&it->it_callout);
1429                                         ITIMER_UNLOCK(it);
1430                                 }
1431                         }
1432                 } else {
1433                         if (it->it_overrun < INT_MAX)
1434                                 it->it_overrun++;
1435                         else
1436                                 it->it_ksi.ksi_errno = ERANGE;
1437                 }
1438                 PROC_UNLOCK(p);
1439         }
1440 }
1441
1442 static void
1443 itimers_alloc(struct proc *p)
1444 {
1445         struct itimers *its;
1446         int i;
1447
1448         its = malloc(sizeof (struct itimers), M_SUBPROC, M_WAITOK | M_ZERO);
1449         LIST_INIT(&its->its_virtual);
1450         LIST_INIT(&its->its_prof);
1451         TAILQ_INIT(&its->its_worklist);
1452         for (i = 0; i < TIMER_MAX; i++)
1453                 its->its_timers[i] = NULL;
1454         PROC_LOCK(p);
1455         if (p->p_itimers == NULL) {
1456                 p->p_itimers = its;
1457                 PROC_UNLOCK(p);
1458         }
1459         else {
1460                 PROC_UNLOCK(p);
1461                 free(its, M_SUBPROC);
1462         }
1463 }
1464
1465 static void
1466 itimers_event_hook_exec(void *arg, struct proc *p, struct image_params *imgp __unused)
1467 {
1468         itimers_event_hook_exit(arg, p);
1469 }
1470
1471 /* Clean up timers when some process events are being triggered. */
1472 static void
1473 itimers_event_hook_exit(void *arg, struct proc *p)
1474 {
1475         struct itimers *its;
1476         struct itimer *it;
1477         int event = (int)(intptr_t)arg;
1478         int i;
1479
1480         if (p->p_itimers != NULL) {
1481                 its = p->p_itimers;
1482                 for (i = 0; i < MAX_CLOCKS; ++i) {
1483                         if (posix_clocks[i].event_hook != NULL)
1484                                 CLOCK_CALL(i, event_hook, (p, i, event));
1485                 }
1486                 /*
1487                  * According to susv3, XSI interval timers should be inherited
1488                  * by new image.
1489                  */
1490                 if (event == ITIMER_EV_EXEC)
1491                         i = 3;
1492                 else if (event == ITIMER_EV_EXIT)
1493                         i = 0;
1494                 else
1495                         panic("unhandled event");
1496                 for (; i < TIMER_MAX; ++i) {
1497                         if ((it = its->its_timers[i]) != NULL)
1498                                 kern_timer_delete(curthread, i);
1499                 }
1500                 if (its->its_timers[0] == NULL &&
1501                     its->its_timers[1] == NULL &&
1502                     its->its_timers[2] == NULL) {
1503                         free(its, M_SUBPROC);
1504                         p->p_itimers = NULL;
1505                 }
1506         }
1507 }