1 | /* $NetBSD: linux32_sched.c,v 1.9 2010/07/07 01:30:35 chs Exp $ */ |
2 | |
3 | /*- |
4 | * Copyright (c) 2006 Emmanuel Dreyfus, all rights reserved. |
5 | * |
6 | * Redistribution and use in source and binary forms, with or without |
7 | * modification, are permitted provided that the following conditions |
8 | * are met: |
9 | * 1. Redistributions of source code must retain the above copyright |
10 | * notice, this list of conditions and the following disclaimer. |
11 | * 2. Redistributions in binary form must reproduce the above copyright |
12 | * notice, this list of conditions and the following disclaimer in the |
13 | * documentation and/or other materials provided with the distribution. |
14 | * 3. All advertising materials mentioning features or use of this software |
15 | * must display the following acknowledgement: |
16 | * This product includes software developed by Emmanuel Dreyfus |
17 | * 4. The name of the author may not be used to endorse or promote |
18 | * products derived from this software without specific prior written |
19 | * permission. |
20 | * |
21 | * THIS SOFTWARE IS PROVIDED BY THE THE AUTHOR AND CONTRIBUTORS ``AS IS'' |
22 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, |
23 | * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
24 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS |
25 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
26 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
27 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
28 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
29 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
30 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
31 | * POSSIBILITY OF SUCH DAMAGE. |
32 | */ |
33 | |
34 | #include <sys/cdefs.h> |
35 | |
36 | __KERNEL_RCSID(0, "$NetBSD: linux32_sched.c,v 1.9 2010/07/07 01:30:35 chs Exp $" ); |
37 | |
38 | #include <sys/types.h> |
39 | #include <sys/param.h> |
40 | #include <sys/fstypes.h> |
41 | #include <sys/signal.h> |
42 | #include <sys/dirent.h> |
43 | #include <sys/kernel.h> |
44 | #include <sys/fcntl.h> |
45 | #include <sys/select.h> |
46 | #include <sys/proc.h> |
47 | #include <sys/ucred.h> |
48 | #include <sys/swap.h> |
49 | |
50 | #include <machine/types.h> |
51 | |
52 | #include <sys/syscallargs.h> |
53 | |
54 | #include <compat/netbsd32/netbsd32.h> |
55 | #include <compat/netbsd32/netbsd32_conv.h> |
56 | #include <compat/netbsd32/netbsd32_syscallargs.h> |
57 | |
58 | #include <compat/linux/common/linux_types.h> |
59 | #include <compat/linux/common/linux_signal.h> |
60 | #include <compat/linux/common/linux_machdep.h> |
61 | #include <compat/linux/common/linux_misc.h> |
62 | #include <compat/linux/common/linux_sched.h> |
63 | #include <compat/linux/common/linux_ipc.h> |
64 | #include <compat/linux/common/linux_sem.h> |
65 | #include <compat/linux/linux_syscallargs.h> |
66 | |
67 | #include <compat/linux32/common/linux32_types.h> |
68 | #include <compat/linux32/common/linux32_signal.h> |
69 | #include <compat/linux32/common/linux32_machdep.h> |
70 | #include <compat/linux32/common/linux32_sysctl.h> |
71 | #include <compat/linux32/common/linux32_socketcall.h> |
72 | #include <compat/linux32/linux32_syscallargs.h> |
73 | |
74 | int |
75 | linux32_sys_clone(struct lwp *l, const struct linux32_sys_clone_args *uap, register_t *retval) |
76 | { |
77 | /* { |
78 | syscallarg(int) flags; |
79 | syscallarg(netbsd32_voidp) stack; |
80 | syscallarg(netbsd32_voidp) parent_tidptr; |
81 | syscallarg(netbsd32_voidp) tls; |
82 | syscallarg(netbsd32_voidp) child_tidptr; |
83 | } */ |
84 | struct linux_sys_clone_args ua; |
85 | |
86 | NETBSD32TO64_UAP(flags); |
87 | NETBSD32TOP_UAP(stack, void *); |
88 | NETBSD32TOP_UAP(parent_tidptr, void *); |
89 | NETBSD32TOP_UAP(tls, void *); |
90 | NETBSD32TOP_UAP(child_tidptr, void *); |
91 | return linux_sys_clone(l, &ua, retval); |
92 | } |
93 | |
94 | int |
95 | linux32_sys_sched_getscheduler(struct lwp *l, const struct linux32_sys_sched_getscheduler_args *uap, register_t *retval) |
96 | { |
97 | /* { |
98 | syscallarg(pid_t) pid; |
99 | } */ |
100 | struct linux_sys_sched_getscheduler_args ua; |
101 | |
102 | NETBSD32TO64_UAP(pid); |
103 | return linux_sys_sched_getscheduler(l, &ua, retval); |
104 | } |
105 | |
106 | int |
107 | linux32_sys_sched_setscheduler(struct lwp *l, const struct linux32_sys_sched_setscheduler_args *uap, register_t *retval) |
108 | { |
109 | /* { |
110 | syscallarg(int) pid; |
111 | syscallarg(int) policy; |
112 | syscallarg(const linux32_sched_paramp_t) sp; |
113 | } */ |
114 | struct linux_sys_sched_setscheduler_args ua; |
115 | |
116 | NETBSD32TO64_UAP(pid); |
117 | NETBSD32TO64_UAP(policy); |
118 | NETBSD32TOP_UAP(sp, const struct linux_sched_param); |
119 | return linux_sys_sched_setscheduler(l, &ua, retval); |
120 | } |
121 | |
122 | int |
123 | linux32_sys_sched_getparam(struct lwp *l, const struct linux32_sys_sched_getparam_args *uap, register_t *retval) |
124 | { |
125 | /* { |
126 | syscallarg(pid_t) pid; |
127 | syscallarg(linux32_sched_paramp_t) sp; |
128 | } */ |
129 | struct linux_sys_sched_getparam_args ua; |
130 | |
131 | NETBSD32TO64_UAP(pid); |
132 | NETBSD32TOP_UAP(sp, struct linux_sched_param); |
133 | return linux_sys_sched_getparam(l, &ua, retval); |
134 | } |
135 | |
136 | int |
137 | linux32_sys_sched_setparam(struct lwp *l, const struct linux32_sys_sched_setparam_args *uap, register_t *retval) |
138 | { |
139 | /* { |
140 | syscallarg(pid_t) pid; |
141 | syscallarg(const linux32_sched_paramp_t) sp; |
142 | } */ |
143 | struct linux_sys_sched_setparam_args ua; |
144 | |
145 | NETBSD32TO64_UAP(pid); |
146 | NETBSD32TOP_UAP(sp, const struct linux_sched_param); |
147 | return linux_sys_sched_setparam(l, &ua, retval); |
148 | } |
149 | |
150 | int |
151 | linux32_sys_exit_group(struct lwp *l, const struct linux32_sys_exit_group_args *uap, register_t *retval) |
152 | { |
153 | /* { |
154 | syscallarg(int) error_code; |
155 | } */ |
156 | struct linux_sys_exit_group_args ua; |
157 | |
158 | NETBSD32TO64_UAP(error_code); |
159 | return linux_sys_exit_group(l, &ua, retval); |
160 | } |
161 | |
162 | int |
163 | linux32_sys_exit(struct lwp *l, const struct linux32_sys_exit_args *uap, register_t *retval) |
164 | { |
165 | |
166 | /* { |
167 | syscallarg(int) rval; |
168 | } */ |
169 | struct linux_sys_exit_args ua; |
170 | |
171 | NETBSD32TO64_UAP(rval); |
172 | return linux_sys_exit(l, &ua, retval); |
173 | } |
174 | |
175 | int |
176 | linux32_sys_sched_get_priority_max(struct lwp *l, const struct linux32_sys_sched_get_priority_max_args *uap, register_t *retval) |
177 | { |
178 | /* { |
179 | syscallarg(int) policy; |
180 | } */ |
181 | |
182 | struct linux_sys_sched_get_priority_max_args ua; |
183 | |
184 | NETBSD32TO64_UAP(policy); |
185 | return linux_sys_sched_get_priority_max(l, &ua, retval); |
186 | } |
187 | |
188 | int |
189 | linux32_sys_sched_get_priority_min(struct lwp *l, const struct linux32_sys_sched_get_priority_min_args *uap, register_t *retval) |
190 | { |
191 | /* { |
192 | syscallarg(int) policy; |
193 | } */ |
194 | |
195 | struct linux_sys_sched_get_priority_min_args ua; |
196 | |
197 | NETBSD32TO64_UAP(policy); |
198 | return linux_sys_sched_get_priority_min(l, &ua, retval); |
199 | } |
200 | |
201 | |
202 | int |
203 | linux32_sys_set_tid_address(struct lwp *l, const struct linux32_sys_set_tid_address_args *uap, register_t *retval) |
204 | { |
205 | /* { |
206 | syscallarg(linux32_intp_t) tid; |
207 | } */ |
208 | struct linux_sys_set_tid_address_args ua; |
209 | |
210 | NETBSD32TOP_UAP(tid, int); |
211 | return linux_sys_set_tid_address(l, &ua, retval); |
212 | } |
213 | |
214 | int |
215 | linux32_sys_sched_getaffinity(struct lwp *l, const struct linux32_sys_sched_getaffinity_args *uap, register_t *retval) |
216 | { |
217 | /* { |
218 | syscallarg(linux_pid_t) pid; |
219 | syscallarg(unsigned int) len; |
220 | syscallarg(linux32_longp_t) mask; |
221 | } */ |
222 | struct linux_sys_sched_getaffinity_args ua; |
223 | |
224 | NETBSD32TO64_UAP(pid); |
225 | NETBSD32TO64_UAP(len); |
226 | NETBSD32TOP_UAP(mask, long); |
227 | return linux_sys_sched_getaffinity(l, &ua, retval); |
228 | } |
229 | |
230 | int |
231 | linux32_sys_sched_setaffinity(struct lwp *l, const struct linux32_sys_sched_setaffinity_args *uap, register_t *retval) |
232 | { |
233 | /* { |
234 | syscallarg(linux_pid_t) pid; |
235 | syscallarg(unsigned int) len; |
236 | syscallarg(linux32_longp_t) mask; |
237 | } */ |
238 | struct linux_sys_sched_setaffinity_args ua; |
239 | |
240 | NETBSD32TO64_UAP(pid); |
241 | NETBSD32TO64_UAP(len); |
242 | NETBSD32TOP_UAP(mask, long); |
243 | return linux_sys_sched_setaffinity(l, &ua, retval); |
244 | } |
245 | |
246 | int |
247 | linux32_sys_tkill(struct lwp *l, const struct linux32_sys_tkill_args *uap, register_t *retval) |
248 | { |
249 | /* { |
250 | syscallarg(int) tid; |
251 | syscallarg(int) sig; |
252 | } */ |
253 | struct linux_sys_tkill_args ua; |
254 | |
255 | NETBSD32TO64_UAP(tid); |
256 | NETBSD32TO64_UAP(sig); |
257 | return linux_sys_tkill(l, &ua, retval); |
258 | } |
259 | |
260 | int |
261 | linux32_sys_tgkill(struct lwp *l, const struct linux32_sys_tgkill_args *uap, register_t *retval) |
262 | { |
263 | /* { |
264 | syscallarg(int) tgid; |
265 | syscallarg(int) tid; |
266 | syscallarg(int) sig; |
267 | } */ |
268 | struct linux_sys_tgkill_args ua; |
269 | |
270 | NETBSD32TO64_UAP(tgid); |
271 | NETBSD32TO64_UAP(tid); |
272 | NETBSD32TO64_UAP(sig); |
273 | return linux_sys_tgkill(l, &ua, retval); |
274 | } |
275 | |