xref: /csrg-svn/sys/kern/kern_time.c (revision 8034)
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