f04b7d46b94b32dcf008353b02eac06873d48d9c
[dragonfly.git] / sys / kern / kern_clock.c
1 /*
2  * Copyright (c) 2003,2004 The DragonFly Project.  All rights reserved.
3  * 
4  * This code is derived from software contributed to The DragonFly Project
5  * by Matthew Dillon <dillon@backplane.com>
6  * 
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in
15  *    the documentation and/or other materials provided with the
16  *    distribution.
17  * 3. Neither the name of The DragonFly Project nor the names of its
18  *    contributors may be used to endorse or promote products derived
19  *    from this software without specific, prior written permission.
20  * 
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
25  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
31  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32  * SUCH DAMAGE.
33  * 
34  * Copyright (c) 1997, 1998 Poul-Henning Kamp <phk@FreeBSD.org>
35  * Copyright (c) 1982, 1986, 1991, 1993
36  *      The Regents of the University of California.  All rights reserved.
37  * (c) UNIX System Laboratories, Inc.
38  * All or some portions of this file are derived from material licensed
39  * to the University of California by American Telephone and Telegraph
40  * Co. or Unix System Laboratories, Inc. and are reproduced herein with
41  * the permission of UNIX System Laboratories, Inc.
42  *
43  * Redistribution and use in source and binary forms, with or without
44  * modification, are permitted provided that the following conditions
45  * are met:
46  * 1. Redistributions of source code must retain the above copyright
47  *    notice, this list of conditions and the following disclaimer.
48  * 2. Redistributions in binary form must reproduce the above copyright
49  *    notice, this list of conditions and the following disclaimer in the
50  *    documentation and/or other materials provided with the distribution.
51  * 3. All advertising materials mentioning features or use of this software
52  *    must display the following acknowledgement:
53  *      This product includes software developed by the University of
54  *      California, Berkeley and its contributors.
55  * 4. Neither the name of the University nor the names of its contributors
56  *    may be used to endorse or promote products derived from this software
57  *    without specific prior written permission.
58  *
59  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
60  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
61  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
62  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
63  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
64  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
65  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
66  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
67  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
68  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
69  * SUCH DAMAGE.
70  *
71  *      @(#)kern_clock.c        8.5 (Berkeley) 1/21/94
72  * $FreeBSD: src/sys/kern/kern_clock.c,v 1.105.2.10 2002/10/17 13:19:40 maxim Exp $
73  * $DragonFly: src/sys/kern/kern_clock.c,v 1.62 2008/09/09 04:06:13 dillon Exp $
74  */
75
76 #include "opt_ntp.h"
77 #include "opt_polling.h"
78 #include "opt_ifpoll.h"
79 #include "opt_pctrack.h"
80
81 #include <sys/param.h>
82 #include <sys/systm.h>
83 #include <sys/callout.h>
84 #include <sys/kernel.h>
85 #include <sys/kinfo.h>
86 #include <sys/proc.h>
87 #include <sys/malloc.h>
88 #include <sys/resourcevar.h>
89 #include <sys/signalvar.h>
90 #include <sys/timex.h>
91 #include <sys/timepps.h>
92 #include <vm/vm.h>
93 #include <sys/lock.h>
94 #include <vm/pmap.h>
95 #include <vm/vm_map.h>
96 #include <vm/vm_extern.h>
97 #include <sys/sysctl.h>
98 #include <sys/thread2.h>
99
100 #include <machine/cpu.h>
101 #include <machine/limits.h>
102 #include <machine/smp.h>
103
104 #ifdef GPROF
105 #include <sys/gmon.h>
106 #endif
107
108 #ifdef DEVICE_POLLING
109 extern void init_device_poll_pcpu(int);
110 #endif
111
112 #ifdef IFPOLL_ENABLE
113 extern void ifpoll_init_pcpu(int);
114 #endif
115
116 #ifdef DEBUG_PCTRACK
117 static void do_pctrack(struct intrframe *frame, int which);
118 #endif
119
120 static void initclocks (void *dummy);
121 SYSINIT(clocks, SI_BOOT2_CLOCKS, SI_ORDER_FIRST, initclocks, NULL)
122
123 /*
124  * Some of these don't belong here, but it's easiest to concentrate them.
125  * Note that cpu_time counts in microseconds, but most userland programs
126  * just compare relative times against the total by delta.
127  */
128 struct kinfo_cputime cputime_percpu[MAXCPU];
129 #ifdef DEBUG_PCTRACK
130 struct kinfo_pcheader cputime_pcheader = { PCTRACK_SIZE, PCTRACK_ARYSIZE };
131 struct kinfo_pctrack cputime_pctrack[MAXCPU][PCTRACK_SIZE];
132 #endif
133
134 #ifdef SMP
135 static int
136 sysctl_cputime(SYSCTL_HANDLER_ARGS)
137 {
138         int cpu, error = 0;
139         size_t size = sizeof(struct kinfo_cputime);
140
141         for (cpu = 0; cpu < ncpus; ++cpu) {
142                 if ((error = SYSCTL_OUT(req, &cputime_percpu[cpu], size)))
143                         break;
144         }
145
146         return (error);
147 }
148 SYSCTL_PROC(_kern, OID_AUTO, cputime, (CTLTYPE_OPAQUE|CTLFLAG_RD), 0, 0,
149         sysctl_cputime, "S,kinfo_cputime", "CPU time statistics");
150 #else
151 SYSCTL_STRUCT(_kern, OID_AUTO, cputime, CTLFLAG_RD, &cpu_time, kinfo_cputime,
152     "CPU time statistics");
153 #endif
154
155 /*
156  * boottime is used to calculate the 'real' uptime.  Do not confuse this with
157  * microuptime().  microtime() is not drift compensated.  The real uptime
158  * with compensation is nanotime() - bootime.  boottime is recalculated
159  * whenever the real time is set based on the compensated elapsed time
160  * in seconds (gd->gd_time_seconds).
161  *
162  * The gd_time_seconds and gd_cpuclock_base fields remain fairly monotonic.
163  * Slight adjustments to gd_cpuclock_base are made to phase-lock it to
164  * the real time.
165  */
166 struct timespec boottime;       /* boot time (realtime) for reference only */
167 time_t time_second;             /* read-only 'passive' uptime in seconds */
168
169 /*
170  * basetime is used to calculate the compensated real time of day.  The
171  * basetime can be modified on a per-tick basis by the adjtime(), 
172  * ntp_adjtime(), and sysctl-based time correction APIs.
173  *
174  * Note that frequency corrections can also be made by adjusting
175  * gd_cpuclock_base.
176  *
177  * basetime is a tail-chasing FIFO, updated only by cpu #0.  The FIFO is
178  * used on both SMP and UP systems to avoid MP races between cpu's and
179  * interrupt races on UP systems.
180  */
181 #define BASETIME_ARYSIZE        16
182 #define BASETIME_ARYMASK        (BASETIME_ARYSIZE - 1)
183 static struct timespec basetime[BASETIME_ARYSIZE];
184 static volatile int basetime_index;
185
186 static int
187 sysctl_get_basetime(SYSCTL_HANDLER_ARGS)
188 {
189         struct timespec *bt;
190         int error;
191         int index;
192
193         /*
194          * Because basetime data and index may be updated by another cpu,
195          * a load fence is required to ensure that the data we read has
196          * not been speculatively read relative to a possibly updated index.
197          */
198         index = basetime_index;
199         cpu_lfence();
200         bt = &basetime[index];
201         error = SYSCTL_OUT(req, bt, sizeof(*bt));
202         return (error);
203 }
204
205 SYSCTL_STRUCT(_kern, KERN_BOOTTIME, boottime, CTLFLAG_RD,
206     &boottime, timespec, "System boottime");
207 SYSCTL_PROC(_kern, OID_AUTO, basetime, CTLTYPE_STRUCT|CTLFLAG_RD, 0, 0,
208     sysctl_get_basetime, "S,timespec", "System basetime");
209
210 static void hardclock(systimer_t info, struct intrframe *frame);
211 static void statclock(systimer_t info, struct intrframe *frame);
212 static void schedclock(systimer_t info, struct intrframe *frame);
213 static void getnanotime_nbt(struct timespec *nbt, struct timespec *tsp);
214
215 int     ticks;                  /* system master ticks at hz */
216 int     clocks_running;         /* tsleep/timeout clocks operational */
217 int64_t nsec_adj;               /* ntpd per-tick adjustment in nsec << 32 */
218 int64_t nsec_acc;               /* accumulator */
219
220 /* NTPD time correction fields */
221 int64_t ntp_tick_permanent;     /* per-tick adjustment in nsec << 32 */
222 int64_t ntp_tick_acc;           /* accumulator for per-tick adjustment */
223 int64_t ntp_delta;              /* one-time correction in nsec */
224 int64_t ntp_big_delta = 1000000000;
225 int32_t ntp_tick_delta;         /* current adjustment rate */
226 int32_t ntp_default_tick_delta; /* adjustment rate for ntp_delta */
227 time_t  ntp_leap_second;        /* time of next leap second */
228 int     ntp_leap_insert;        /* whether to insert or remove a second */
229
230 /*
231  * Finish initializing clock frequencies and start all clocks running.
232  */
233 /* ARGSUSED*/
234 static void
235 initclocks(void *dummy)
236 {
237         /*psratio = profhz / stathz;*/
238         initclocks_pcpu();
239         clocks_running = 1;
240 }
241
242 /*
243  * Called on a per-cpu basis
244  */
245 void
246 initclocks_pcpu(void)
247 {
248         struct globaldata *gd = mycpu;
249
250         crit_enter();
251         if (gd->gd_cpuid == 0) {
252             gd->gd_time_seconds = 1;
253             gd->gd_cpuclock_base = sys_cputimer->count();
254         } else {
255             /* XXX */
256             gd->gd_time_seconds = globaldata_find(0)->gd_time_seconds;
257             gd->gd_cpuclock_base = globaldata_find(0)->gd_cpuclock_base;
258         }
259
260         systimer_intr_enable();
261
262 #ifdef DEVICE_POLLING
263         init_device_poll_pcpu(gd->gd_cpuid);
264 #endif
265
266 #ifdef IFPOLL_ENABLE
267         ifpoll_init_pcpu(gd->gd_cpuid);
268 #endif
269
270         /*
271          * Use a non-queued periodic systimer to prevent multiple ticks from
272          * building up if the sysclock jumps forward (8254 gets reset).  The
273          * sysclock will never jump backwards.  Our time sync is based on
274          * the actual sysclock, not the ticks count.
275          */
276         systimer_init_periodic_nq(&gd->gd_hardclock, hardclock, NULL, hz);
277         systimer_init_periodic_nq(&gd->gd_statclock, statclock, NULL, stathz);
278         /* XXX correct the frequency for scheduler / estcpu tests */
279         systimer_init_periodic_nq(&gd->gd_schedclock, schedclock, 
280                                 NULL, ESTCPUFREQ); 
281         crit_exit();
282 }
283
284 /*
285  * This sets the current real time of day.  Timespecs are in seconds and
286  * nanoseconds.  We do not mess with gd_time_seconds and gd_cpuclock_base,
287  * instead we adjust basetime so basetime + gd_* results in the current
288  * time of day.  This way the gd_* fields are guarenteed to represent
289  * a monotonically increasing 'uptime' value.
290  *
291  * When set_timeofday() is called from userland, the system call forces it
292  * onto cpu #0 since only cpu #0 can update basetime_index.
293  */
294 void
295 set_timeofday(struct timespec *ts)
296 {
297         struct timespec *nbt;
298         int ni;
299
300         /*
301          * XXX SMP / non-atomic basetime updates
302          */
303         crit_enter();
304         ni = (basetime_index + 1) & BASETIME_ARYMASK;
305         nbt = &basetime[ni];
306         nanouptime(nbt);
307         nbt->tv_sec = ts->tv_sec - nbt->tv_sec;
308         nbt->tv_nsec = ts->tv_nsec - nbt->tv_nsec;
309         if (nbt->tv_nsec < 0) {
310             nbt->tv_nsec += 1000000000;
311             --nbt->tv_sec;
312         }
313
314         /*
315          * Note that basetime diverges from boottime as the clock drift is
316          * compensated for, so we cannot do away with boottime.  When setting
317          * the absolute time of day the drift is 0 (for an instant) and we
318          * can simply assign boottime to basetime.  
319          *
320          * Note that nanouptime() is based on gd_time_seconds which is drift
321          * compensated up to a point (it is guarenteed to remain monotonically
322          * increasing).  gd_time_seconds is thus our best uptime guess and
323          * suitable for use in the boottime calculation.  It is already taken
324          * into account in the basetime calculation above.
325          */
326         boottime.tv_sec = nbt->tv_sec;
327         ntp_delta = 0;
328
329         /*
330          * We now have a new basetime, make sure all other cpus have it,
331          * then update the index.
332          */
333         cpu_sfence();
334         basetime_index = ni;
335
336         crit_exit();
337 }
338         
339 /*
340  * Each cpu has its own hardclock, but we only increments ticks and softticks
341  * on cpu #0.
342  *
343  * NOTE! systimer! the MP lock might not be held here.  We can only safely
344  * manipulate objects owned by the current cpu.
345  */
346 static void
347 hardclock(systimer_t info, struct intrframe *frame)
348 {
349         sysclock_t cputicks;
350         struct proc *p;
351         struct globaldata *gd = mycpu;
352
353         /*
354          * Realtime updates are per-cpu.  Note that timer corrections as
355          * returned by microtime() and friends make an additional adjustment
356          * using a system-wise 'basetime', but the running time is always
357          * taken from the per-cpu globaldata area.  Since the same clock
358          * is distributing (XXX SMP) to all cpus, the per-cpu timebases
359          * stay in synch.
360          *
361          * Note that we never allow info->time (aka gd->gd_hardclock.time)
362          * to reverse index gd_cpuclock_base, but that it is possible for
363          * it to temporarily get behind in the seconds if something in the
364          * system locks interrupts for a long period of time.  Since periodic
365          * timers count events, though everything should resynch again
366          * immediately.
367          */
368         cputicks = info->time - gd->gd_cpuclock_base;
369         if (cputicks >= sys_cputimer->freq) {
370                 ++gd->gd_time_seconds;
371                 gd->gd_cpuclock_base += sys_cputimer->freq;
372         }
373
374         /*
375          * The system-wide ticks counter and NTP related timedelta/tickdelta
376          * adjustments only occur on cpu #0.  NTP adjustments are accomplished
377          * by updating basetime.
378          */
379         if (gd->gd_cpuid == 0) {
380             struct timespec *nbt;
381             struct timespec nts;
382             int leap;
383             int ni;
384
385             ++ticks;
386
387 #if 0
388             if (tco->tc_poll_pps) 
389                 tco->tc_poll_pps(tco);
390 #endif
391
392             /*
393              * Calculate the new basetime index.  We are in a critical section
394              * on cpu #0 and can safely play with basetime_index.  Start
395              * with the current basetime and then make adjustments.
396              */
397             ni = (basetime_index + 1) & BASETIME_ARYMASK;
398             nbt = &basetime[ni];
399             *nbt = basetime[basetime_index];
400
401             /*
402              * Apply adjtime corrections.  (adjtime() API)
403              *
404              * adjtime() only runs on cpu #0 so our critical section is
405              * sufficient to access these variables.
406              */
407             if (ntp_delta != 0) {
408                 nbt->tv_nsec += ntp_tick_delta;
409                 ntp_delta -= ntp_tick_delta;
410                 if ((ntp_delta > 0 && ntp_delta < ntp_tick_delta) ||
411                     (ntp_delta < 0 && ntp_delta > ntp_tick_delta)) {
412                         ntp_tick_delta = ntp_delta;
413                 }
414             }
415
416             /*
417              * Apply permanent frequency corrections.  (sysctl API)
418              */
419             if (ntp_tick_permanent != 0) {
420                 ntp_tick_acc += ntp_tick_permanent;
421                 if (ntp_tick_acc >= (1LL << 32)) {
422                     nbt->tv_nsec += ntp_tick_acc >> 32;
423                     ntp_tick_acc -= (ntp_tick_acc >> 32) << 32;
424                 } else if (ntp_tick_acc <= -(1LL << 32)) {
425                     /* Negate ntp_tick_acc to avoid shifting the sign bit. */
426                     nbt->tv_nsec -= (-ntp_tick_acc) >> 32;
427                     ntp_tick_acc += ((-ntp_tick_acc) >> 32) << 32;
428                 }
429             }
430
431             if (nbt->tv_nsec >= 1000000000) {
432                     nbt->tv_sec++;
433                     nbt->tv_nsec -= 1000000000;
434             } else if (nbt->tv_nsec < 0) {
435                     nbt->tv_sec--;
436                     nbt->tv_nsec += 1000000000;
437             }
438
439             /*
440              * Another per-tick compensation.  (for ntp_adjtime() API)
441              */
442             if (nsec_adj != 0) {
443                 nsec_acc += nsec_adj;
444                 if (nsec_acc >= 0x100000000LL) {
445                     nbt->tv_nsec += nsec_acc >> 32;
446                     nsec_acc = (nsec_acc & 0xFFFFFFFFLL);
447                 } else if (nsec_acc <= -0x100000000LL) {
448                     nbt->tv_nsec -= -nsec_acc >> 32;
449                     nsec_acc = -(-nsec_acc & 0xFFFFFFFFLL);
450                 }
451                 if (nbt->tv_nsec >= 1000000000) {
452                     nbt->tv_nsec -= 1000000000;
453                     ++nbt->tv_sec;
454                 } else if (nbt->tv_nsec < 0) {
455                     nbt->tv_nsec += 1000000000;
456                     --nbt->tv_sec;
457                 }
458             }
459
460             /************************************************************
461              *                  LEAP SECOND CORRECTION                  *
462              ************************************************************
463              *
464              * Taking into account all the corrections made above, figure
465              * out the new real time.  If the seconds field has changed
466              * then apply any pending leap-second corrections.
467              */
468             getnanotime_nbt(nbt, &nts);
469
470             if (time_second != nts.tv_sec) {
471                 /*
472                  * Apply leap second (sysctl API).  Adjust nts for changes
473                  * so we do not have to call getnanotime_nbt again.
474                  */
475                 if (ntp_leap_second) {
476                     if (ntp_leap_second == nts.tv_sec) {
477                         if (ntp_leap_insert) {
478                             nbt->tv_sec++;
479                             nts.tv_sec++;
480                         } else {
481                             nbt->tv_sec--;
482                             nts.tv_sec--;
483                         }
484                         ntp_leap_second--;
485                     }
486                 }
487
488                 /*
489                  * Apply leap second (ntp_adjtime() API), calculate a new
490                  * nsec_adj field.  ntp_update_second() returns nsec_adj
491                  * as a per-second value but we need it as a per-tick value.
492                  */
493                 leap = ntp_update_second(time_second, &nsec_adj);
494                 nsec_adj /= hz;
495                 nbt->tv_sec += leap;
496                 nts.tv_sec += leap;
497
498                 /*
499                  * Update the time_second 'approximate time' global.
500                  */
501                 time_second = nts.tv_sec;
502             }
503
504             /*
505              * Finally, our new basetime is ready to go live!
506              */
507             cpu_sfence();
508             basetime_index = ni;
509
510             /*
511              * Figure out how badly the system is starved for memory
512              */
513             vm_fault_ratecheck();
514         }
515
516         /*
517          * softticks are handled for all cpus
518          */
519         hardclock_softtick(gd);
520
521         /*
522          * The LWKT scheduler will generally allow the current process to
523          * return to user mode even if there are other runnable LWKT threads
524          * running in kernel mode on behalf of a user process.  This will
525          * ensure that those other threads have an opportunity to run in
526          * fairly short order (but not instantly).
527          */
528         need_lwkt_resched();
529
530         /*
531          * ITimer handling is per-tick, per-cpu.  I don't think ksignal()
532          * is mpsafe on curproc, so XXX get the mplock.
533          */
534         if ((p = curproc) != NULL && try_mplock()) {
535                 if (frame && CLKF_USERMODE(frame) &&
536                     timevalisset(&p->p_timer[ITIMER_VIRTUAL].it_value) &&
537                     itimerdecr(&p->p_timer[ITIMER_VIRTUAL], tick) == 0)
538                         ksignal(p, SIGVTALRM);
539                 if (timevalisset(&p->p_timer[ITIMER_PROF].it_value) &&
540                     itimerdecr(&p->p_timer[ITIMER_PROF], tick) == 0)
541                         ksignal(p, SIGPROF);
542                 rel_mplock();
543         }
544         setdelayed();
545 }
546
547 /*
548  * The statistics clock typically runs at a 125Hz rate, and is intended
549  * to be frequency offset from the hardclock (typ 100Hz).  It is per-cpu.
550  *
551  * NOTE! systimer! the MP lock might not be held here.  We can only safely
552  * manipulate objects owned by the current cpu.
553  *
554  * The stats clock is responsible for grabbing a profiling sample.
555  * Most of the statistics are only used by user-level statistics programs.
556  * The main exceptions are p->p_uticks, p->p_sticks, p->p_iticks, and
557  * p->p_estcpu.
558  *
559  * Like the other clocks, the stat clock is called from what is effectively
560  * a fast interrupt, so the context should be the thread/process that got
561  * interrupted.
562  */
563 static void
564 statclock(systimer_t info, struct intrframe *frame)
565 {
566 #ifdef GPROF
567         struct gmonparam *g;
568         int i;
569 #endif
570         thread_t td;
571         struct proc *p;
572         int bump;
573         struct timeval tv;
574         struct timeval *stv;
575
576         /*
577          * How big was our timeslice relative to the last time?
578          */
579         microuptime(&tv);       /* mpsafe */
580         stv = &mycpu->gd_stattv;
581         if (stv->tv_sec == 0) {
582             bump = 1;
583         } else {
584             bump = tv.tv_usec - stv->tv_usec +
585                 (tv.tv_sec - stv->tv_sec) * 1000000;
586             if (bump < 0)
587                 bump = 0;
588             if (bump > 1000000)
589                 bump = 1000000;
590         }
591         *stv = tv;
592
593         td = curthread;
594         p = td->td_proc;
595
596         if (frame && CLKF_USERMODE(frame)) {
597                 /*
598                  * Came from userland, handle user time and deal with
599                  * possible process.
600                  */
601                 if (p && (p->p_flag & P_PROFIL))
602                         addupc_intr(p, CLKF_PC(frame), 1);
603                 td->td_uticks += bump;
604
605                 /*
606                  * Charge the time as appropriate
607                  */
608                 if (p && p->p_nice > NZERO)
609                         cpu_time.cp_nice += bump;
610                 else
611                         cpu_time.cp_user += bump;
612         } else {
613 #ifdef GPROF
614                 /*
615                  * Kernel statistics are just like addupc_intr, only easier.
616                  */
617                 g = &_gmonparam;
618                 if (g->state == GMON_PROF_ON && frame) {
619                         i = CLKF_PC(frame) - g->lowpc;
620                         if (i < g->textsize) {
621                                 i /= HISTFRACTION * sizeof(*g->kcount);
622                                 g->kcount[i]++;
623                         }
624                 }
625 #endif
626                 /*
627                  * Came from kernel mode, so we were:
628                  * - handling an interrupt,
629                  * - doing syscall or trap work on behalf of the current
630                  *   user process, or
631                  * - spinning in the idle loop.
632                  * Whichever it is, charge the time as appropriate.
633                  * Note that we charge interrupts to the current process,
634                  * regardless of whether they are ``for'' that process,
635                  * so that we know how much of its real time was spent
636                  * in ``non-process'' (i.e., interrupt) work.
637                  *
638                  * XXX assume system if frame is NULL.  A NULL frame 
639                  * can occur if ipi processing is done from a crit_exit().
640                  */
641                 if (frame && CLKF_INTR(frame))
642                         td->td_iticks += bump;
643                 else
644                         td->td_sticks += bump;
645
646                 if (frame && CLKF_INTR(frame)) {
647 #ifdef DEBUG_PCTRACK
648                         do_pctrack(frame, PCTRACK_INT);
649 #endif
650                         cpu_time.cp_intr += bump;
651                 } else {
652                         if (td == &mycpu->gd_idlethread) {
653                                 cpu_time.cp_idle += bump;
654                         } else {
655 #ifdef DEBUG_PCTRACK
656                                 if (frame)
657                                         do_pctrack(frame, PCTRACK_SYS);
658 #endif
659                                 cpu_time.cp_sys += bump;
660                         }
661                 }
662         }
663 }
664
665 #ifdef DEBUG_PCTRACK
666 /*
667  * Sample the PC when in the kernel or in an interrupt.  User code can
668  * retrieve the information and generate a histogram or other output.
669  */
670
671 static void
672 do_pctrack(struct intrframe *frame, int which)
673 {
674         struct kinfo_pctrack *pctrack;
675
676         pctrack = &cputime_pctrack[mycpu->gd_cpuid][which];
677         pctrack->pc_array[pctrack->pc_index & PCTRACK_ARYMASK] = 
678                 (void *)CLKF_PC(frame);
679         ++pctrack->pc_index;
680 }
681
682 static int
683 sysctl_pctrack(SYSCTL_HANDLER_ARGS)
684 {
685         struct kinfo_pcheader head;
686         int error;
687         int cpu;
688         int ntrack;
689
690         head.pc_ntrack = PCTRACK_SIZE;
691         head.pc_arysize = PCTRACK_ARYSIZE;
692
693         if ((error = SYSCTL_OUT(req, &head, sizeof(head))) != 0)
694                 return (error);
695
696         for (cpu = 0; cpu < ncpus; ++cpu) {
697                 for (ntrack = 0; ntrack < PCTRACK_SIZE; ++ntrack) {
698                         error = SYSCTL_OUT(req, &cputime_pctrack[cpu][ntrack],
699                                            sizeof(struct kinfo_pctrack));
700                         if (error)
701                                 break;
702                 }
703                 if (error)
704                         break;
705         }
706         return (error);
707 }
708 SYSCTL_PROC(_kern, OID_AUTO, pctrack, (CTLTYPE_OPAQUE|CTLFLAG_RD), 0, 0,
709         sysctl_pctrack, "S,kinfo_pcheader", "CPU PC tracking");
710
711 #endif
712
713 /*
714  * The scheduler clock typically runs at a 50Hz rate.  NOTE! systimer,
715  * the MP lock might not be held.  We can safely manipulate parts of curproc
716  * but that's about it.
717  *
718  * Each cpu has its own scheduler clock.
719  */
720 static void
721 schedclock(systimer_t info, struct intrframe *frame)
722 {
723         struct lwp *lp;
724         struct rusage *ru;
725         struct vmspace *vm;
726         long rss;
727
728         if ((lp = lwkt_preempted_proc()) != NULL) {
729                 /*
730                  * Account for cpu time used and hit the scheduler.  Note
731                  * that this call MUST BE MP SAFE, and the BGL IS NOT HELD
732                  * HERE.
733                  */
734                 ++lp->lwp_cpticks;
735                 lp->lwp_proc->p_usched->schedulerclock(lp, info->periodic,
736                                                        info->time);
737         }
738         if ((lp = curthread->td_lwp) != NULL) {
739                 /*
740                  * Update resource usage integrals and maximums.
741                  */
742                 if ((ru = &lp->lwp_proc->p_ru) &&
743                     (vm = lp->lwp_proc->p_vmspace) != NULL) {
744                         ru->ru_ixrss += pgtok(vm->vm_tsize);
745                         ru->ru_idrss += pgtok(vm->vm_dsize);
746                         ru->ru_isrss += pgtok(vm->vm_ssize);
747                         rss = pgtok(vmspace_resident_count(vm));
748                         if (ru->ru_maxrss < rss)
749                                 ru->ru_maxrss = rss;
750                 }
751         }
752 }
753
754 /*
755  * Compute number of ticks for the specified amount of time.  The 
756  * return value is intended to be used in a clock interrupt timed
757  * operation and guarenteed to meet or exceed the requested time.
758  * If the representation overflows, return INT_MAX.  The minimum return
759  * value is 1 ticks and the function will average the calculation up.
760  * If any value greater then 0 microseconds is supplied, a value
761  * of at least 2 will be returned to ensure that a near-term clock
762  * interrupt does not cause the timeout to occur (degenerately) early.
763  *
764  * Note that limit checks must take into account microseconds, which is
765  * done simply by using the smaller signed long maximum instead of
766  * the unsigned long maximum.
767  *
768  * If ints have 32 bits, then the maximum value for any timeout in
769  * 10ms ticks is 248 days.
770  */
771 int
772 tvtohz_high(struct timeval *tv)
773 {
774         int ticks;
775         long sec, usec;
776
777         sec = tv->tv_sec;
778         usec = tv->tv_usec;
779         if (usec < 0) {
780                 sec--;
781                 usec += 1000000;
782         }
783         if (sec < 0) {
784 #ifdef DIAGNOSTIC
785                 if (usec > 0) {
786                         sec++;
787                         usec -= 1000000;
788                 }
789                 kprintf("tvtohz_high: negative time difference %ld sec %ld usec\n",
790                        sec, usec);
791 #endif
792                 ticks = 1;
793         } else if (sec <= INT_MAX / hz) {
794                 ticks = (int)(sec * hz + 
795                             ((u_long)usec + (tick - 1)) / tick) + 1;
796         } else {
797                 ticks = INT_MAX;
798         }
799         return (ticks);
800 }
801
802 /*
803  * Compute number of ticks for the specified amount of time, erroring on
804  * the side of it being too low to ensure that sleeping the returned number
805  * of ticks will not result in a late return.
806  *
807  * The supplied timeval may not be negative and should be normalized.  A
808  * return value of 0 is possible if the timeval converts to less then
809  * 1 tick.
810  *
811  * If ints have 32 bits, then the maximum value for any timeout in
812  * 10ms ticks is 248 days.
813  */
814 int
815 tvtohz_low(struct timeval *tv)
816 {
817         int ticks;
818         long sec;
819
820         sec = tv->tv_sec;
821         if (sec <= INT_MAX / hz)
822                 ticks = (int)(sec * hz + (u_long)tv->tv_usec / tick);
823         else
824                 ticks = INT_MAX;
825         return (ticks);
826 }
827
828
829 /*
830  * Start profiling on a process.
831  *
832  * Kernel profiling passes proc0 which never exits and hence
833  * keeps the profile clock running constantly.
834  */
835 void
836 startprofclock(struct proc *p)
837 {
838         if ((p->p_flag & P_PROFIL) == 0) {
839                 p->p_flag |= P_PROFIL;
840 #if 0   /* XXX */
841                 if (++profprocs == 1 && stathz != 0) {
842                         crit_enter();
843                         psdiv = psratio;
844                         setstatclockrate(profhz);
845                         crit_exit();
846                 }
847 #endif
848         }
849 }
850
851 /*
852  * Stop profiling on a process.
853  */
854 void
855 stopprofclock(struct proc *p)
856 {
857         if (p->p_flag & P_PROFIL) {
858                 p->p_flag &= ~P_PROFIL;
859 #if 0   /* XXX */
860                 if (--profprocs == 0 && stathz != 0) {
861                         crit_enter();
862                         psdiv = 1;
863                         setstatclockrate(stathz);
864                         crit_exit();
865                 }
866 #endif
867         }
868 }
869
870 /*
871  * Return information about system clocks.
872  */
873 static int
874 sysctl_kern_clockrate(SYSCTL_HANDLER_ARGS)
875 {
876         struct kinfo_clockinfo clkinfo;
877         /*
878          * Construct clockinfo structure.
879          */
880         clkinfo.ci_hz = hz;
881         clkinfo.ci_tick = tick;
882         clkinfo.ci_tickadj = ntp_default_tick_delta / 1000;
883         clkinfo.ci_profhz = profhz;
884         clkinfo.ci_stathz = stathz ? stathz : hz;
885         return (sysctl_handle_opaque(oidp, &clkinfo, sizeof clkinfo, req));
886 }
887
888 SYSCTL_PROC(_kern, KERN_CLOCKRATE, clockrate, CTLTYPE_STRUCT|CTLFLAG_RD,
889         0, 0, sysctl_kern_clockrate, "S,clockinfo","");
890
891 /*
892  * We have eight functions for looking at the clock, four for
893  * microseconds and four for nanoseconds.  For each there is fast
894  * but less precise version "get{nano|micro}[up]time" which will
895  * return a time which is up to 1/HZ previous to the call, whereas
896  * the raw version "{nano|micro}[up]time" will return a timestamp
897  * which is as precise as possible.  The "up" variants return the
898  * time relative to system boot, these are well suited for time
899  * interval measurements.
900  *
901  * Each cpu independantly maintains the current time of day, so all
902  * we need to do to protect ourselves from changes is to do a loop
903  * check on the seconds field changing out from under us.
904  *
905  * The system timer maintains a 32 bit count and due to various issues
906  * it is possible for the calculated delta to occassionally exceed
907  * sys_cputimer->freq.  If this occurs the sys_cputimer->freq64_nsec
908  * multiplication can easily overflow, so we deal with the case.  For
909  * uniformity we deal with the case in the usec case too.
910  *
911  * All the [get][micro,nano][time,uptime]() routines are MPSAFE.
912  */
913 void
914 getmicrouptime(struct timeval *tvp)
915 {
916         struct globaldata *gd = mycpu;
917         sysclock_t delta;
918
919         do {
920                 tvp->tv_sec = gd->gd_time_seconds;
921                 delta = gd->gd_hardclock.time - gd->gd_cpuclock_base;
922         } while (tvp->tv_sec != gd->gd_time_seconds);
923
924         if (delta >= sys_cputimer->freq) {
925                 tvp->tv_sec += delta / sys_cputimer->freq;
926                 delta %= sys_cputimer->freq;
927         }
928         tvp->tv_usec = (sys_cputimer->freq64_usec * delta) >> 32;
929         if (tvp->tv_usec >= 1000000) {
930                 tvp->tv_usec -= 1000000;
931                 ++tvp->tv_sec;
932         }
933 }
934
935 void
936 getnanouptime(struct timespec *tsp)
937 {
938         struct globaldata *gd = mycpu;
939         sysclock_t delta;
940
941         do {
942                 tsp->tv_sec = gd->gd_time_seconds;
943                 delta = gd->gd_hardclock.time - gd->gd_cpuclock_base;
944         } while (tsp->tv_sec != gd->gd_time_seconds);
945
946         if (delta >= sys_cputimer->freq) {
947                 tsp->tv_sec += delta / sys_cputimer->freq;
948                 delta %= sys_cputimer->freq;
949         }
950         tsp->tv_nsec = (sys_cputimer->freq64_nsec * delta) >> 32;
951 }
952
953 void
954 microuptime(struct timeval *tvp)
955 {
956         struct globaldata *gd = mycpu;
957         sysclock_t delta;
958
959         do {
960                 tvp->tv_sec = gd->gd_time_seconds;
961                 delta = sys_cputimer->count() - gd->gd_cpuclock_base;
962         } while (tvp->tv_sec != gd->gd_time_seconds);
963
964         if (delta >= sys_cputimer->freq) {
965                 tvp->tv_sec += delta / sys_cputimer->freq;
966                 delta %= sys_cputimer->freq;
967         }
968         tvp->tv_usec = (sys_cputimer->freq64_usec * delta) >> 32;
969 }
970
971 void
972 nanouptime(struct timespec *tsp)
973 {
974         struct globaldata *gd = mycpu;
975         sysclock_t delta;
976
977         do {
978                 tsp->tv_sec = gd->gd_time_seconds;
979                 delta = sys_cputimer->count() - gd->gd_cpuclock_base;
980         } while (tsp->tv_sec != gd->gd_time_seconds);
981
982         if (delta >= sys_cputimer->freq) {
983                 tsp->tv_sec += delta / sys_cputimer->freq;
984                 delta %= sys_cputimer->freq;
985         }
986         tsp->tv_nsec = (sys_cputimer->freq64_nsec * delta) >> 32;
987 }
988
989 /*
990  * realtime routines
991  */
992 void
993 getmicrotime(struct timeval *tvp)
994 {
995         struct globaldata *gd = mycpu;
996         struct timespec *bt;
997         sysclock_t delta;
998
999         do {
1000                 tvp->tv_sec = gd->gd_time_seconds;
1001                 delta = gd->gd_hardclock.time - gd->gd_cpuclock_base;
1002         } while (tvp->tv_sec != gd->gd_time_seconds);
1003
1004         if (delta >= sys_cputimer->freq) {
1005                 tvp->tv_sec += delta / sys_cputimer->freq;
1006                 delta %= sys_cputimer->freq;
1007         }
1008         tvp->tv_usec = (sys_cputimer->freq64_usec * delta) >> 32;
1009
1010         bt = &basetime[basetime_index];
1011         tvp->tv_sec += bt->tv_sec;
1012         tvp->tv_usec += bt->tv_nsec / 1000;
1013         while (tvp->tv_usec >= 1000000) {
1014                 tvp->tv_usec -= 1000000;
1015                 ++tvp->tv_sec;
1016         }
1017 }
1018
1019 void
1020 getnanotime(struct timespec *tsp)
1021 {
1022         struct globaldata *gd = mycpu;
1023         struct timespec *bt;
1024         sysclock_t delta;
1025
1026         do {
1027                 tsp->tv_sec = gd->gd_time_seconds;
1028                 delta = gd->gd_hardclock.time - gd->gd_cpuclock_base;
1029         } while (tsp->tv_sec != gd->gd_time_seconds);
1030
1031         if (delta >= sys_cputimer->freq) {
1032                 tsp->tv_sec += delta / sys_cputimer->freq;
1033                 delta %= sys_cputimer->freq;
1034         }
1035         tsp->tv_nsec = (sys_cputimer->freq64_nsec * delta) >> 32;
1036
1037         bt = &basetime[basetime_index];
1038         tsp->tv_sec += bt->tv_sec;
1039         tsp->tv_nsec += bt->tv_nsec;
1040         while (tsp->tv_nsec >= 1000000000) {
1041                 tsp->tv_nsec -= 1000000000;
1042                 ++tsp->tv_sec;
1043         }
1044 }
1045
1046 static void
1047 getnanotime_nbt(struct timespec *nbt, struct timespec *tsp)
1048 {
1049         struct globaldata *gd = mycpu;
1050         sysclock_t delta;
1051
1052         do {
1053                 tsp->tv_sec = gd->gd_time_seconds;
1054                 delta = gd->gd_hardclock.time - gd->gd_cpuclock_base;
1055         } while (tsp->tv_sec != gd->gd_time_seconds);
1056
1057         if (delta >= sys_cputimer->freq) {
1058                 tsp->tv_sec += delta / sys_cputimer->freq;
1059                 delta %= sys_cputimer->freq;
1060         }
1061         tsp->tv_nsec = (sys_cputimer->freq64_nsec * delta) >> 32;
1062
1063         tsp->tv_sec += nbt->tv_sec;
1064         tsp->tv_nsec += nbt->tv_nsec;
1065         while (tsp->tv_nsec >= 1000000000) {
1066                 tsp->tv_nsec -= 1000000000;
1067                 ++tsp->tv_sec;
1068         }
1069 }
1070
1071
1072 void
1073 microtime(struct timeval *tvp)
1074 {
1075         struct globaldata *gd = mycpu;
1076         struct timespec *bt;
1077         sysclock_t delta;
1078
1079         do {
1080                 tvp->tv_sec = gd->gd_time_seconds;
1081                 delta = sys_cputimer->count() - gd->gd_cpuclock_base;
1082         } while (tvp->tv_sec != gd->gd_time_seconds);
1083
1084         if (delta >= sys_cputimer->freq) {
1085                 tvp->tv_sec += delta / sys_cputimer->freq;
1086                 delta %= sys_cputimer->freq;
1087         }
1088         tvp->tv_usec = (sys_cputimer->freq64_usec * delta) >> 32;
1089
1090         bt = &basetime[basetime_index];
1091         tvp->tv_sec += bt->tv_sec;
1092         tvp->tv_usec += bt->tv_nsec / 1000;
1093         while (tvp->tv_usec >= 1000000) {
1094                 tvp->tv_usec -= 1000000;
1095                 ++tvp->tv_sec;
1096         }
1097 }
1098
1099 void
1100 nanotime(struct timespec *tsp)
1101 {
1102         struct globaldata *gd = mycpu;
1103         struct timespec *bt;
1104         sysclock_t delta;
1105
1106         do {
1107                 tsp->tv_sec = gd->gd_time_seconds;
1108                 delta = sys_cputimer->count() - gd->gd_cpuclock_base;
1109         } while (tsp->tv_sec != gd->gd_time_seconds);
1110
1111         if (delta >= sys_cputimer->freq) {
1112                 tsp->tv_sec += delta / sys_cputimer->freq;
1113                 delta %= sys_cputimer->freq;
1114         }
1115         tsp->tv_nsec = (sys_cputimer->freq64_nsec * delta) >> 32;
1116
1117         bt = &basetime[basetime_index];
1118         tsp->tv_sec += bt->tv_sec;
1119         tsp->tv_nsec += bt->tv_nsec;
1120         while (tsp->tv_nsec >= 1000000000) {
1121                 tsp->tv_nsec -= 1000000000;
1122                 ++tsp->tv_sec;
1123         }
1124 }
1125
1126 /*
1127  * note: this is not exactly synchronized with real time.  To do that we
1128  * would have to do what microtime does and check for a nanoseconds overflow.
1129  */
1130 time_t
1131 get_approximate_time_t(void)
1132 {
1133         struct globaldata *gd = mycpu;
1134         struct timespec *bt;
1135
1136         bt = &basetime[basetime_index];
1137         return(gd->gd_time_seconds + bt->tv_sec);
1138 }
1139
1140 int
1141 pps_ioctl(u_long cmd, caddr_t data, struct pps_state *pps)
1142 {
1143         pps_params_t *app;
1144         struct pps_fetch_args *fapi;
1145 #ifdef PPS_SYNC
1146         struct pps_kcbind_args *kapi;
1147 #endif
1148
1149         switch (cmd) {
1150         case PPS_IOC_CREATE:
1151                 return (0);
1152         case PPS_IOC_DESTROY:
1153                 return (0);
1154         case PPS_IOC_SETPARAMS:
1155                 app = (pps_params_t *)data;
1156                 if (app->mode & ~pps->ppscap)
1157                         return (EINVAL);
1158                 pps->ppsparam = *app;         
1159                 return (0);
1160         case PPS_IOC_GETPARAMS:
1161                 app = (pps_params_t *)data;
1162                 *app = pps->ppsparam;
1163                 app->api_version = PPS_API_VERS_1;
1164                 return (0);
1165         case PPS_IOC_GETCAP:
1166                 *(int*)data = pps->ppscap;
1167                 return (0);
1168         case PPS_IOC_FETCH:
1169                 fapi = (struct pps_fetch_args *)data;
1170                 if (fapi->tsformat && fapi->tsformat != PPS_TSFMT_TSPEC)
1171                         return (EINVAL);
1172                 if (fapi->timeout.tv_sec || fapi->timeout.tv_nsec)
1173                         return (EOPNOTSUPP);
1174                 pps->ppsinfo.current_mode = pps->ppsparam.mode;         
1175                 fapi->pps_info_buf = pps->ppsinfo;
1176                 return (0);
1177         case PPS_IOC_KCBIND:
1178 #ifdef PPS_SYNC
1179                 kapi = (struct pps_kcbind_args *)data;
1180                 /* XXX Only root should be able to do this */
1181                 if (kapi->tsformat && kapi->tsformat != PPS_TSFMT_TSPEC)
1182                         return (EINVAL);
1183                 if (kapi->kernel_consumer != PPS_KC_HARDPPS)
1184                         return (EINVAL);
1185                 if (kapi->edge & ~pps->ppscap)
1186                         return (EINVAL);
1187                 pps->kcmode = kapi->edge;
1188                 return (0);
1189 #else
1190                 return (EOPNOTSUPP);
1191 #endif
1192         default:
1193                 return (ENOTTY);
1194         }
1195 }
1196
1197 void
1198 pps_init(struct pps_state *pps)
1199 {
1200         pps->ppscap |= PPS_TSFMT_TSPEC;
1201         if (pps->ppscap & PPS_CAPTUREASSERT)
1202                 pps->ppscap |= PPS_OFFSETASSERT;
1203         if (pps->ppscap & PPS_CAPTURECLEAR)
1204                 pps->ppscap |= PPS_OFFSETCLEAR;
1205 }
1206
1207 void
1208 pps_event(struct pps_state *pps, sysclock_t count, int event)
1209 {
1210         struct globaldata *gd;
1211         struct timespec *tsp;
1212         struct timespec *osp;
1213         struct timespec *bt;
1214         struct timespec ts;
1215         sysclock_t *pcount;
1216 #ifdef PPS_SYNC
1217         sysclock_t tcount;
1218 #endif
1219         sysclock_t delta;
1220         pps_seq_t *pseq;
1221         int foff;
1222         int fhard;
1223
1224         gd = mycpu;
1225
1226         /* Things would be easier with arrays... */
1227         if (event == PPS_CAPTUREASSERT) {
1228                 tsp = &pps->ppsinfo.assert_timestamp;
1229                 osp = &pps->ppsparam.assert_offset;
1230                 foff = pps->ppsparam.mode & PPS_OFFSETASSERT;
1231                 fhard = pps->kcmode & PPS_CAPTUREASSERT;
1232                 pcount = &pps->ppscount[0];
1233                 pseq = &pps->ppsinfo.assert_sequence;
1234         } else {
1235                 tsp = &pps->ppsinfo.clear_timestamp;
1236                 osp = &pps->ppsparam.clear_offset;
1237                 foff = pps->ppsparam.mode & PPS_OFFSETCLEAR;
1238                 fhard = pps->kcmode & PPS_CAPTURECLEAR;
1239                 pcount = &pps->ppscount[1];
1240                 pseq = &pps->ppsinfo.clear_sequence;
1241         }
1242
1243         /* Nothing really happened */
1244         if (*pcount == count)
1245                 return;
1246
1247         *pcount = count;
1248
1249         do {
1250                 ts.tv_sec = gd->gd_time_seconds;
1251                 delta = count - gd->gd_cpuclock_base;
1252         } while (ts.tv_sec != gd->gd_time_seconds);
1253
1254         if (delta >= sys_cputimer->freq) {
1255                 ts.tv_sec += delta / sys_cputimer->freq;
1256                 delta %= sys_cputimer->freq;
1257         }
1258         ts.tv_nsec = (sys_cputimer->freq64_nsec * delta) >> 32;
1259         bt = &basetime[basetime_index];
1260         ts.tv_sec += bt->tv_sec;
1261         ts.tv_nsec += bt->tv_nsec;
1262         while (ts.tv_nsec >= 1000000000) {
1263                 ts.tv_nsec -= 1000000000;
1264                 ++ts.tv_sec;
1265         }
1266
1267         (*pseq)++;
1268         *tsp = ts;
1269
1270         if (foff) {
1271                 timespecadd(tsp, osp);
1272                 if (tsp->tv_nsec < 0) {
1273                         tsp->tv_nsec += 1000000000;
1274                         tsp->tv_sec -= 1;
1275                 }
1276         }
1277 #ifdef PPS_SYNC
1278         if (fhard) {
1279                 /* magic, at its best... */
1280                 tcount = count - pps->ppscount[2];
1281                 pps->ppscount[2] = count;
1282                 if (tcount >= sys_cputimer->freq) {
1283                         delta = (1000000000 * (tcount / sys_cputimer->freq) +
1284                                  sys_cputimer->freq64_nsec * 
1285                                  (tcount % sys_cputimer->freq)) >> 32;
1286                 } else {
1287                         delta = (sys_cputimer->freq64_nsec * tcount) >> 32;
1288                 }
1289                 hardpps(tsp, delta);
1290         }
1291 #endif
1292 }
1293