1*8034Sroot /* kern_time.c 5.3 82/09/04 */ 27424Sroot 37424Sroot #include "../h/param.h" 4*8034Sroot #include "../h/dir.h" /* XXX */ 57424Sroot #include "../h/user.h" 6*8034Sroot #include "../h/kernel.h" 77424Sroot #include "../h/reg.h" 87424Sroot #include "../h/inode.h" 97424Sroot #include "../h/proc.h" 107424Sroot 11*8034Sroot gettimeofday() 127424Sroot { 13*8034Sroot register struct a { 14*8034Sroot struct timeval *tp; 15*8034Sroot struct timezone *tzp; 16*8034Sroot } *uap = (struct a *)u.u_ap; 17*8034Sroot struct timeval atv; 187500Sroot 19*8034Sroot microtime(&atv); 20*8034Sroot if (copyout((caddr_t)&atv, (caddr_t)uap->tp, sizeof (atv))) { 21*8034Sroot u.u_error = EFAULT; 22*8034Sroot return; 23*8034Sroot } 24*8034Sroot if (uap->tzp == 0) 25*8034Sroot return; 26*8034Sroot if (copyout((caddr_t)&tz, uap->tzp, sizeof (tz))) { 27*8034Sroot u.u_error = EFAULT; 28*8034Sroot return; 29*8034Sroot } 307500Sroot } 317500Sroot 32*8034Sroot settimeofday() 337500Sroot { 34*8034Sroot register struct a { 35*8034Sroot struct timeval *tv; 36*8034Sroot struct timezone *tzp; 37*8034Sroot } *uap = (struct a *)u.u_ap; 38*8034Sroot struct timeval atv; 39*8034Sroot struct timezone atz; 407500Sroot 41*8034Sroot if (copyin((caddr_t)uap->tv, (caddr_t)&atv, sizeof (struct timeval))) { 42*8034Sroot u.u_error = EFAULT; 43*8034Sroot return; 44*8034Sroot } 45*8034Sroot if (suser()) { 46*8034Sroot struct timeval tdelta; 47*8034Sroot 48*8034Sroot tdelta = atv; 49*8034Sroot 50*8034Sroot timevalsub(&tdelta, &time); 51*8034Sroot timevaladd(&boottime, &tdelta); 52*8034Sroot time = atv; 53*8034Sroot clockset(); 54*8034Sroot } 55*8034Sroot if (uap->tzp) { 56*8034Sroot if (copyin((caddr_t)uap->tzp, (caddr_t)&atz, sizeof (atz))) { 57*8034Sroot u.u_error = EFAULT; 58*8034Sroot return; 59*8034Sroot } 60*8034Sroot /* XXX */ 61*8034Sroot } 627500Sroot } 637500Sroot 64*8034Sroot timevaladd(t1, t2) 65*8034Sroot struct timeval *t1, *t2; 667500Sroot { 677500Sroot 68*8034Sroot t1->tv_sec += t2->tv_sec; 69*8034Sroot t1->tv_usec += t2->tv_sec; 70*8034Sroot timevalfix(t1); 717500Sroot } 727500Sroot 73*8034Sroot timevalsub(t1, t2) 74*8034Sroot struct timeval *t1, *t2; 757500Sroot { 767500Sroot 77*8034Sroot t1->tv_sec -= t2->tv_sec; 78*8034Sroot t1->tv_usec -= t2->tv_sec; 79*8034Sroot timevalfix(t1); 807424Sroot } 817424Sroot 82*8034Sroot timevalfix(t1) 83*8034Sroot struct timeval *t1; 847424Sroot { 85*8034Sroot 86*8034Sroot if (t1->tv_usec < 0) { 87*8034Sroot t1->tv_sec--; 88*8034Sroot t1->tv_usec += 1000000; 89*8034Sroot } 90*8034Sroot if (t1->tv_usec >= 1000000) { 91*8034Sroot t1->tv_sec++; 92*8034Sroot t1->tv_usec -= 1000000; 93*8034Sroot } 94*8034Sroot } 95*8034Sroot 96*8034Sroot getitimer() 97*8034Sroot { 987424Sroot register struct a { 99*8034Sroot u_int which; 100*8034Sroot struct itimerval *itv; 101*8034Sroot } *uap = (struct a *)u.u_ap; 102*8034Sroot register struct itimerval *itp; 103*8034Sroot int s; 1047424Sroot 105*8034Sroot if (uap->which > 2) { 106*8034Sroot u.u_error = EINVAL; 107*8034Sroot return; 1087424Sroot } 109*8034Sroot if (uap->which == ITIMER_REAL) 110*8034Sroot itp = &u.u_procp->p_realtimer; 111*8034Sroot else 112*8034Sroot itp = &u.u_timer[uap->which]; 113*8034Sroot s = spl7(); 114*8034Sroot if (copyout((caddr_t)itp, uap->itv, sizeof (struct itimerval))) { 1157424Sroot u.u_error = EFAULT; 116*8034Sroot goto bad; 117*8034Sroot } 118*8034Sroot bad: 119*8034Sroot splx(s); 1207424Sroot } 1217424Sroot 122*8034Sroot setitimer() 1237424Sroot { 1247424Sroot register struct a { 125*8034Sroot u_int which; 126*8034Sroot struct itimerval *itv; 127*8034Sroot } *uap = (struct a *)u.u_ap; 128*8034Sroot struct itimerval aitv; 129*8034Sroot int s; 1307424Sroot 131*8034Sroot s = spl7(); 132*8034Sroot if (uap->which > 2) { 133*8034Sroot u.u_error = EINVAL; 134*8034Sroot goto bad; 1357424Sroot } 136*8034Sroot if (copyin((caddr_t)uap->itv, (caddr_t)&aitv, 137*8034Sroot sizeof (struct itimerval))) { 138*8034Sroot u.u_error = EFAULT; 139*8034Sroot goto bad; 140*8034Sroot } 141*8034Sroot u.u_timer[uap->which] = aitv; 142*8034Sroot if (uap->which == ITIMER_REAL) 143*8034Sroot u.u_procp->p_realtimer = aitv; 144*8034Sroot bad: 145*8034Sroot splx(s); 146*8034Sroot return; 1477424Sroot } 1487424Sroot 149*8034Sroot getandsetitimer() 1507424Sroot { 151*8034Sroot int s = spl7(); 152*8034Sroot 153*8034Sroot getitimer(); 154*8034Sroot if (u.u_error == 0) { 155*8034Sroot u.u_ap[1] = u.u_ap[2]; 156*8034Sroot setitimer(); 157*8034Sroot } 158*8034Sroot splx(s); 159*8034Sroot } 160*8034Sroot 161*8034Sroot itimerdecr(itp, usec) 162*8034Sroot register struct itimerval *itp; 163*8034Sroot int usec; 164*8034Sroot { 165*8034Sroot 166*8034Sroot while (itp->itimer_value.tv_usec < usec) { 167*8034Sroot if (itp->itimer_value.tv_sec == 0) 168*8034Sroot goto expire; 169*8034Sroot itp->itimer_value.tv_usec += 1000000; 170*8034Sroot itp->itimer_value.tv_sec--; 171*8034Sroot } 172*8034Sroot itp->itimer_value.tv_usec -= usec; 173*8034Sroot if (timerisset(&itp->itimer_value)) 174*8034Sroot return (1); 175*8034Sroot expire: 176*8034Sroot if (itp->itimer_reload == 0) 177*8034Sroot itp->itimer_value.tv_usec = 0; 178*8034Sroot else 179*8034Sroot itp->itimer_value = itp->itimer_interval; 180*8034Sroot return (0); 181*8034Sroot } 182*8034Sroot 183*8034Sroot #ifndef NOCOMPAT 184*8034Sroot otime() 185*8034Sroot { 186*8034Sroot 187*8034Sroot u.u_r.r_time = time.tv_sec; 188*8034Sroot } 189*8034Sroot 190*8034Sroot #include "../h/timeb.h" 191*8034Sroot 192*8034Sroot oftime() 193*8034Sroot { 1947424Sroot register struct a { 195*8034Sroot struct timeb *tp; 1967424Sroot } *uap; 197*8034Sroot struct timeb t; 1987424Sroot 1997424Sroot uap = (struct a *)u.u_ap; 200*8034Sroot (void) spl7(); 201*8034Sroot t.time = time.tv_sec; 202*8034Sroot t.millitm = time.tv_usec / 1000; 203*8034Sroot (void) spl0(); 204*8034Sroot t.timezone = tz.tz_minuteswest; 205*8034Sroot t.dstflag = tz.tz_dsttime; 206*8034Sroot if (copyout((caddr_t)&t, (caddr_t)uap->tp, sizeof(t)) < 0) 2077424Sroot u.u_error = EFAULT; 2087424Sroot } 209