+ s = splhigh(); time = *tv; splx(s);
+ resettodr();
+}
+
+extern int tickadj; /* "standard" clock skew, us./tick */
+int tickdelta; /* current clock skew, us. per tick */
+long timedelta; /* unapplied time correction, us. */
+long bigadj = 1000000; /* use 10x skew above bigadj us. */
+
+adjtime()
+{
+ register struct a {
+ struct timeval *delta;
+ struct timeval *olddelta;
+ } *uap = (struct a *)u.u_ap;
+ struct timeval atv, oatv;
+ register long ndelta;
+ int s;
+
+ if (!suser())
+ return;
+ u.u_error = copyin((caddr_t)uap->delta, (caddr_t)&atv,
+ sizeof (struct timeval));
+ if (u.u_error)
+ return;
+ ndelta = atv.tv_sec * 1000000 + atv.tv_usec;
+ if (timedelta == 0)
+ if (ndelta > bigadj)
+ tickdelta = 10 * tickadj;
+ else
+ tickdelta = tickadj;
+ if (ndelta % tickdelta)
+ ndelta = ndelta / tickadj * tickadj;
+
+ s = splclock();
+ if (uap->olddelta) {
+ oatv.tv_sec = timedelta / 1000000;
+ oatv.tv_usec = timedelta % 1000000;
+ }
+ timedelta = ndelta;
+ splx(s);
+
+ if (uap->olddelta)
+ (void) copyout((caddr_t)&oatv, (caddr_t)uap->olddelta,
+ sizeof (struct timeval));