freebsd_sched.c revision 1.4 1 /* $NetBSD: freebsd_sched.c,v 1.4 2006/07/23 22:06:08 ad Exp $ */
2
3 /*-
4 * Copyright (c) 1999 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
9 * NASA Ames Research Center; by Matthias Scheler.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the distribution.
19 * 3. All advertising materials mentioning features or use of this software
20 * must display the following acknowledgement:
21 * This product includes software developed by the NetBSD
22 * Foundation, Inc. and its contributors.
23 * 4. Neither the name of The NetBSD Foundation nor the names of its
24 * contributors may be used to endorse or promote products derived
25 * from this software without specific prior written permission.
26 *
27 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
28 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
29 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
30 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
31 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
34 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
35 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37 * POSSIBILITY OF SUCH DAMAGE.
38 */
39
40 /*
41 * FreeBSD compatibility module. Try to deal with scheduler related syscalls.
42 */
43
44 #include <sys/cdefs.h>
45 __KERNEL_RCSID(0, "$NetBSD: freebsd_sched.c,v 1.4 2006/07/23 22:06:08 ad Exp $");
46
47 #include <sys/param.h>
48 #include <sys/mount.h>
49 #include <sys/proc.h>
50 #include <sys/systm.h>
51 #include <sys/syscallargs.h>
52 #include <sys/kauth.h>
53
54 #include <machine/cpu.h>
55
56 #include <compat/freebsd/freebsd_syscallargs.h>
57 #include <compat/freebsd/freebsd_sched.h>
58
59 int
60 freebsd_sys_yield(l, v, retval)
61 struct lwp *l;
62 void *v;
63 register_t *retval;
64 {
65
66 yield();
67 return 0;
68 }
69
70 int
71 freebsd_sys_sched_setparam(l, v, retval)
72 struct lwp *l;
73 void *v;
74 register_t *retval;
75 {
76 struct freebsd_sys_sched_setparam_args /* {
77 syscallarg(pid_t) pid;
78 syscallarg(const struct freebsd_sched_param *) sp;
79 } */ *uap = v;
80 int error;
81 struct freebsd_sched_param lp;
82 struct proc *p;
83
84 /*
85 * We only check for valid parameters and return afterwards.
86 */
87 if (SCARG(uap, pid) < 0 || SCARG(uap, sp) == NULL)
88 return EINVAL;
89
90 error = copyin(SCARG(uap, sp), &lp, sizeof(lp));
91 if (error)
92 return error;
93
94 if (SCARG(uap, pid) != 0) {
95 kauth_cred_t pc = l->l_cred;
96
97 if ((p = pfind(SCARG(uap, pid))) == NULL)
98 return ESRCH;
99 if (!(l->l_proc == p ||
100 kauth_cred_geteuid(pc) == 0 ||
101 kauth_cred_getuid(pc) == kauth_cred_getuid(p->p_cred) ||
102 kauth_cred_geteuid(pc) == kauth_cred_getuid(p->p_cred) ||
103 kauth_cred_getuid(pc) == kauth_cred_geteuid(p->p_cred) ||
104 kauth_cred_geteuid(pc) == kauth_cred_geteuid(p->p_cred)))
105 return EPERM;
106 }
107
108 return 0;
109 }
110
111 int
112 freebsd_sys_sched_getparam(l, v, retval)
113 struct lwp *l;
114 void *v;
115 register_t *retval;
116 {
117 struct freebsd_sys_sched_getparam_args /* {
118 syscallarg(pid_t) pid;
119 syscallarg(struct freebsd_sched_param *) sp;
120 } */ *uap = v;
121 struct proc *p;
122 struct freebsd_sched_param lp;
123
124 /*
125 * We only check for valid parameters and return a dummy
126 * priority afterwards.
127 */
128 if (SCARG(uap, pid) < 0 || SCARG(uap, sp) == NULL)
129 return EINVAL;
130
131 if (SCARG(uap, pid) != 0) {
132 kauth_cred_t pc = l->l_cred;
133
134 if ((p = pfind(SCARG(uap, pid))) == NULL)
135 return ESRCH;
136 if (!(l->l_proc == p ||
137 kauth_cred_geteuid(pc) == 0 ||
138 kauth_cred_getuid(pc) == kauth_cred_getuid(p->p_cred) ||
139 kauth_cred_geteuid(pc) == kauth_cred_getuid(p->p_cred) ||
140 kauth_cred_getuid(pc) == kauth_cred_geteuid(p->p_cred) ||
141 kauth_cred_geteuid(pc) == kauth_cred_geteuid(p->p_cred)))
142 return EPERM;
143 }
144
145 lp.sched_priority = 0;
146 return copyout(&lp, SCARG(uap, sp), sizeof(lp));
147 }
148
149 int
150 freebsd_sys_sched_setscheduler(l, v, retval)
151 struct lwp *l;
152 void *v;
153 register_t *retval;
154 {
155 struct freebsd_sys_sched_setscheduler_args /* {
156 syscallarg(pid_t) pid;
157 syscallarg(int) policy;
158 syscallarg(cont struct freebsd_sched_scheduler *) sp;
159 } */ *uap = v;
160 int error;
161 struct freebsd_sched_param lp;
162 struct proc *p;
163
164 /*
165 * We only check for valid parameters and return afterwards.
166 */
167 if (SCARG(uap, pid) < 0 || SCARG(uap, sp) == NULL)
168 return EINVAL;
169
170 error = copyin(SCARG(uap, sp), &lp, sizeof(lp));
171 if (error)
172 return error;
173
174 if (SCARG(uap, pid) != 0) {
175 kauth_cred_t pc = l->l_cred;
176
177 if ((p = pfind(SCARG(uap, pid))) == NULL)
178 return ESRCH;
179 if (!(l->l_proc == p ||
180 kauth_cred_geteuid(pc) == 0 ||
181 kauth_cred_getuid(pc) == kauth_cred_getuid(p->p_cred) ||
182 kauth_cred_geteuid(pc) == kauth_cred_getuid(p->p_cred) ||
183 kauth_cred_getuid(pc) == kauth_cred_geteuid(p->p_cred) ||
184 kauth_cred_geteuid(pc) == kauth_cred_geteuid(p->p_cred)))
185 return EPERM;
186 }
187
188 /*
189 * We can't emulate anything put the default scheduling policy.
190 */
191 if (SCARG(uap, policy) != FREEBSD_SCHED_OTHER || lp.sched_priority != 0)
192 return EINVAL;
193
194 return 0;
195 }
196
197 int
198 freebsd_sys_sched_getscheduler(l, v, retval)
199 struct lwp *l;
200 void *v;
201 register_t *retval;
202 {
203 struct freebsd_sys_sched_getscheduler_args /* {
204 syscallarg(pid_t) pid;
205 } */ *uap = v;
206 struct proc *p;
207
208 *retval = -1;
209
210 /*
211 * We only check for valid parameters and return afterwards.
212 */
213 if (SCARG(uap, pid) != 0) {
214 kauth_cred_t pc = l->l_cred;
215
216 if ((p = pfind(SCARG(uap, pid))) == NULL)
217 return ESRCH;
218 if (!(l->l_proc == p ||
219 kauth_cred_geteuid(pc) == 0 ||
220 kauth_cred_getuid(pc) == kauth_cred_getuid(p->p_cred) ||
221 kauth_cred_geteuid(pc) == kauth_cred_getuid(p->p_cred) ||
222 kauth_cred_getuid(pc) == kauth_cred_geteuid(p->p_cred) ||
223 kauth_cred_geteuid(pc) == kauth_cred_geteuid(p->p_cred)))
224 return EPERM;
225 }
226
227 /*
228 * We can't emulate anything put the default scheduling policy.
229 */
230 *retval = FREEBSD_SCHED_OTHER;
231 return 0;
232 }
233
234 int
235 freebsd_sys_sched_yield(l, v, retval)
236 struct lwp *l;
237 void *v;
238 register_t *retval;
239 {
240
241 yield();
242 return 0;
243 }
244
245 int
246 freebsd_sys_sched_get_priority_max(l, v, retval)
247 struct lwp *l;
248 void *v;
249 register_t *retval;
250 {
251 struct freebsd_sys_sched_get_priority_max_args /* {
252 syscallarg(int) policy;
253 } */ *uap = v;
254
255 /*
256 * We can't emulate anything put the default scheduling policy.
257 */
258 if (SCARG(uap, policy) != FREEBSD_SCHED_OTHER) {
259 *retval = -1;
260 return EINVAL;
261 }
262
263 *retval = 0;
264 return 0;
265 }
266
267 int
268 freebsd_sys_sched_get_priority_min(l, v, retval)
269 struct lwp *l;
270 void *v;
271 register_t *retval;
272 {
273 struct freebsd_sys_sched_get_priority_min_args /* {
274 syscallarg(int) policy;
275 } */ *uap = v;
276
277 /*
278 * We can't emulate anything put the default scheduling policy.
279 */
280 if (SCARG(uap, policy) != FREEBSD_SCHED_OTHER) {
281 *retval = -1;
282 return EINVAL;
283 }
284
285 *retval = 0;
286 return 0;
287 }
288