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