netbsd32_ipc.c revision 1.12 1 1.12 dsl /* $NetBSD: netbsd32_ipc.c,v 1.12 2007/06/03 10:55:10 dsl Exp $ */
2 1.1 mrg
3 1.1 mrg /*
4 1.1 mrg * Copyright (c) 1998, 2001 Matthew R. Green
5 1.1 mrg * All rights reserved.
6 1.1 mrg *
7 1.1 mrg * Redistribution and use in source and binary forms, with or without
8 1.1 mrg * modification, are permitted provided that the following conditions
9 1.1 mrg * are met:
10 1.1 mrg * 1. Redistributions of source code must retain the above copyright
11 1.1 mrg * notice, this list of conditions and the following disclaimer.
12 1.1 mrg * 2. Redistributions in binary form must reproduce the above copyright
13 1.1 mrg * notice, this list of conditions and the following disclaimer in the
14 1.1 mrg * documentation and/or other materials provided with the distribution.
15 1.1 mrg * 3. The name of the author may not be used to endorse or promote products
16 1.1 mrg * derived from this software without specific prior written permission.
17 1.1 mrg *
18 1.1 mrg * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 1.1 mrg * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 1.1 mrg * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 1.1 mrg * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 1.1 mrg * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
23 1.1 mrg * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24 1.1 mrg * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
25 1.1 mrg * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26 1.1 mrg * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27 1.1 mrg * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 1.1 mrg * SUCH DAMAGE.
29 1.1 mrg */
30 1.3 lukem
31 1.3 lukem #include <sys/cdefs.h>
32 1.12 dsl __KERNEL_RCSID(0, "$NetBSD: netbsd32_ipc.c,v 1.12 2007/06/03 10:55:10 dsl Exp $");
33 1.1 mrg
34 1.2 mrg #if defined(_KERNEL_OPT)
35 1.1 mrg #include "opt_sysv.h"
36 1.1 mrg #endif
37 1.1 mrg
38 1.1 mrg #include <sys/param.h>
39 1.1 mrg #include <sys/systm.h>
40 1.1 mrg #include <sys/ipc.h>
41 1.1 mrg #include <sys/msg.h>
42 1.1 mrg #include <sys/sem.h>
43 1.1 mrg #include <sys/shm.h>
44 1.1 mrg #include <sys/mount.h>
45 1.6 christos #include <sys/dirent.h>
46 1.1 mrg
47 1.1 mrg #include <sys/syscallargs.h>
48 1.1 mrg #include <sys/proc.h>
49 1.1 mrg
50 1.1 mrg #include <compat/netbsd32/netbsd32.h>
51 1.1 mrg #include <compat/netbsd32/netbsd32_syscallargs.h>
52 1.1 mrg #include <compat/netbsd32/netbsd32_conv.h>
53 1.1 mrg
54 1.1 mrg #if defined(SYSVSEM)
55 1.12 dsl
56 1.1 mrg int
57 1.5 thorpej netbsd32___semctl14(l, v, retval)
58 1.5 thorpej struct lwp *l;
59 1.1 mrg void *v;
60 1.1 mrg register_t *retval;
61 1.1 mrg {
62 1.12 dsl return do_netbsd32___semctl14(l, v, retval, NULL);
63 1.12 dsl }
64 1.12 dsl
65 1.12 dsl int
66 1.12 dsl do_netbsd32___semctl14(struct lwp *l, void *v, register_t *retval, void *vkarg)
67 1.12 dsl {
68 1.8 cube struct netbsd32___semctl14_args /* {
69 1.1 mrg syscallarg(int) semid;
70 1.1 mrg syscallarg(int) semnum;
71 1.1 mrg syscallarg(int) cmd;
72 1.8 cube syscallarg(netbsd32_semunp_t) arg;
73 1.1 mrg } */ *uap = v;
74 1.8 cube struct semid_ds sembuf;
75 1.8 cube struct netbsd32_semid_ds sembuf32;
76 1.8 cube int cmd, error;
77 1.8 cube void *pass_arg;
78 1.8 cube union __semun karg;
79 1.8 cube union netbsd32_semun karg32;
80 1.1 mrg
81 1.8 cube cmd = SCARG(uap, cmd);
82 1.1 mrg
83 1.1 mrg switch (cmd) {
84 1.1 mrg case IPC_SET:
85 1.1 mrg case IPC_STAT:
86 1.8 cube pass_arg = &sembuf;
87 1.1 mrg break;
88 1.1 mrg
89 1.8 cube case GETALL:
90 1.8 cube case SETVAL:
91 1.8 cube case SETALL:
92 1.8 cube pass_arg = &karg;
93 1.1 mrg break;
94 1.8 cube default:
95 1.8 cube pass_arg = NULL;
96 1.1 mrg break;
97 1.8 cube }
98 1.1 mrg
99 1.8 cube if (pass_arg) {
100 1.12 dsl if (vkarg != NULL)
101 1.12 dsl karg32 = *(union netbsd32_semun *)vkarg;
102 1.12 dsl else {
103 1.12 dsl error = copyin(SCARG_P32(uap, arg), &karg32,
104 1.12 dsl sizeof(karg32));
105 1.12 dsl if (error)
106 1.12 dsl return error;
107 1.12 dsl }
108 1.8 cube if (pass_arg == &karg) {
109 1.8 cube switch (cmd) {
110 1.8 cube case GETALL:
111 1.8 cube case SETALL:
112 1.8 cube karg.array = NETBSD32PTR64(karg32.array);
113 1.8 cube break;
114 1.8 cube case SETVAL:
115 1.8 cube karg.val = karg32.val;
116 1.1 mrg break;
117 1.8 cube }
118 1.8 cube }
119 1.8 cube if (cmd == IPC_SET) {
120 1.8 cube error = copyin(NETBSD32PTR64(karg32.buf), &sembuf32,
121 1.8 cube sizeof(sembuf32));
122 1.8 cube if (error)
123 1.8 cube return (error);
124 1.8 cube netbsd32_to_semid_ds(&sembuf32, &sembuf);
125 1.1 mrg }
126 1.8 cube }
127 1.1 mrg
128 1.9 ad error = semctl1(l, SCARG(uap, semid), SCARG(uap, semnum), cmd,
129 1.8 cube pass_arg, retval);
130 1.1 mrg
131 1.8 cube if (error == 0 && cmd == IPC_STAT) {
132 1.8 cube netbsd32_from_semid_ds(&sembuf, &sembuf32);
133 1.8 cube error = copyout(&sembuf32, NETBSD32PTR64(karg32.buf),
134 1.8 cube sizeof(sembuf32));
135 1.1 mrg }
136 1.1 mrg
137 1.8 cube return (error);
138 1.1 mrg }
139 1.1 mrg
140 1.1 mrg int
141 1.5 thorpej netbsd32_semget(l, v, retval)
142 1.5 thorpej struct lwp *l;
143 1.1 mrg void *v;
144 1.1 mrg register_t *retval;
145 1.1 mrg {
146 1.1 mrg struct netbsd32_semget_args /* {
147 1.1 mrg syscallarg(netbsd32_key_t) key;
148 1.1 mrg syscallarg(int) nsems;
149 1.1 mrg syscallarg(int) semflg;
150 1.1 mrg } */ *uap = v;
151 1.1 mrg struct sys_semget_args ua;
152 1.1 mrg
153 1.1 mrg NETBSD32TOX_UAP(key, key_t);
154 1.1 mrg NETBSD32TO64_UAP(nsems);
155 1.1 mrg NETBSD32TO64_UAP(semflg);
156 1.5 thorpej return (sys_semget(l, &ua, retval));
157 1.1 mrg }
158 1.1 mrg
159 1.1 mrg int
160 1.5 thorpej netbsd32_semop(l, v, retval)
161 1.5 thorpej struct lwp *l;
162 1.1 mrg void *v;
163 1.1 mrg register_t *retval;
164 1.1 mrg {
165 1.1 mrg struct netbsd32_semop_args /* {
166 1.1 mrg syscallarg(int) semid;
167 1.1 mrg syscallarg(netbsd32_sembufp_t) sops;
168 1.1 mrg syscallarg(netbsd32_size_t) nsops;
169 1.1 mrg } */ *uap = v;
170 1.1 mrg struct sys_semop_args ua;
171 1.1 mrg
172 1.1 mrg NETBSD32TO64_UAP(semid);
173 1.1 mrg NETBSD32TOP_UAP(sops, struct sembuf);
174 1.1 mrg NETBSD32TOX_UAP(nsops, size_t);
175 1.5 thorpej return (sys_semop(l, &ua, retval));
176 1.1 mrg }
177 1.1 mrg
178 1.1 mrg int
179 1.5 thorpej netbsd32_semconfig(l, v, retval)
180 1.5 thorpej struct lwp *l;
181 1.1 mrg void *v;
182 1.1 mrg register_t *retval;
183 1.1 mrg {
184 1.1 mrg struct netbsd32_semconfig_args /* {
185 1.1 mrg syscallarg(int) flag;
186 1.1 mrg } */ *uap = v;
187 1.1 mrg struct sys_semconfig_args ua;
188 1.1 mrg
189 1.1 mrg NETBSD32TO64_UAP(flag);
190 1.5 thorpej return (sys_semconfig(l, &ua, retval));
191 1.1 mrg }
192 1.1 mrg #endif /* SYSVSEM */
193 1.1 mrg
194 1.1 mrg #if defined(SYSVMSG)
195 1.1 mrg
196 1.1 mrg int
197 1.5 thorpej netbsd32___msgctl13(l, v, retval)
198 1.5 thorpej struct lwp *l;
199 1.1 mrg void *v;
200 1.1 mrg register_t *retval;
201 1.1 mrg {
202 1.8 cube struct netbsd32___msgctl13_args /* {
203 1.1 mrg syscallarg(int) msqid;
204 1.1 mrg syscallarg(int) cmd;
205 1.1 mrg syscallarg(netbsd32_msqid_dsp_t) buf;
206 1.1 mrg } */ *uap = v;
207 1.1 mrg struct msqid_ds ds;
208 1.8 cube struct netbsd32_msqid_ds ds32;
209 1.8 cube int error, cmd;
210 1.8 cube
211 1.8 cube cmd = SCARG(uap, cmd);
212 1.8 cube if (cmd == IPC_SET) {
213 1.11 dsl error = copyin(SCARG_P32(uap, buf), &ds32, sizeof(ds32));
214 1.8 cube if (error)
215 1.8 cube return error;
216 1.8 cube netbsd32_to_msqid_ds(&ds32, &ds);
217 1.8 cube }
218 1.8 cube
219 1.9 ad error = msgctl1(l, SCARG(uap, msqid), cmd,
220 1.8 cube (cmd == IPC_SET || cmd == IPC_STAT) ? &ds : NULL);
221 1.8 cube
222 1.8 cube if (error == 0 && cmd == IPC_STAT) {
223 1.8 cube netbsd32_from_msqid_ds(&ds, &ds32);
224 1.11 dsl error = copyout(&ds32, SCARG_P32(uap, buf), sizeof(ds32));
225 1.8 cube }
226 1.1 mrg
227 1.8 cube return error;
228 1.1 mrg }
229 1.1 mrg
230 1.1 mrg int
231 1.5 thorpej netbsd32_msgget(l, v, retval)
232 1.5 thorpej struct lwp *l;
233 1.1 mrg void *v;
234 1.1 mrg register_t *retval;
235 1.1 mrg {
236 1.1 mrg struct netbsd32_msgget_args /* {
237 1.1 mrg syscallarg(netbsd32_key_t) key;
238 1.1 mrg syscallarg(int) msgflg;
239 1.1 mrg } */ *uap = v;
240 1.1 mrg struct sys_msgget_args ua;
241 1.1 mrg
242 1.1 mrg NETBSD32TOX_UAP(key, key_t);
243 1.1 mrg NETBSD32TO64_UAP(msgflg);
244 1.8 cube return sys_msgget(l, &ua, retval);
245 1.8 cube }
246 1.8 cube
247 1.8 cube static int
248 1.8 cube netbsd32_msgsnd_fetch_type(const void *src, void *dst, size_t size)
249 1.8 cube {
250 1.8 cube netbsd32_long l32;
251 1.8 cube long *l = dst;
252 1.8 cube int error;
253 1.8 cube
254 1.8 cube KASSERT(size == sizeof(netbsd32_long));
255 1.8 cube
256 1.8 cube error = copyin(src, &l32, sizeof(l32));
257 1.8 cube if (!error)
258 1.8 cube *l = l32;
259 1.8 cube return error;
260 1.1 mrg }
261 1.1 mrg
262 1.1 mrg int
263 1.5 thorpej netbsd32_msgsnd(l, v, retval)
264 1.5 thorpej struct lwp *l;
265 1.1 mrg void *v;
266 1.1 mrg register_t *retval;
267 1.1 mrg {
268 1.1 mrg struct netbsd32_msgsnd_args /* {
269 1.1 mrg syscallarg(int) msqid;
270 1.1 mrg syscallarg(const netbsd32_voidp) msgp;
271 1.1 mrg syscallarg(netbsd32_size_t) msgsz;
272 1.1 mrg syscallarg(int) msgflg;
273 1.1 mrg } */ *uap = v;
274 1.1 mrg
275 1.9 ad return msgsnd1(l, SCARG(uap, msqid),
276 1.11 dsl SCARG_P32(uap, msgp), SCARG(uap, msgsz),
277 1.8 cube SCARG(uap, msgflg), sizeof(netbsd32_long),
278 1.8 cube netbsd32_msgsnd_fetch_type);
279 1.8 cube }
280 1.8 cube
281 1.8 cube static int
282 1.8 cube netbsd32_msgrcv_put_type(const void *src, void *dst, size_t size)
283 1.8 cube {
284 1.8 cube netbsd32_long l32;
285 1.8 cube const long *l = src;
286 1.8 cube
287 1.8 cube KASSERT(size == sizeof(netbsd32_long));
288 1.8 cube
289 1.8 cube l32 = (netbsd32_long)(*l);
290 1.8 cube return copyout(&l32, dst, sizeof(l32));
291 1.1 mrg }
292 1.1 mrg
293 1.1 mrg int
294 1.5 thorpej netbsd32_msgrcv(l, v, retval)
295 1.5 thorpej struct lwp *l;
296 1.1 mrg void *v;
297 1.1 mrg register_t *retval;
298 1.1 mrg {
299 1.1 mrg struct netbsd32_msgrcv_args /* {
300 1.1 mrg syscallarg(int) msqid;
301 1.1 mrg syscallarg(netbsd32_voidp) msgp;
302 1.1 mrg syscallarg(netbsd32_size_t) msgsz;
303 1.1 mrg syscallarg(netbsd32_long) msgtyp;
304 1.1 mrg syscallarg(int) msgflg;
305 1.1 mrg } */ *uap = v;
306 1.1 mrg
307 1.9 ad return msgrcv1(l, SCARG(uap, msqid),
308 1.11 dsl SCARG_P32(uap, msgp), SCARG(uap, msgsz),
309 1.8 cube SCARG(uap, msgtyp), SCARG(uap, msgflg), sizeof(netbsd32_long),
310 1.8 cube netbsd32_msgrcv_put_type, retval);
311 1.1 mrg }
312 1.1 mrg #endif /* SYSVMSG */
313 1.1 mrg
314 1.1 mrg #if defined(SYSVSHM)
315 1.1 mrg
316 1.1 mrg int
317 1.5 thorpej netbsd32_shmat(l, v, retval)
318 1.5 thorpej struct lwp *l;
319 1.1 mrg void *v;
320 1.1 mrg register_t *retval;
321 1.1 mrg {
322 1.1 mrg struct netbsd32_shmat_args /* {
323 1.1 mrg syscallarg(int) shmid;
324 1.1 mrg syscallarg(const netbsd32_voidp) shmaddr;
325 1.1 mrg syscallarg(int) shmflg;
326 1.1 mrg } */ *uap = v;
327 1.1 mrg struct sys_shmat_args ua;
328 1.1 mrg
329 1.1 mrg NETBSD32TO64_UAP(shmid);
330 1.1 mrg NETBSD32TOP_UAP(shmaddr, void);
331 1.1 mrg NETBSD32TO64_UAP(shmflg);
332 1.8 cube return sys_shmat(l, &ua, retval);
333 1.1 mrg }
334 1.1 mrg
335 1.1 mrg int
336 1.5 thorpej netbsd32___shmctl13(l, v, retval)
337 1.5 thorpej struct lwp *l;
338 1.1 mrg void *v;
339 1.1 mrg register_t *retval;
340 1.1 mrg {
341 1.8 cube struct netbsd32___shmctl13_args /* {
342 1.1 mrg syscallarg(int) shmid;
343 1.1 mrg syscallarg(int) cmd;
344 1.1 mrg syscallarg(netbsd32_shmid_dsp_t) buf;
345 1.1 mrg } */ *uap = v;
346 1.1 mrg struct shmid_ds ds;
347 1.8 cube struct netbsd32_shmid_ds ds32;
348 1.8 cube int error, cmd;
349 1.8 cube
350 1.8 cube cmd = SCARG(uap, cmd);
351 1.8 cube if (cmd == IPC_SET) {
352 1.11 dsl error = copyin(SCARG_P32(uap, buf), &ds32, sizeof(ds32));
353 1.8 cube if (error)
354 1.8 cube return error;
355 1.8 cube netbsd32_to_shmid_ds(&ds32, &ds);
356 1.8 cube }
357 1.8 cube
358 1.9 ad error = shmctl1(l, SCARG(uap, shmid), cmd,
359 1.8 cube (cmd == IPC_SET || cmd == IPC_STAT) ? &ds : NULL);
360 1.8 cube
361 1.8 cube if (error == 0 && cmd == IPC_STAT) {
362 1.8 cube netbsd32_from_shmid_ds(&ds, &ds32);
363 1.11 dsl error = copyout(&ds32, SCARG_P32(uap, buf), sizeof(ds32));
364 1.8 cube }
365 1.1 mrg
366 1.8 cube return error;
367 1.1 mrg }
368 1.1 mrg
369 1.1 mrg int
370 1.5 thorpej netbsd32_shmdt(l, v, retval)
371 1.5 thorpej struct lwp *l;
372 1.1 mrg void *v;
373 1.1 mrg register_t *retval;
374 1.1 mrg {
375 1.1 mrg struct netbsd32_shmdt_args /* {
376 1.1 mrg syscallarg(const netbsd32_voidp) shmaddr;
377 1.1 mrg } */ *uap = v;
378 1.1 mrg struct sys_shmdt_args ua;
379 1.1 mrg
380 1.1 mrg NETBSD32TOP_UAP(shmaddr, const char);
381 1.5 thorpej return (sys_shmdt(l, &ua, retval));
382 1.1 mrg }
383 1.1 mrg
384 1.1 mrg int
385 1.5 thorpej netbsd32_shmget(l, v, retval)
386 1.5 thorpej struct lwp *l;
387 1.1 mrg void *v;
388 1.1 mrg register_t *retval;
389 1.1 mrg {
390 1.1 mrg struct netbsd32_shmget_args /* {
391 1.1 mrg syscallarg(netbsd32_key_t) key;
392 1.1 mrg syscallarg(netbsd32_size_t) size;
393 1.1 mrg syscallarg(int) shmflg;
394 1.1 mrg } */ *uap = v;
395 1.1 mrg struct sys_shmget_args ua;
396 1.1 mrg
397 1.1 mrg NETBSD32TOX_UAP(key, key_t)
398 1.1 mrg NETBSD32TOX_UAP(size, size_t)
399 1.1 mrg NETBSD32TO64_UAP(shmflg);
400 1.5 thorpej return (sys_shmget(l, &ua, retval));
401 1.1 mrg }
402 1.1 mrg #endif /* SYSVSHM */
403