|
|
1.1 root 1: /*
2: * linux/kernel/itimer.c
3: *
4: * (C) 1992 Darren Senn
5: */
6:
7: /* These are all the functions necessary to implement itimers */
8:
9: #include <linux/sched.h>
10: #include <asm/segment.h>
11:
12: #include <signal.h>
13: #include <sys/time.h>
14: #include <errno.h>
15:
16: static unsigned long tvtojiffies(struct timeval *value)
17: {
18: return((unsigned long )value->tv_sec * HZ +
19: (unsigned long )(value->tv_usec + (1000000 / HZ - 1)) /
20: (1000000 / HZ));
21: }
22:
23: static void jiffiestotv(unsigned long jiffies, struct timeval *value)
24: {
25: value->tv_usec = (jiffies % HZ) * (1000000 / HZ);
26: value->tv_sec = jiffies / HZ;
27: return;
28: }
29:
30: int _getitimer(int which, struct itimerval *value)
31: {
32: register unsigned long val, interval;
33:
34: switch (which) {
35: case ITIMER_REAL:
36: val = current->it_real_value;
37: interval = current->it_real_incr;
38: break;
39: case ITIMER_VIRTUAL:
40: val = current->it_virt_value;
41: interval = current->it_virt_incr;
42: break;
43: case ITIMER_PROF:
44: val = current->it_prof_value;
45: interval = current->it_prof_incr;
46: break;
47: default:
48: return(-EINVAL);
49: }
50: jiffiestotv(val, &value->it_value);
51: jiffiestotv(interval, &value->it_interval);
52: return(0);
53: }
54:
55: int sys_getitimer(int which, struct itimerval *value)
56: {
57: struct itimerval get_buffer;
58: int k;
59:
60: if (!value)
61: return -EFAULT;
62: k = _getitimer(which, &get_buffer);
63: if (k < 0)
64: return k;
65: verify_area(value, sizeof(struct itimerval));
66: memcpy_tofs(value, &get_buffer, sizeof(get_buffer));
67: return 0;
68: }
69:
70: int _setitimer(int which, struct itimerval *value, struct itimerval *ovalue)
71: {
72: register unsigned long i, j;
73: int k;
74:
75: i = tvtojiffies(&value->it_interval);
76: j = tvtojiffies(&value->it_value);
77: if (ovalue && (k = _getitimer(which, ovalue)) < 0)
78: return k;
79: switch (which) {
80: case ITIMER_REAL:
81: current->it_real_value = j;
82: current->it_real_incr = i;
83: break;
84: case ITIMER_VIRTUAL:
85: current->it_virt_value = j;
86: current->it_virt_incr = i;
87: break;
88: case ITIMER_PROF:
89: current->it_prof_value = j;
90: current->it_prof_incr = i;
91: break;
92: default:
93: return -EINVAL;
94: }
95: return 0;
96: }
97:
98: int sys_setitimer(int which, struct itimerval *value, struct itimerval *ovalue)
99: {
100: struct itimerval set_buffer, get_buffer;
101: int k;
102:
103: if (!value)
104: memset((char *) &set_buffer, 0, sizeof(set_buffer));
105: else
106: memcpy_fromfs(&set_buffer, value, sizeof(set_buffer));
107: k = _setitimer(which, &set_buffer, ovalue ? &get_buffer : 0);
108: if (k < 0 || !ovalue)
109: return k;
110: verify_area(ovalue, sizeof(struct itimerval));
111: memcpy_tofs(ovalue, &get_buffer, sizeof(get_buffer));
112: return 0;
113: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.