1 1.64 riastrad /* $NetBSD: kern_ntptime.c,v 1.64 2022/10/26 23:23:52 riastradh Exp $ */ 2 1.48 ad 3 1.48 ad /*- 4 1.48 ad * Copyright (c) 2008 The NetBSD Foundation, Inc. 5 1.48 ad * All rights reserved. 6 1.48 ad * 7 1.48 ad * Redistribution and use in source and binary forms, with or without 8 1.48 ad * modification, are permitted provided that the following conditions 9 1.48 ad * are met: 10 1.48 ad * 1. Redistributions of source code must retain the above copyright 11 1.48 ad * notice, this list of conditions and the following disclaimer. 12 1.48 ad * 2. Redistributions in binary form must reproduce the above copyright 13 1.48 ad * notice, this list of conditions and the following disclaimer in the 14 1.48 ad * documentation and/or other materials provided with the distribution. 15 1.48 ad * 16 1.48 ad * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 17 1.48 ad * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 18 1.48 ad * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19 1.48 ad * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 20 1.48 ad * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 1.48 ad * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 1.48 ad * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 1.48 ad * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 1.48 ad * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 1.48 ad * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 1.48 ad * POSSIBILITY OF SUCH DAMAGE. 27 1.48 ad */ 28 1.33 kardel 29 1.33 kardel /*- 30 1.33 kardel *********************************************************************** 31 1.33 kardel * * 32 1.33 kardel * Copyright (c) David L. Mills 1993-2001 * 33 1.33 kardel * * 34 1.33 kardel * Permission to use, copy, modify, and distribute this software and * 35 1.33 kardel * its documentation for any purpose and without fee is hereby * 36 1.33 kardel * granted, provided that the above copyright notice appears in all * 37 1.33 kardel * copies and that both the copyright notice and this permission * 38 1.33 kardel * notice appear in supporting documentation, and that the name * 39 1.33 kardel * University of Delaware not be used in advertising or publicity * 40 1.33 kardel * pertaining to distribution of the software without specific, * 41 1.33 kardel * written prior permission. The University of Delaware makes no * 42 1.33 kardel * representations about the suitability this software for any * 43 1.33 kardel * purpose. It is provided "as is" without express or implied * 44 1.33 kardel * warranty. * 45 1.33 kardel * * 46 1.33 kardel **********************************************************************/ 47 1.1 jonathan 48 1.33 kardel /* 49 1.33 kardel * Adapted from the original sources for FreeBSD and timecounters by: 50 1.33 kardel * Poul-Henning Kamp <phk (at) FreeBSD.org>. 51 1.33 kardel * 52 1.33 kardel * The 32bit version of the "LP" macros seems a bit past its "sell by" 53 1.33 kardel * date so I have retained only the 64bit version and included it directly 54 1.33 kardel * in this file. 55 1.33 kardel * 56 1.33 kardel * Only minor changes done to interface with the timecounters over in 57 1.33 kardel * sys/kern/kern_clock.c. Some of the comments below may be (even more) 58 1.33 kardel * confusing and/or plain wrong in that context. 59 1.33 kardel */ 60 1.33 kardel 61 1.33 kardel #include <sys/cdefs.h> 62 1.33 kardel /* __FBSDID("$FreeBSD: src/sys/kern/kern_ntptime.c,v 1.59 2005/05/28 14:34:41 rwatson Exp $"); */ 63 1.64 riastrad __KERNEL_RCSID(0, "$NetBSD: kern_ntptime.c,v 1.64 2022/10/26 23:23:52 riastradh Exp $"); 64 1.33 kardel 65 1.54 pooka #ifdef _KERNEL_OPT 66 1.33 kardel #include "opt_ntp.h" 67 1.54 pooka #endif 68 1.33 kardel 69 1.33 kardel #include <sys/param.h> 70 1.33 kardel #include <sys/resourcevar.h> 71 1.33 kardel #include <sys/systm.h> 72 1.33 kardel #include <sys/kernel.h> 73 1.33 kardel #include <sys/proc.h> 74 1.33 kardel #include <sys/sysctl.h> 75 1.33 kardel #include <sys/timex.h> 76 1.33 kardel #include <sys/vnode.h> 77 1.33 kardel #include <sys/kauth.h> 78 1.33 kardel #include <sys/mount.h> 79 1.33 kardel #include <sys/syscallargs.h> 80 1.48 ad #include <sys/cpu.h> 81 1.33 kardel 82 1.48 ad #include <compat/sys/timex.h> 83 1.33 kardel 84 1.33 kardel /* 85 1.33 kardel * Single-precision macros for 64-bit machines 86 1.33 kardel */ 87 1.33 kardel typedef int64_t l_fp; 88 1.33 kardel #define L_ADD(v, u) ((v) += (u)) 89 1.33 kardel #define L_SUB(v, u) ((v) -= (u)) 90 1.33 kardel #define L_ADDHI(v, a) ((v) += (int64_t)(a) << 32) 91 1.33 kardel #define L_NEG(v) ((v) = -(v)) 92 1.33 kardel #define L_RSHIFT(v, n) \ 93 1.33 kardel do { \ 94 1.33 kardel if ((v) < 0) \ 95 1.33 kardel (v) = -(-(v) >> (n)); \ 96 1.33 kardel else \ 97 1.33 kardel (v) = (v) >> (n); \ 98 1.33 kardel } while (0) 99 1.33 kardel #define L_MPY(v, a) ((v) *= (a)) 100 1.33 kardel #define L_CLR(v) ((v) = 0) 101 1.33 kardel #define L_ISNEG(v) ((v) < 0) 102 1.57 joerg #define L_LINT(v, a) ((v) = (int64_t)((uint64_t)(a) << 32)) 103 1.33 kardel #define L_GINT(v) ((v) < 0 ? -(-(v) >> 32) : (v) >> 32) 104 1.33 kardel 105 1.33 kardel #ifdef NTP 106 1.33 kardel /* 107 1.33 kardel * Generic NTP kernel interface 108 1.33 kardel * 109 1.33 kardel * These routines constitute the Network Time Protocol (NTP) interfaces 110 1.33 kardel * for user and daemon application programs. The ntp_gettime() routine 111 1.33 kardel * provides the time, maximum error (synch distance) and estimated error 112 1.33 kardel * (dispersion) to client user application programs. The ntp_adjtime() 113 1.33 kardel * routine is used by the NTP daemon to adjust the system clock to an 114 1.33 kardel * externally derived time. The time offset and related variables set by 115 1.33 kardel * this routine are used by other routines in this module to adjust the 116 1.33 kardel * phase and frequency of the clock discipline loop which controls the 117 1.33 kardel * system clock. 118 1.33 kardel * 119 1.33 kardel * When the kernel time is reckoned directly in nanoseconds (NTP_NANO 120 1.33 kardel * defined), the time at each tick interrupt is derived directly from 121 1.33 kardel * the kernel time variable. When the kernel time is reckoned in 122 1.33 kardel * microseconds, (NTP_NANO undefined), the time is derived from the 123 1.33 kardel * kernel time variable together with a variable representing the 124 1.33 kardel * leftover nanoseconds at the last tick interrupt. In either case, the 125 1.33 kardel * current nanosecond time is reckoned from these values plus an 126 1.33 kardel * interpolated value derived by the clock routines in another 127 1.33 kardel * architecture-specific module. The interpolation can use either a 128 1.33 kardel * dedicated counter or a processor cycle counter (PCC) implemented in 129 1.33 kardel * some architectures. 130 1.33 kardel * 131 1.33 kardel * Note that all routines must run at priority splclock or higher. 132 1.33 kardel */ 133 1.33 kardel /* 134 1.33 kardel * Phase/frequency-lock loop (PLL/FLL) definitions 135 1.33 kardel * 136 1.33 kardel * The nanosecond clock discipline uses two variable types, time 137 1.33 kardel * variables and frequency variables. Both types are represented as 64- 138 1.33 kardel * bit fixed-point quantities with the decimal point between two 32-bit 139 1.33 kardel * halves. On a 32-bit machine, each half is represented as a single 140 1.33 kardel * word and mathematical operations are done using multiple-precision 141 1.33 kardel * arithmetic. On a 64-bit machine, ordinary computer arithmetic is 142 1.33 kardel * used. 143 1.33 kardel * 144 1.33 kardel * A time variable is a signed 64-bit fixed-point number in ns and 145 1.33 kardel * fraction. It represents the remaining time offset to be amortized 146 1.33 kardel * over succeeding tick interrupts. The maximum time offset is about 147 1.33 kardel * 0.5 s and the resolution is about 2.3e-10 ns. 148 1.33 kardel * 149 1.33 kardel * 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 150 1.33 kardel * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 151 1.33 kardel * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 152 1.33 kardel * |s s s| ns | 153 1.33 kardel * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 154 1.33 kardel * | fraction | 155 1.33 kardel * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 156 1.33 kardel * 157 1.33 kardel * A frequency variable is a signed 64-bit fixed-point number in ns/s 158 1.33 kardel * and fraction. It represents the ns and fraction to be added to the 159 1.33 kardel * kernel time variable at each second. The maximum frequency offset is 160 1.33 kardel * about +-500000 ns/s and the resolution is about 2.3e-10 ns/s. 161 1.33 kardel * 162 1.33 kardel * 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 163 1.33 kardel * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 164 1.33 kardel * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 165 1.33 kardel * |s s s s s s s s s s s s s| ns/s | 166 1.33 kardel * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 167 1.33 kardel * | fraction | 168 1.33 kardel * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 169 1.33 kardel */ 170 1.33 kardel /* 171 1.33 kardel * The following variables establish the state of the PLL/FLL and the 172 1.33 kardel * residual time and frequency offset of the local clock. 173 1.33 kardel */ 174 1.33 kardel #define SHIFT_PLL 4 /* PLL loop gain (shift) */ 175 1.33 kardel #define SHIFT_FLL 2 /* FLL loop gain (shift) */ 176 1.33 kardel 177 1.33 kardel static int time_state = TIME_OK; /* clock state */ 178 1.33 kardel static int time_status = STA_UNSYNC; /* clock status bits */ 179 1.33 kardel static long time_tai; /* TAI offset (s) */ 180 1.33 kardel static long time_monitor; /* last time offset scaled (ns) */ 181 1.33 kardel static long time_constant; /* poll interval (shift) (s) */ 182 1.33 kardel static long time_precision = 1; /* clock precision (ns) */ 183 1.33 kardel static long time_maxerror = MAXPHASE / 1000; /* maximum error (us) */ 184 1.33 kardel static long time_esterror = MAXPHASE / 1000; /* estimated error (us) */ 185 1.53 tsutsui static time_t time_reftime; /* time at last adjustment (s) */ 186 1.33 kardel static l_fp time_offset; /* time offset (ns) */ 187 1.33 kardel static l_fp time_freq; /* frequency offset (ns/s) */ 188 1.33 kardel #endif /* NTP */ 189 1.33 kardel 190 1.33 kardel static l_fp time_adj; /* tick adjust (ns/s) */ 191 1.33 kardel int64_t time_adjtime; /* correction from adjtime(2) (usec) */ 192 1.33 kardel 193 1.33 kardel #ifdef NTP 194 1.33 kardel #ifdef PPS_SYNC 195 1.33 kardel /* 196 1.33 kardel * The following variables are used when a pulse-per-second (PPS) signal 197 1.33 kardel * is available and connected via a modem control lead. They establish 198 1.33 kardel * the engineering parameters of the clock discipline loop when 199 1.33 kardel * controlled by the PPS signal. 200 1.33 kardel */ 201 1.33 kardel #define PPS_FAVG 2 /* min freq avg interval (s) (shift) */ 202 1.33 kardel #define PPS_FAVGDEF 8 /* default freq avg int (s) (shift) */ 203 1.33 kardel #define PPS_FAVGMAX 15 /* max freq avg interval (s) (shift) */ 204 1.33 kardel #define PPS_PAVG 4 /* phase avg interval (s) (shift) */ 205 1.33 kardel #define PPS_VALID 120 /* PPS signal watchdog max (s) */ 206 1.33 kardel #define PPS_MAXWANDER 100000 /* max PPS wander (ns/s) */ 207 1.33 kardel #define PPS_POPCORN 2 /* popcorn spike threshold (shift) */ 208 1.33 kardel 209 1.33 kardel static struct timespec pps_tf[3]; /* phase median filter */ 210 1.33 kardel static l_fp pps_freq; /* scaled frequency offset (ns/s) */ 211 1.33 kardel static long pps_fcount; /* frequency accumulator */ 212 1.33 kardel static long pps_jitter; /* nominal jitter (ns) */ 213 1.33 kardel static long pps_stabil; /* nominal stability (scaled ns/s) */ 214 1.33 kardel static long pps_lastsec; /* time at last calibration (s) */ 215 1.33 kardel static int pps_valid; /* signal watchdog counter */ 216 1.33 kardel static int pps_shift = PPS_FAVG; /* interval duration (s) (shift) */ 217 1.33 kardel static int pps_shiftmax = PPS_FAVGDEF; /* max interval duration (s) (shift) */ 218 1.33 kardel static int pps_intcnt; /* wander counter */ 219 1.33 kardel 220 1.33 kardel /* 221 1.33 kardel * PPS signal quality monitors 222 1.33 kardel */ 223 1.33 kardel static long pps_calcnt; /* calibration intervals */ 224 1.33 kardel static long pps_jitcnt; /* jitter limit exceeded */ 225 1.33 kardel static long pps_stbcnt; /* stability limit exceeded */ 226 1.33 kardel static long pps_errcnt; /* calibration errors */ 227 1.33 kardel #endif /* PPS_SYNC */ 228 1.33 kardel /* 229 1.33 kardel * End of phase/frequency-lock loop (PLL/FLL) definitions 230 1.33 kardel */ 231 1.33 kardel 232 1.33 kardel static void hardupdate(long offset); 233 1.33 kardel 234 1.33 kardel /* 235 1.33 kardel * ntp_gettime() - NTP user application interface 236 1.33 kardel */ 237 1.33 kardel void 238 1.45 dsl ntp_gettime(struct ntptimeval *ntv) 239 1.33 kardel { 240 1.60 christos memset(ntv, 0, sizeof(*ntv)); 241 1.48 ad 242 1.48 ad mutex_spin_enter(&timecounter_lock); 243 1.33 kardel nanotime(&ntv->time); 244 1.33 kardel ntv->maxerror = time_maxerror; 245 1.33 kardel ntv->esterror = time_esterror; 246 1.33 kardel ntv->tai = time_tai; 247 1.33 kardel ntv->time_state = time_state; 248 1.48 ad mutex_spin_exit(&timecounter_lock); 249 1.33 kardel } 250 1.33 kardel 251 1.33 kardel /* ARGSUSED */ 252 1.33 kardel /* 253 1.33 kardel * ntp_adjtime() - NTP daemon application interface 254 1.33 kardel */ 255 1.33 kardel int 256 1.45 dsl sys_ntp_adjtime(struct lwp *l, const struct sys_ntp_adjtime_args *uap, register_t *retval) 257 1.33 kardel { 258 1.45 dsl /* { 259 1.33 kardel syscallarg(struct timex *) tp; 260 1.45 dsl } */ 261 1.33 kardel struct timex ntv; 262 1.56 maxv int error; 263 1.33 kardel 264 1.43 christos error = copyin((void *)SCARG(uap, tp), (void *)&ntv, sizeof(ntv)); 265 1.35 ad if (error != 0) 266 1.33 kardel return (error); 267 1.33 kardel 268 1.37 elad if (ntv.modes != 0 && (error = kauth_authorize_system(l->l_cred, 269 1.37 elad KAUTH_SYSTEM_TIME, KAUTH_REQ_SYSTEM_TIME_NTPADJTIME, NULL, 270 1.36 elad NULL, NULL)) != 0) 271 1.33 kardel return (error); 272 1.33 kardel 273 1.33 kardel ntp_adjtime1(&ntv); 274 1.33 kardel 275 1.43 christos error = copyout((void *)&ntv, (void *)SCARG(uap, tp), sizeof(ntv)); 276 1.35 ad if (!error) 277 1.33 kardel *retval = ntp_timestatus(); 278 1.35 ad 279 1.33 kardel return error; 280 1.33 kardel } 281 1.33 kardel 282 1.33 kardel void 283 1.45 dsl ntp_adjtime1(struct timex *ntv) 284 1.33 kardel { 285 1.33 kardel long freq; 286 1.33 kardel int modes; 287 1.33 kardel 288 1.33 kardel /* 289 1.33 kardel * Update selected clock variables - only the superuser can 290 1.33 kardel * change anything. Note that there is no error checking here on 291 1.33 kardel * the assumption the superuser should know what it is doing. 292 1.33 kardel * Note that either the time constant or TAI offset are loaded 293 1.33 kardel * from the ntv.constant member, depending on the mode bits. If 294 1.33 kardel * the STA_PLL bit in the status word is cleared, the state and 295 1.33 kardel * status words are reset to the initial values at boot. 296 1.33 kardel */ 297 1.48 ad mutex_spin_enter(&timecounter_lock); 298 1.33 kardel modes = ntv->modes; 299 1.33 kardel if (modes != 0) 300 1.33 kardel /* We need to save the system time during shutdown */ 301 1.33 kardel time_adjusted |= 2; 302 1.33 kardel if (modes & MOD_MAXERROR) 303 1.33 kardel time_maxerror = ntv->maxerror; 304 1.33 kardel if (modes & MOD_ESTERROR) 305 1.33 kardel time_esterror = ntv->esterror; 306 1.33 kardel if (modes & MOD_STATUS) { 307 1.33 kardel if (time_status & STA_PLL && !(ntv->status & STA_PLL)) { 308 1.33 kardel time_state = TIME_OK; 309 1.33 kardel time_status = STA_UNSYNC; 310 1.33 kardel #ifdef PPS_SYNC 311 1.33 kardel pps_shift = PPS_FAVG; 312 1.33 kardel #endif /* PPS_SYNC */ 313 1.33 kardel } 314 1.33 kardel time_status &= STA_RONLY; 315 1.33 kardel time_status |= ntv->status & ~STA_RONLY; 316 1.33 kardel } 317 1.33 kardel if (modes & MOD_TIMECONST) { 318 1.33 kardel if (ntv->constant < 0) 319 1.33 kardel time_constant = 0; 320 1.33 kardel else if (ntv->constant > MAXTC) 321 1.33 kardel time_constant = MAXTC; 322 1.33 kardel else 323 1.33 kardel time_constant = ntv->constant; 324 1.33 kardel } 325 1.33 kardel if (modes & MOD_TAI) { 326 1.33 kardel if (ntv->constant > 0) /* XXX zero & negative numbers ? */ 327 1.33 kardel time_tai = ntv->constant; 328 1.33 kardel } 329 1.33 kardel #ifdef PPS_SYNC 330 1.33 kardel if (modes & MOD_PPSMAX) { 331 1.33 kardel if (ntv->shift < PPS_FAVG) 332 1.33 kardel pps_shiftmax = PPS_FAVG; 333 1.33 kardel else if (ntv->shift > PPS_FAVGMAX) 334 1.33 kardel pps_shiftmax = PPS_FAVGMAX; 335 1.33 kardel else 336 1.33 kardel pps_shiftmax = ntv->shift; 337 1.33 kardel } 338 1.33 kardel #endif /* PPS_SYNC */ 339 1.33 kardel if (modes & MOD_NANO) 340 1.33 kardel time_status |= STA_NANO; 341 1.33 kardel if (modes & MOD_MICRO) 342 1.33 kardel time_status &= ~STA_NANO; 343 1.33 kardel if (modes & MOD_CLKB) 344 1.33 kardel time_status |= STA_CLK; 345 1.33 kardel if (modes & MOD_CLKA) 346 1.33 kardel time_status &= ~STA_CLK; 347 1.33 kardel if (modes & MOD_FREQUENCY) { 348 1.61 riastrad freq = MIN(INT32_MAX, MAX(INT32_MIN, ntv->freq)); 349 1.61 riastrad freq = (freq * (int64_t)1000) >> 16; 350 1.33 kardel if (freq > MAXFREQ) 351 1.33 kardel L_LINT(time_freq, MAXFREQ); 352 1.33 kardel else if (freq < -MAXFREQ) 353 1.33 kardel L_LINT(time_freq, -MAXFREQ); 354 1.33 kardel else { 355 1.33 kardel /* 356 1.33 kardel * ntv.freq is [PPM * 2^16] = [us/s * 2^16] 357 1.33 kardel * time_freq is [ns/s * 2^32] 358 1.33 kardel */ 359 1.33 kardel time_freq = ntv->freq * 1000LL * 65536LL; 360 1.33 kardel } 361 1.33 kardel #ifdef PPS_SYNC 362 1.33 kardel pps_freq = time_freq; 363 1.33 kardel #endif /* PPS_SYNC */ 364 1.33 kardel } 365 1.33 kardel if (modes & MOD_OFFSET) { 366 1.62 riastrad if (time_status & STA_NANO) { 367 1.33 kardel hardupdate(ntv->offset); 368 1.62 riastrad } else { 369 1.62 riastrad long offset = ntv->offset; 370 1.62 riastrad offset = MIN(offset, MAXPHASE/1000); 371 1.62 riastrad offset = MAX(offset, -MAXPHASE/1000); 372 1.62 riastrad hardupdate(offset * 1000); 373 1.62 riastrad } 374 1.33 kardel } 375 1.33 kardel 376 1.33 kardel /* 377 1.33 kardel * Retrieve all clock variables. Note that the TAI offset is 378 1.33 kardel * returned only by ntp_gettime(); 379 1.33 kardel */ 380 1.33 kardel if (time_status & STA_NANO) 381 1.33 kardel ntv->offset = L_GINT(time_offset); 382 1.33 kardel else 383 1.33 kardel ntv->offset = L_GINT(time_offset) / 1000; /* XXX rounding ? */ 384 1.63 riastrad if (time_freq < 0) 385 1.63 riastrad ntv->freq = L_GINT(-((-time_freq / 1000LL) << 16)); 386 1.63 riastrad else 387 1.63 riastrad ntv->freq = L_GINT((time_freq / 1000LL) << 16); 388 1.33 kardel ntv->maxerror = time_maxerror; 389 1.33 kardel ntv->esterror = time_esterror; 390 1.33 kardel ntv->status = time_status; 391 1.33 kardel ntv->constant = time_constant; 392 1.33 kardel if (time_status & STA_NANO) 393 1.33 kardel ntv->precision = time_precision; 394 1.33 kardel else 395 1.33 kardel ntv->precision = time_precision / 1000; 396 1.33 kardel ntv->tolerance = MAXFREQ * SCALE_PPM; 397 1.33 kardel #ifdef PPS_SYNC 398 1.33 kardel ntv->shift = pps_shift; 399 1.33 kardel ntv->ppsfreq = L_GINT((pps_freq / 1000LL) << 16); 400 1.33 kardel if (time_status & STA_NANO) 401 1.33 kardel ntv->jitter = pps_jitter; 402 1.33 kardel else 403 1.33 kardel ntv->jitter = pps_jitter / 1000; 404 1.33 kardel ntv->stabil = pps_stabil; 405 1.33 kardel ntv->calcnt = pps_calcnt; 406 1.33 kardel ntv->errcnt = pps_errcnt; 407 1.33 kardel ntv->jitcnt = pps_jitcnt; 408 1.33 kardel ntv->stbcnt = pps_stbcnt; 409 1.33 kardel #endif /* PPS_SYNC */ 410 1.48 ad mutex_spin_exit(&timecounter_lock); 411 1.33 kardel } 412 1.33 kardel #endif /* NTP */ 413 1.33 kardel 414 1.33 kardel /* 415 1.33 kardel * second_overflow() - called after ntp_tick_adjust() 416 1.33 kardel * 417 1.33 kardel * This routine is ordinarily called immediately following the above 418 1.33 kardel * routine ntp_tick_adjust(). While these two routines are normally 419 1.33 kardel * combined, they are separated here only for the purposes of 420 1.33 kardel * simulation. 421 1.33 kardel */ 422 1.33 kardel void 423 1.33 kardel ntp_update_second(int64_t *adjustment, time_t *newsec) 424 1.33 kardel { 425 1.33 kardel int tickrate; 426 1.33 kardel l_fp ftemp; /* 32/64-bit temporary */ 427 1.33 kardel 428 1.59 riastrad KASSERT(mutex_owned(&timecounter_lock)); 429 1.48 ad 430 1.33 kardel #ifdef NTP 431 1.33 kardel 432 1.33 kardel /* 433 1.33 kardel * On rollover of the second both the nanosecond and microsecond 434 1.33 kardel * clocks are updated and the state machine cranked as 435 1.33 kardel * necessary. The phase adjustment to be used for the next 436 1.33 kardel * second is calculated and the maximum error is increased by 437 1.33 kardel * the tolerance. 438 1.33 kardel */ 439 1.33 kardel time_maxerror += MAXFREQ / 1000; 440 1.33 kardel 441 1.33 kardel /* 442 1.33 kardel * Leap second processing. If in leap-insert state at 443 1.33 kardel * the end of the day, the system clock is set back one 444 1.33 kardel * second; if in leap-delete state, the system clock is 445 1.33 kardel * set ahead one second. The nano_time() routine or 446 1.33 kardel * external clock driver will insure that reported time 447 1.33 kardel * is always monotonic. 448 1.33 kardel */ 449 1.33 kardel switch (time_state) { 450 1.33 kardel 451 1.33 kardel /* 452 1.33 kardel * No warning. 453 1.33 kardel */ 454 1.33 kardel case TIME_OK: 455 1.33 kardel if (time_status & STA_INS) 456 1.33 kardel time_state = TIME_INS; 457 1.33 kardel else if (time_status & STA_DEL) 458 1.33 kardel time_state = TIME_DEL; 459 1.33 kardel break; 460 1.33 kardel 461 1.33 kardel /* 462 1.33 kardel * Insert second 23:59:60 following second 463 1.33 kardel * 23:59:59. 464 1.33 kardel */ 465 1.33 kardel case TIME_INS: 466 1.33 kardel if (!(time_status & STA_INS)) 467 1.33 kardel time_state = TIME_OK; 468 1.33 kardel else if ((*newsec) % 86400 == 0) { 469 1.33 kardel (*newsec)--; 470 1.33 kardel time_state = TIME_OOP; 471 1.33 kardel time_tai++; 472 1.33 kardel } 473 1.33 kardel break; 474 1.33 kardel 475 1.33 kardel /* 476 1.33 kardel * Delete second 23:59:59. 477 1.33 kardel */ 478 1.33 kardel case TIME_DEL: 479 1.33 kardel if (!(time_status & STA_DEL)) 480 1.33 kardel time_state = TIME_OK; 481 1.33 kardel else if (((*newsec) + 1) % 86400 == 0) { 482 1.33 kardel (*newsec)++; 483 1.33 kardel time_tai--; 484 1.33 kardel time_state = TIME_WAIT; 485 1.33 kardel } 486 1.33 kardel break; 487 1.33 kardel 488 1.33 kardel /* 489 1.33 kardel * Insert second in progress. 490 1.33 kardel */ 491 1.33 kardel case TIME_OOP: 492 1.33 kardel time_state = TIME_WAIT; 493 1.33 kardel break; 494 1.33 kardel 495 1.33 kardel /* 496 1.33 kardel * Wait for status bits to clear. 497 1.33 kardel */ 498 1.33 kardel case TIME_WAIT: 499 1.33 kardel if (!(time_status & (STA_INS | STA_DEL))) 500 1.33 kardel time_state = TIME_OK; 501 1.33 kardel } 502 1.33 kardel 503 1.33 kardel /* 504 1.33 kardel * Compute the total time adjustment for the next second 505 1.33 kardel * in ns. The offset is reduced by a factor depending on 506 1.33 kardel * whether the PPS signal is operating. Note that the 507 1.33 kardel * value is in effect scaled by the clock frequency, 508 1.33 kardel * since the adjustment is added at each tick interrupt. 509 1.33 kardel */ 510 1.33 kardel ftemp = time_offset; 511 1.33 kardel #ifdef PPS_SYNC 512 1.33 kardel /* XXX even if PPS signal dies we should finish adjustment ? */ 513 1.33 kardel if (time_status & STA_PPSTIME && time_status & 514 1.33 kardel STA_PPSSIGNAL) 515 1.33 kardel L_RSHIFT(ftemp, pps_shift); 516 1.33 kardel else 517 1.33 kardel L_RSHIFT(ftemp, SHIFT_PLL + time_constant); 518 1.33 kardel #else 519 1.33 kardel L_RSHIFT(ftemp, SHIFT_PLL + time_constant); 520 1.33 kardel #endif /* PPS_SYNC */ 521 1.33 kardel time_adj = ftemp; 522 1.33 kardel L_SUB(time_offset, ftemp); 523 1.33 kardel L_ADD(time_adj, time_freq); 524 1.33 kardel 525 1.33 kardel #ifdef PPS_SYNC 526 1.33 kardel if (pps_valid > 0) 527 1.33 kardel pps_valid--; 528 1.33 kardel else 529 1.33 kardel time_status &= ~STA_PPSSIGNAL; 530 1.33 kardel #endif /* PPS_SYNC */ 531 1.34 kardel #else /* !NTP */ 532 1.34 kardel L_CLR(time_adj); 533 1.34 kardel #endif /* !NTP */ 534 1.33 kardel 535 1.33 kardel /* 536 1.33 kardel * Apply any correction from adjtime(2). If more than one second 537 1.33 kardel * off we slew at a rate of 5ms/s (5000 PPM) else 500us/s (500PPM) 538 1.33 kardel * until the last second is slewed the final < 500 usecs. 539 1.33 kardel */ 540 1.33 kardel if (time_adjtime != 0) { 541 1.33 kardel if (time_adjtime > 1000000) 542 1.33 kardel tickrate = 5000; 543 1.33 kardel else if (time_adjtime < -1000000) 544 1.33 kardel tickrate = -5000; 545 1.33 kardel else if (time_adjtime > 500) 546 1.33 kardel tickrate = 500; 547 1.33 kardel else if (time_adjtime < -500) 548 1.33 kardel tickrate = -500; 549 1.33 kardel else 550 1.33 kardel tickrate = time_adjtime; 551 1.33 kardel time_adjtime -= tickrate; 552 1.33 kardel L_LINT(ftemp, tickrate * 1000); 553 1.33 kardel L_ADD(time_adj, ftemp); 554 1.33 kardel } 555 1.33 kardel *adjustment = time_adj; 556 1.33 kardel } 557 1.33 kardel 558 1.33 kardel /* 559 1.33 kardel * ntp_init() - initialize variables and structures 560 1.33 kardel * 561 1.33 kardel * This routine must be called after the kernel variables hz and tick 562 1.33 kardel * are set or changed and before the next tick interrupt. In this 563 1.33 kardel * particular implementation, these values are assumed set elsewhere in 564 1.33 kardel * the kernel. The design allows the clock frequency and tick interval 565 1.33 kardel * to be changed while the system is running. So, this routine should 566 1.33 kardel * probably be integrated with the code that does that. 567 1.33 kardel */ 568 1.33 kardel void 569 1.33 kardel ntp_init(void) 570 1.33 kardel { 571 1.33 kardel 572 1.33 kardel /* 573 1.33 kardel * The following variables are initialized only at startup. Only 574 1.33 kardel * those structures not cleared by the compiler need to be 575 1.33 kardel * initialized, and these only in the simulator. In the actual 576 1.33 kardel * kernel, any nonzero values here will quickly evaporate. 577 1.33 kardel */ 578 1.33 kardel L_CLR(time_adj); 579 1.33 kardel #ifdef NTP 580 1.33 kardel L_CLR(time_offset); 581 1.33 kardel L_CLR(time_freq); 582 1.33 kardel #ifdef PPS_SYNC 583 1.33 kardel pps_tf[0].tv_sec = pps_tf[0].tv_nsec = 0; 584 1.33 kardel pps_tf[1].tv_sec = pps_tf[1].tv_nsec = 0; 585 1.33 kardel pps_tf[2].tv_sec = pps_tf[2].tv_nsec = 0; 586 1.33 kardel pps_fcount = 0; 587 1.33 kardel L_CLR(pps_freq); 588 1.33 kardel #endif /* PPS_SYNC */ 589 1.33 kardel #endif 590 1.33 kardel } 591 1.33 kardel 592 1.33 kardel #ifdef NTP 593 1.33 kardel /* 594 1.33 kardel * hardupdate() - local clock update 595 1.33 kardel * 596 1.33 kardel * This routine is called by ntp_adjtime() to update the local clock 597 1.33 kardel * phase and frequency. The implementation is of an adaptive-parameter, 598 1.33 kardel * hybrid phase/frequency-lock loop (PLL/FLL). The routine computes new 599 1.33 kardel * time and frequency offset estimates for each call. If the kernel PPS 600 1.33 kardel * discipline code is configured (PPS_SYNC), the PPS signal itself 601 1.33 kardel * determines the new time offset, instead of the calling argument. 602 1.33 kardel * Presumably, calls to ntp_adjtime() occur only when the caller 603 1.33 kardel * believes the local clock is valid within some bound (+-128 ms with 604 1.33 kardel * NTP). If the caller's time is far different than the PPS time, an 605 1.33 kardel * argument will ensue, and it's not clear who will lose. 606 1.33 kardel * 607 1.33 kardel * For uncompensated quartz crystal oscillators and nominal update 608 1.33 kardel * intervals less than 256 s, operation should be in phase-lock mode, 609 1.33 kardel * where the loop is disciplined to phase. For update intervals greater 610 1.33 kardel * than 1024 s, operation should be in frequency-lock mode, where the 611 1.33 kardel * loop is disciplined to frequency. Between 256 s and 1024 s, the mode 612 1.33 kardel * is selected by the STA_MODE status bit. 613 1.33 kardel * 614 1.33 kardel * Note: splclock() is in effect. 615 1.33 kardel */ 616 1.33 kardel void 617 1.33 kardel hardupdate(long offset) 618 1.33 kardel { 619 1.33 kardel long mtemp; 620 1.33 kardel l_fp ftemp; 621 1.33 kardel 622 1.48 ad KASSERT(mutex_owned(&timecounter_lock)); 623 1.48 ad 624 1.33 kardel /* 625 1.33 kardel * Select how the phase is to be controlled and from which 626 1.33 kardel * source. If the PPS signal is present and enabled to 627 1.33 kardel * discipline the time, the PPS offset is used; otherwise, the 628 1.33 kardel * argument offset is used. 629 1.33 kardel */ 630 1.33 kardel if (!(time_status & STA_PLL)) 631 1.33 kardel return; 632 1.33 kardel if (!(time_status & STA_PPSTIME && time_status & 633 1.33 kardel STA_PPSSIGNAL)) { 634 1.33 kardel if (offset > MAXPHASE) 635 1.33 kardel time_monitor = MAXPHASE; 636 1.33 kardel else if (offset < -MAXPHASE) 637 1.33 kardel time_monitor = -MAXPHASE; 638 1.33 kardel else 639 1.33 kardel time_monitor = offset; 640 1.33 kardel L_LINT(time_offset, time_monitor); 641 1.33 kardel } 642 1.33 kardel 643 1.33 kardel /* 644 1.33 kardel * Select how the frequency is to be controlled and in which 645 1.33 kardel * mode (PLL or FLL). If the PPS signal is present and enabled 646 1.33 kardel * to discipline the frequency, the PPS frequency is used; 647 1.33 kardel * otherwise, the argument offset is used to compute it. 648 1.33 kardel */ 649 1.33 kardel if (time_status & STA_PPSFREQ && time_status & STA_PPSSIGNAL) { 650 1.33 kardel time_reftime = time_second; 651 1.33 kardel return; 652 1.33 kardel } 653 1.33 kardel if (time_status & STA_FREQHOLD || time_reftime == 0) 654 1.33 kardel time_reftime = time_second; 655 1.33 kardel mtemp = time_second - time_reftime; 656 1.33 kardel L_LINT(ftemp, time_monitor); 657 1.33 kardel L_RSHIFT(ftemp, (SHIFT_PLL + 2 + time_constant) << 1); 658 1.33 kardel L_MPY(ftemp, mtemp); 659 1.33 kardel L_ADD(time_freq, ftemp); 660 1.33 kardel time_status &= ~STA_MODE; 661 1.33 kardel if (mtemp >= MINSEC && (time_status & STA_FLL || mtemp > 662 1.33 kardel MAXSEC)) { 663 1.33 kardel L_LINT(ftemp, (time_monitor << 4) / mtemp); 664 1.33 kardel L_RSHIFT(ftemp, SHIFT_FLL + 4); 665 1.33 kardel L_ADD(time_freq, ftemp); 666 1.33 kardel time_status |= STA_MODE; 667 1.33 kardel } 668 1.33 kardel time_reftime = time_second; 669 1.33 kardel if (L_GINT(time_freq) > MAXFREQ) 670 1.33 kardel L_LINT(time_freq, MAXFREQ); 671 1.33 kardel else if (L_GINT(time_freq) < -MAXFREQ) 672 1.33 kardel L_LINT(time_freq, -MAXFREQ); 673 1.33 kardel } 674 1.33 kardel 675 1.33 kardel #ifdef PPS_SYNC 676 1.33 kardel /* 677 1.33 kardel * hardpps() - discipline CPU clock oscillator to external PPS signal 678 1.33 kardel * 679 1.33 kardel * This routine is called at each PPS interrupt in order to discipline 680 1.33 kardel * the CPU clock oscillator to the PPS signal. It measures the PPS phase 681 1.33 kardel * and leaves it in a handy spot for the hardclock() routine. It 682 1.33 kardel * integrates successive PPS phase differences and calculates the 683 1.33 kardel * frequency offset. This is used in hardclock() to discipline the CPU 684 1.33 kardel * clock oscillator so that intrinsic frequency error is cancelled out. 685 1.33 kardel * The code requires the caller to capture the time and hardware counter 686 1.33 kardel * value at the on-time PPS signal transition. 687 1.33 kardel * 688 1.33 kardel * Note that, on some Unix systems, this routine runs at an interrupt 689 1.33 kardel * priority level higher than the timer interrupt routine hardclock(). 690 1.33 kardel * Therefore, the variables used are distinct from the hardclock() 691 1.33 kardel * variables, except for certain exceptions: The PPS frequency pps_freq 692 1.33 kardel * and phase pps_offset variables are determined by this routine and 693 1.33 kardel * updated atomically. The time_tolerance variable can be considered a 694 1.33 kardel * constant, since it is infrequently changed, and then only when the 695 1.33 kardel * PPS signal is disabled. The watchdog counter pps_valid is updated 696 1.33 kardel * once per second by hardclock() and is atomically cleared in this 697 1.33 kardel * routine. 698 1.33 kardel */ 699 1.33 kardel void 700 1.33 kardel hardpps(struct timespec *tsp, /* time at PPS */ 701 1.33 kardel long nsec /* hardware counter at PPS */) 702 1.33 kardel { 703 1.33 kardel long u_sec, u_nsec, v_nsec; /* temps */ 704 1.33 kardel l_fp ftemp; 705 1.33 kardel 706 1.48 ad KASSERT(mutex_owned(&timecounter_lock)); 707 1.48 ad 708 1.33 kardel /* 709 1.33 kardel * The signal is first processed by a range gate and frequency 710 1.33 kardel * discriminator. The range gate rejects noise spikes outside 711 1.33 kardel * the range +-500 us. The frequency discriminator rejects input 712 1.33 kardel * signals with apparent frequency outside the range 1 +-500 713 1.33 kardel * PPM. If two hits occur in the same second, we ignore the 714 1.33 kardel * later hit; if not and a hit occurs outside the range gate, 715 1.33 kardel * keep the later hit for later comparison, but do not process 716 1.33 kardel * it. 717 1.33 kardel */ 718 1.33 kardel time_status |= STA_PPSSIGNAL | STA_PPSJITTER; 719 1.33 kardel time_status &= ~(STA_PPSWANDER | STA_PPSERROR); 720 1.33 kardel pps_valid = PPS_VALID; 721 1.33 kardel u_sec = tsp->tv_sec; 722 1.33 kardel u_nsec = tsp->tv_nsec; 723 1.33 kardel if (u_nsec >= (NANOSECOND >> 1)) { 724 1.33 kardel u_nsec -= NANOSECOND; 725 1.33 kardel u_sec++; 726 1.33 kardel } 727 1.33 kardel v_nsec = u_nsec - pps_tf[0].tv_nsec; 728 1.33 kardel if (u_sec == pps_tf[0].tv_sec && v_nsec < NANOSECOND - 729 1.33 kardel MAXFREQ) 730 1.33 kardel return; 731 1.33 kardel pps_tf[2] = pps_tf[1]; 732 1.33 kardel pps_tf[1] = pps_tf[0]; 733 1.33 kardel pps_tf[0].tv_sec = u_sec; 734 1.33 kardel pps_tf[0].tv_nsec = u_nsec; 735 1.33 kardel 736 1.33 kardel /* 737 1.33 kardel * Compute the difference between the current and previous 738 1.33 kardel * counter values. If the difference exceeds 0.5 s, assume it 739 1.33 kardel * has wrapped around, so correct 1.0 s. If the result exceeds 740 1.33 kardel * the tick interval, the sample point has crossed a tick 741 1.33 kardel * boundary during the last second, so correct the tick. Very 742 1.33 kardel * intricate. 743 1.33 kardel */ 744 1.33 kardel u_nsec = nsec; 745 1.33 kardel if (u_nsec > (NANOSECOND >> 1)) 746 1.33 kardel u_nsec -= NANOSECOND; 747 1.33 kardel else if (u_nsec < -(NANOSECOND >> 1)) 748 1.33 kardel u_nsec += NANOSECOND; 749 1.33 kardel pps_fcount += u_nsec; 750 1.33 kardel if (v_nsec > MAXFREQ || v_nsec < -MAXFREQ) 751 1.33 kardel return; 752 1.33 kardel time_status &= ~STA_PPSJITTER; 753 1.33 kardel 754 1.33 kardel /* 755 1.33 kardel * A three-stage median filter is used to help denoise the PPS 756 1.33 kardel * time. The median sample becomes the time offset estimate; the 757 1.33 kardel * difference between the other two samples becomes the time 758 1.33 kardel * dispersion (jitter) estimate. 759 1.33 kardel */ 760 1.33 kardel if (pps_tf[0].tv_nsec > pps_tf[1].tv_nsec) { 761 1.33 kardel if (pps_tf[1].tv_nsec > pps_tf[2].tv_nsec) { 762 1.33 kardel v_nsec = pps_tf[1].tv_nsec; /* 0 1 2 */ 763 1.33 kardel u_nsec = pps_tf[0].tv_nsec - pps_tf[2].tv_nsec; 764 1.33 kardel } else if (pps_tf[2].tv_nsec > pps_tf[0].tv_nsec) { 765 1.33 kardel v_nsec = pps_tf[0].tv_nsec; /* 2 0 1 */ 766 1.33 kardel u_nsec = pps_tf[2].tv_nsec - pps_tf[1].tv_nsec; 767 1.33 kardel } else { 768 1.33 kardel v_nsec = pps_tf[2].tv_nsec; /* 0 2 1 */ 769 1.33 kardel u_nsec = pps_tf[0].tv_nsec - pps_tf[1].tv_nsec; 770 1.33 kardel } 771 1.33 kardel } else { 772 1.33 kardel if (pps_tf[1].tv_nsec < pps_tf[2].tv_nsec) { 773 1.33 kardel v_nsec = pps_tf[1].tv_nsec; /* 2 1 0 */ 774 1.33 kardel u_nsec = pps_tf[2].tv_nsec - pps_tf[0].tv_nsec; 775 1.33 kardel } else if (pps_tf[2].tv_nsec < pps_tf[0].tv_nsec) { 776 1.33 kardel v_nsec = pps_tf[0].tv_nsec; /* 1 0 2 */ 777 1.33 kardel u_nsec = pps_tf[1].tv_nsec - pps_tf[2].tv_nsec; 778 1.33 kardel } else { 779 1.33 kardel v_nsec = pps_tf[2].tv_nsec; /* 1 2 0 */ 780 1.33 kardel u_nsec = pps_tf[1].tv_nsec - pps_tf[0].tv_nsec; 781 1.33 kardel } 782 1.33 kardel } 783 1.33 kardel 784 1.33 kardel /* 785 1.33 kardel * Nominal jitter is due to PPS signal noise and interrupt 786 1.33 kardel * latency. If it exceeds the popcorn threshold, the sample is 787 1.33 kardel * discarded. otherwise, if so enabled, the time offset is 788 1.33 kardel * updated. We can tolerate a modest loss of data here without 789 1.33 kardel * much degrading time accuracy. 790 1.33 kardel */ 791 1.33 kardel if (u_nsec > (pps_jitter << PPS_POPCORN)) { 792 1.33 kardel time_status |= STA_PPSJITTER; 793 1.33 kardel pps_jitcnt++; 794 1.33 kardel } else if (time_status & STA_PPSTIME) { 795 1.33 kardel time_monitor = -v_nsec; 796 1.33 kardel L_LINT(time_offset, time_monitor); 797 1.33 kardel } 798 1.33 kardel pps_jitter += (u_nsec - pps_jitter) >> PPS_FAVG; 799 1.33 kardel u_sec = pps_tf[0].tv_sec - pps_lastsec; 800 1.33 kardel if (u_sec < (1 << pps_shift)) 801 1.33 kardel return; 802 1.33 kardel 803 1.33 kardel /* 804 1.33 kardel * At the end of the calibration interval the difference between 805 1.33 kardel * the first and last counter values becomes the scaled 806 1.33 kardel * frequency. It will later be divided by the length of the 807 1.33 kardel * interval to determine the frequency update. If the frequency 808 1.33 kardel * exceeds a sanity threshold, or if the actual calibration 809 1.33 kardel * interval is not equal to the expected length, the data are 810 1.33 kardel * discarded. We can tolerate a modest loss of data here without 811 1.33 kardel * much degrading frequency accuracy. 812 1.33 kardel */ 813 1.33 kardel pps_calcnt++; 814 1.33 kardel v_nsec = -pps_fcount; 815 1.33 kardel pps_lastsec = pps_tf[0].tv_sec; 816 1.33 kardel pps_fcount = 0; 817 1.33 kardel u_nsec = MAXFREQ << pps_shift; 818 1.33 kardel if (v_nsec > u_nsec || v_nsec < -u_nsec || u_sec != (1 << 819 1.33 kardel pps_shift)) { 820 1.33 kardel time_status |= STA_PPSERROR; 821 1.33 kardel pps_errcnt++; 822 1.33 kardel return; 823 1.33 kardel } 824 1.33 kardel 825 1.33 kardel /* 826 1.33 kardel * Here the raw frequency offset and wander (stability) is 827 1.33 kardel * calculated. If the wander is less than the wander threshold 828 1.33 kardel * for four consecutive averaging intervals, the interval is 829 1.33 kardel * doubled; if it is greater than the threshold for four 830 1.33 kardel * consecutive intervals, the interval is halved. The scaled 831 1.33 kardel * frequency offset is converted to frequency offset. The 832 1.33 kardel * stability metric is calculated as the average of recent 833 1.33 kardel * frequency changes, but is used only for performance 834 1.33 kardel * monitoring. 835 1.33 kardel */ 836 1.33 kardel L_LINT(ftemp, v_nsec); 837 1.33 kardel L_RSHIFT(ftemp, pps_shift); 838 1.33 kardel L_SUB(ftemp, pps_freq); 839 1.33 kardel u_nsec = L_GINT(ftemp); 840 1.33 kardel if (u_nsec > PPS_MAXWANDER) { 841 1.33 kardel L_LINT(ftemp, PPS_MAXWANDER); 842 1.33 kardel pps_intcnt--; 843 1.33 kardel time_status |= STA_PPSWANDER; 844 1.33 kardel pps_stbcnt++; 845 1.33 kardel } else if (u_nsec < -PPS_MAXWANDER) { 846 1.33 kardel L_LINT(ftemp, -PPS_MAXWANDER); 847 1.33 kardel pps_intcnt--; 848 1.33 kardel time_status |= STA_PPSWANDER; 849 1.33 kardel pps_stbcnt++; 850 1.33 kardel } else { 851 1.33 kardel pps_intcnt++; 852 1.33 kardel } 853 1.33 kardel if (pps_intcnt >= 4) { 854 1.33 kardel pps_intcnt = 4; 855 1.33 kardel if (pps_shift < pps_shiftmax) { 856 1.33 kardel pps_shift++; 857 1.33 kardel pps_intcnt = 0; 858 1.33 kardel } 859 1.33 kardel } else if (pps_intcnt <= -4 || pps_shift > pps_shiftmax) { 860 1.33 kardel pps_intcnt = -4; 861 1.33 kardel if (pps_shift > PPS_FAVG) { 862 1.33 kardel pps_shift--; 863 1.33 kardel pps_intcnt = 0; 864 1.33 kardel } 865 1.33 kardel } 866 1.33 kardel if (u_nsec < 0) 867 1.33 kardel u_nsec = -u_nsec; 868 1.33 kardel pps_stabil += (u_nsec * SCALE_PPM - pps_stabil) >> PPS_FAVG; 869 1.33 kardel 870 1.33 kardel /* 871 1.33 kardel * The PPS frequency is recalculated and clamped to the maximum 872 1.33 kardel * MAXFREQ. If enabled, the system clock frequency is updated as 873 1.33 kardel * well. 874 1.33 kardel */ 875 1.33 kardel L_ADD(pps_freq, ftemp); 876 1.33 kardel u_nsec = L_GINT(pps_freq); 877 1.33 kardel if (u_nsec > MAXFREQ) 878 1.33 kardel L_LINT(pps_freq, MAXFREQ); 879 1.33 kardel else if (u_nsec < -MAXFREQ) 880 1.33 kardel L_LINT(pps_freq, -MAXFREQ); 881 1.33 kardel if (time_status & STA_PPSFREQ) 882 1.33 kardel time_freq = pps_freq; 883 1.33 kardel } 884 1.33 kardel #endif /* PPS_SYNC */ 885 1.33 kardel #endif /* NTP */ 886 1.33 kardel 887 1.33 kardel #ifdef NTP 888 1.33 kardel int 889 1.47 matt ntp_timestatus(void) 890 1.33 kardel { 891 1.48 ad int rv; 892 1.48 ad 893 1.33 kardel /* 894 1.33 kardel * Status word error decode. If any of these conditions 895 1.33 kardel * occur, an error is returned, instead of the status 896 1.33 kardel * word. Most applications will care only about the fact 897 1.33 kardel * the system clock may not be trusted, not about the 898 1.33 kardel * details. 899 1.33 kardel * 900 1.33 kardel * Hardware or software error 901 1.33 kardel */ 902 1.48 ad mutex_spin_enter(&timecounter_lock); 903 1.33 kardel if ((time_status & (STA_UNSYNC | STA_CLOCKERR)) || 904 1.33 kardel 905 1.33 kardel /* 906 1.33 kardel * PPS signal lost when either time or frequency 907 1.33 kardel * synchronization requested 908 1.33 kardel */ 909 1.33 kardel (time_status & (STA_PPSFREQ | STA_PPSTIME) && 910 1.33 kardel !(time_status & STA_PPSSIGNAL)) || 911 1.33 kardel 912 1.33 kardel /* 913 1.33 kardel * PPS jitter exceeded when time synchronization 914 1.33 kardel * requested 915 1.33 kardel */ 916 1.33 kardel (time_status & STA_PPSTIME && 917 1.33 kardel time_status & STA_PPSJITTER) || 918 1.33 kardel 919 1.33 kardel /* 920 1.33 kardel * PPS wander exceeded or calibration error when 921 1.33 kardel * frequency synchronization requested 922 1.33 kardel */ 923 1.33 kardel (time_status & STA_PPSFREQ && 924 1.33 kardel time_status & (STA_PPSWANDER | STA_PPSERROR))) 925 1.48 ad rv = TIME_ERROR; 926 1.33 kardel else 927 1.48 ad rv = time_state; 928 1.48 ad mutex_spin_exit(&timecounter_lock); 929 1.48 ad 930 1.48 ad return rv; 931 1.33 kardel } 932 1.1 jonathan 933 1.33 kardel /*ARGSUSED*/ 934 1.33 kardel /* 935 1.33 kardel * ntp_gettime() - NTP user application interface 936 1.33 kardel */ 937 1.33 kardel int 938 1.51 christos sys___ntp_gettime50(struct lwp *l, const struct sys___ntp_gettime50_args *uap, register_t *retval) 939 1.33 kardel { 940 1.45 dsl /* { 941 1.33 kardel syscallarg(struct ntptimeval *) ntvp; 942 1.45 dsl } */ 943 1.33 kardel struct ntptimeval ntv; 944 1.33 kardel int error = 0; 945 1.33 kardel 946 1.33 kardel if (SCARG(uap, ntvp)) { 947 1.33 kardel ntp_gettime(&ntv); 948 1.33 kardel 949 1.43 christos error = copyout((void *)&ntv, (void *)SCARG(uap, ntvp), 950 1.33 kardel sizeof(ntv)); 951 1.33 kardel } 952 1.1 jonathan if (!error) { 953 1.33 kardel *retval = ntp_timestatus(); 954 1.33 kardel } 955 1.33 kardel return(error); 956 1.33 kardel } 957 1.1 jonathan 958 1.1 jonathan /* 959 1.1 jonathan * return information about kernel precision timekeeping 960 1.1 jonathan */ 961 1.25 atatat static int 962 1.25 atatat sysctl_kern_ntptime(SYSCTLFN_ARGS) 963 1.1 jonathan { 964 1.25 atatat struct sysctlnode node; 965 1.1 jonathan struct ntptimeval ntv; 966 1.1 jonathan 967 1.31 drochner ntp_gettime(&ntv); 968 1.25 atatat 969 1.25 atatat node = *rnode; 970 1.25 atatat node.sysctl_data = &ntv; 971 1.25 atatat node.sysctl_size = sizeof(ntv); 972 1.25 atatat return (sysctl_lookup(SYSCTLFN_CALL(&node))); 973 1.25 atatat } 974 1.25 atatat 975 1.25 atatat SYSCTL_SETUP(sysctl_kern_ntptime_setup, "sysctl kern.ntptime node setup") 976 1.25 atatat { 977 1.25 atatat 978 1.26 atatat sysctl_createv(clog, 0, NULL, NULL, 979 1.26 atatat CTLFLAG_PERMANENT, 980 1.27 atatat CTLTYPE_STRUCT, "ntptime", 981 1.27 atatat SYSCTL_DESCR("Kernel clock values for NTP"), 982 1.25 atatat sysctl_kern_ntptime, 0, NULL, 983 1.25 atatat sizeof(struct ntptimeval), 984 1.25 atatat CTL_KERN, KERN_NTPTIME, CTL_EOL); 985 1.1 jonathan } 986 1.13 bjh21 #endif /* !NTP */ 987