netbsd32_compat_43.c revision 1.23 1 1.23 scw /* $NetBSD: netbsd32_compat_43.c,v 1.23 2002/10/23 13:16:42 scw Exp $ */
2 1.1 mrg
3 1.1 mrg /*
4 1.19 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.7 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.7 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.20 lukem
31 1.20 lukem #include <sys/cdefs.h>
32 1.23 scw __KERNEL_RCSID(0, "$NetBSD: netbsd32_compat_43.c,v 1.23 2002/10/23 13:16:42 scw Exp $");
33 1.13 fvdl
34 1.17 mrg #if defined(_KERNEL_OPT)
35 1.13 fvdl #include "opt_compat_43.h"
36 1.13 fvdl #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/fcntl.h>
41 1.1 mrg #include <sys/malloc.h>
42 1.1 mrg #include <sys/mount.h>
43 1.1 mrg #include <sys/proc.h>
44 1.1 mrg #include <sys/stat.h>
45 1.1 mrg #include <sys/syscallargs.h>
46 1.1 mrg #include <sys/time.h>
47 1.1 mrg #include <sys/ucred.h>
48 1.10 mrg #include <uvm/uvm_extern.h>
49 1.1 mrg #include <sys/sysctl.h>
50 1.3 mrg #include <sys/swap.h>
51 1.1 mrg
52 1.5 mrg #include <compat/netbsd32/netbsd32.h>
53 1.5 mrg #include <compat/netbsd32/netbsd32_syscallargs.h>
54 1.1 mrg
55 1.9 eeh int compat_43_netbsd32_sethostid __P((struct proc *, void *, register_t *));
56 1.9 eeh int compat_43_netbsd32_killpg __P((struct proc *, void *, register_t *retval));
57 1.9 eeh int compat_43_netbsd32_sigblock __P((struct proc *, void *, register_t *retval));
58 1.9 eeh int compat_43_netbsd32_sigblock __P((struct proc *, void *, register_t *retval));
59 1.22 martin int compat_43_netbsd32_sigsetmask __P((struct proc *, void *, register_t *retval));
60 1.9 eeh
61 1.14 mrg void
62 1.5 mrg netbsd32_from_stat43(sp43, sp32)
63 1.1 mrg struct stat43 *sp43;
64 1.5 mrg struct netbsd32_stat43 *sp32;
65 1.1 mrg {
66 1.1 mrg
67 1.1 mrg sp32->st_dev = sp43->st_dev;
68 1.1 mrg sp32->st_ino = sp43->st_ino;
69 1.1 mrg sp32->st_mode = sp43->st_mode;
70 1.1 mrg sp32->st_nlink = sp43->st_nlink;
71 1.1 mrg sp32->st_uid = sp43->st_uid;
72 1.1 mrg sp32->st_gid = sp43->st_gid;
73 1.1 mrg sp32->st_rdev = sp43->st_rdev;
74 1.1 mrg sp32->st_size = sp43->st_size;
75 1.1 mrg sp32->st_atimespec.tv_sec = sp43->st_atimespec.tv_sec;
76 1.1 mrg sp32->st_atimespec.tv_nsec = sp43->st_atimespec.tv_nsec;
77 1.1 mrg sp32->st_mtimespec.tv_sec = sp43->st_mtimespec.tv_sec;
78 1.1 mrg sp32->st_mtimespec.tv_nsec = sp43->st_mtimespec.tv_nsec;
79 1.1 mrg sp32->st_ctimespec.tv_sec = sp43->st_ctimespec.tv_sec;
80 1.1 mrg sp32->st_ctimespec.tv_nsec = sp43->st_ctimespec.tv_nsec;
81 1.1 mrg sp32->st_blksize = sp43->st_blksize;
82 1.1 mrg sp32->st_blocks = sp43->st_blocks;
83 1.1 mrg sp32->st_flags = sp43->st_flags;
84 1.1 mrg sp32->st_gen = sp43->st_gen;
85 1.1 mrg }
86 1.1 mrg
87 1.1 mrg /* file system syscalls */
88 1.1 mrg int
89 1.8 eeh compat_43_netbsd32_ocreat(p, v, retval)
90 1.1 mrg struct proc *p;
91 1.1 mrg void *v;
92 1.1 mrg register_t *retval;
93 1.1 mrg {
94 1.8 eeh struct compat_43_netbsd32_ocreat_args /* {
95 1.5 mrg syscallarg(const netbsd32_charp) path;
96 1.1 mrg syscallarg(mode_t) mode;
97 1.1 mrg } */ *uap = v;
98 1.1 mrg struct sys_open_args ua;
99 1.1 mrg caddr_t sg;
100 1.1 mrg
101 1.6 mrg NETBSD32TOP_UAP(path, const char);
102 1.6 mrg NETBSD32TO64_UAP(mode);
103 1.1 mrg SCARG(&ua, flags) = O_WRONLY | O_CREAT | O_TRUNC;
104 1.21 christos sg = stackgap_init(p, 0);
105 1.12 jdolecek CHECK_ALT_EXIST(p, &sg, SCARG(&ua, path));
106 1.1 mrg
107 1.1 mrg return (sys_open(p, &ua, retval));
108 1.1 mrg }
109 1.1 mrg
110 1.1 mrg int
111 1.8 eeh compat_43_netbsd32_olseek(p, v, retval)
112 1.1 mrg struct proc *p;
113 1.1 mrg void *v;
114 1.1 mrg register_t *retval;
115 1.1 mrg {
116 1.8 eeh struct compat_43_netbsd32_olseek_args /* {
117 1.1 mrg syscallarg(int) fd;
118 1.5 mrg syscallarg(netbsd32_long) offset;
119 1.1 mrg syscallarg(int) whence;
120 1.1 mrg } */ *uap = v;
121 1.1 mrg struct sys_lseek_args ua;
122 1.1 mrg int rv;
123 1.1 mrg off_t rt;
124 1.1 mrg
125 1.1 mrg SCARG(&ua, fd) = SCARG(uap, fd);
126 1.6 mrg NETBSD32TOX_UAP(offset, long);
127 1.6 mrg NETBSD32TO64_UAP(whence);
128 1.1 mrg rv = sys_lseek(p, &ua, (register_t *)&rt);
129 1.18 eeh *retval = rt;
130 1.1 mrg
131 1.1 mrg return (rv);
132 1.1 mrg }
133 1.1 mrg
134 1.1 mrg int
135 1.8 eeh compat_43_netbsd32_stat43(p, v, retval)
136 1.1 mrg struct proc *p;
137 1.1 mrg void *v;
138 1.1 mrg register_t *retval;
139 1.1 mrg {
140 1.8 eeh struct compat_43_netbsd32_stat43_args /* {
141 1.5 mrg syscallarg(const netbsd32_charp) path;
142 1.5 mrg syscallarg(netbsd32_stat43p_t) ub;
143 1.1 mrg } */ *uap = v;
144 1.15 mrg struct stat43 sb43, *sgsbp;
145 1.15 mrg struct netbsd32_stat43 sb32;
146 1.1 mrg struct compat_43_sys_stat_args ua;
147 1.21 christos caddr_t sg = stackgap_init(p, 0);
148 1.15 mrg int rv, error;
149 1.1 mrg
150 1.6 mrg NETBSD32TOP_UAP(path, const char);
151 1.21 christos SCARG(&ua, ub) = sgsbp = stackgap_alloc(p, &sg, sizeof(sb43));
152 1.12 jdolecek CHECK_ALT_EXIST(p, &sg, SCARG(&ua, path));
153 1.1 mrg rv = compat_43_sys_stat(p, &ua, retval);
154 1.1 mrg
155 1.15 mrg error = copyin(sgsbp, &sb43, sizeof(sb43));
156 1.15 mrg if (error)
157 1.15 mrg return error;
158 1.15 mrg netbsd32_from_stat43(&sb43, &sb32);
159 1.23 scw error = copyout(&sb32, (char *)NETBSD32PTR64(SCARG(uap, ub)),
160 1.23 scw sizeof(sb32));
161 1.15 mrg if (error)
162 1.15 mrg return error;
163 1.1 mrg
164 1.1 mrg return (rv);
165 1.1 mrg }
166 1.1 mrg
167 1.1 mrg int
168 1.8 eeh compat_43_netbsd32_lstat43(p, v, retval)
169 1.1 mrg struct proc *p;
170 1.1 mrg void *v;
171 1.1 mrg register_t *retval;
172 1.1 mrg {
173 1.8 eeh struct compat_43_netbsd32_lstat43_args /* {
174 1.5 mrg syscallarg(const netbsd32_charp) path;
175 1.5 mrg syscallarg(netbsd32_stat43p_t) ub;
176 1.1 mrg } */ *uap = v;
177 1.15 mrg struct stat43 sb43, *sgsbp;
178 1.15 mrg struct netbsd32_stat43 sb32;
179 1.1 mrg struct compat_43_sys_lstat_args ua;
180 1.21 christos caddr_t sg = stackgap_init(p, 0);
181 1.15 mrg int rv, error;
182 1.1 mrg
183 1.6 mrg NETBSD32TOP_UAP(path, const char);
184 1.21 christos SCARG(&ua, ub) = sgsbp = stackgap_alloc(p, &sg, sizeof(sb43));
185 1.12 jdolecek CHECK_ALT_EXIST(p, &sg, SCARG(&ua, path));
186 1.1 mrg rv = compat_43_sys_stat(p, &ua, retval);
187 1.1 mrg
188 1.15 mrg error = copyin(sgsbp, &sb43, sizeof(sb43));
189 1.15 mrg if (error)
190 1.15 mrg return error;
191 1.15 mrg netbsd32_from_stat43(&sb43, &sb32);
192 1.23 scw error = copyout(&sb32, (char *)NETBSD32PTR64(SCARG(uap, ub)),
193 1.23 scw sizeof(sb32));
194 1.15 mrg if (error)
195 1.15 mrg return error;
196 1.1 mrg
197 1.1 mrg return (rv);
198 1.1 mrg }
199 1.1 mrg
200 1.1 mrg int
201 1.8 eeh compat_43_netbsd32_fstat43(p, v, retval)
202 1.1 mrg struct proc *p;
203 1.1 mrg void *v;
204 1.1 mrg register_t *retval;
205 1.1 mrg {
206 1.8 eeh struct compat_43_netbsd32_fstat43_args /* {
207 1.1 mrg syscallarg(int) fd;
208 1.5 mrg syscallarg(netbsd32_stat43p_t) sb;
209 1.1 mrg } */ *uap = v;
210 1.15 mrg struct stat43 sb43, *sgsbp;
211 1.15 mrg struct netbsd32_stat43 sb32;
212 1.1 mrg struct compat_43_sys_fstat_args ua;
213 1.21 christos caddr_t sg = stackgap_init(p, 0);
214 1.15 mrg int rv, error;
215 1.1 mrg
216 1.6 mrg NETBSD32TO64_UAP(fd);
217 1.21 christos SCARG(&ua, sb) = sgsbp = stackgap_alloc(p, &sg, sizeof(sb43));
218 1.1 mrg rv = compat_43_sys_fstat(p, &ua, retval);
219 1.1 mrg
220 1.15 mrg error = copyin(sgsbp, &sb43, sizeof(sb43));
221 1.15 mrg if (error)
222 1.15 mrg return error;
223 1.15 mrg netbsd32_from_stat43(&sb43, &sb32);
224 1.23 scw error = copyout(&sb32, (char *)NETBSD32PTR64(SCARG(uap, sb)),
225 1.23 scw sizeof(sb32));
226 1.15 mrg if (error)
227 1.15 mrg return error;
228 1.1 mrg
229 1.1 mrg return (rv);
230 1.1 mrg }
231 1.1 mrg
232 1.1 mrg int
233 1.8 eeh compat_43_netbsd32_otruncate(p, v, retval)
234 1.1 mrg struct proc *p;
235 1.1 mrg void *v;
236 1.1 mrg register_t *retval;
237 1.1 mrg {
238 1.8 eeh struct compat_43_netbsd32_otruncate_args /* {
239 1.5 mrg syscallarg(const netbsd32_charp) path;
240 1.5 mrg syscallarg(netbsd32_long) length;
241 1.1 mrg } */ *uap = v;
242 1.1 mrg struct sys_truncate_args ua;
243 1.1 mrg
244 1.6 mrg NETBSD32TOP_UAP(path, const char);
245 1.6 mrg NETBSD32TO64_UAP(length);
246 1.1 mrg return (sys_ftruncate(p, &ua, retval));
247 1.1 mrg }
248 1.1 mrg
249 1.1 mrg int
250 1.8 eeh compat_43_netbsd32_oftruncate(p, v, retval)
251 1.1 mrg struct proc *p;
252 1.1 mrg void *v;
253 1.1 mrg register_t *retval;
254 1.1 mrg {
255 1.8 eeh struct compat_43_netbsd32_oftruncate_args /* {
256 1.1 mrg syscallarg(int) fd;
257 1.5 mrg syscallarg(netbsd32_long) length;
258 1.1 mrg } */ *uap = v;
259 1.1 mrg struct sys_ftruncate_args ua;
260 1.1 mrg
261 1.6 mrg NETBSD32TO64_UAP(fd);
262 1.6 mrg NETBSD32TO64_UAP(length);
263 1.1 mrg return (sys_ftruncate(p, &ua, retval));
264 1.1 mrg }
265 1.1 mrg
266 1.1 mrg int
267 1.8 eeh compat_43_netbsd32_ogetdirentries(p, v, retval)
268 1.1 mrg struct proc *p;
269 1.1 mrg void *v;
270 1.1 mrg register_t *retval;
271 1.1 mrg {
272 1.8 eeh struct compat_43_netbsd32_ogetdirentries_args /* {
273 1.1 mrg syscallarg(int) fd;
274 1.5 mrg syscallarg(netbsd32_charp) buf;
275 1.1 mrg syscallarg(u_int) count;
276 1.5 mrg syscallarg(netbsd32_longp) basep;
277 1.1 mrg } */ *uap = v;
278 1.1 mrg struct compat_43_sys_getdirentries_args ua;
279 1.1 mrg
280 1.6 mrg NETBSD32TO64_UAP(fd);
281 1.6 mrg NETBSD32TOP_UAP(buf, char);
282 1.6 mrg NETBSD32TO64_UAP(count);
283 1.6 mrg NETBSD32TOP_UAP(basep, long);
284 1.1 mrg return (compat_43_sys_getdirentries(p, &ua, retval));
285 1.1 mrg }
286 1.1 mrg
287 1.1 mrg /* kernel syscalls */
288 1.1 mrg int
289 1.8 eeh compat_43_netbsd32_ogetkerninfo(p, v, retval)
290 1.1 mrg struct proc *p;
291 1.1 mrg void *v;
292 1.1 mrg register_t *retval;
293 1.1 mrg {
294 1.8 eeh struct compat_43_netbsd32_ogetkerninfo_args /* {
295 1.1 mrg syscallarg(int) op;
296 1.5 mrg syscallarg(netbsd32_charp) where;
297 1.5 mrg syscallarg(netbsd32_intp) size;
298 1.1 mrg syscallarg(int) arg;
299 1.1 mrg } */ *uap = v;
300 1.1 mrg struct compat_43_sys_getkerninfo_args ua;
301 1.1 mrg
302 1.6 mrg NETBSD32TO64_UAP(op);
303 1.6 mrg NETBSD32TOP_UAP(where, char);
304 1.6 mrg NETBSD32TOP_UAP(size, int);
305 1.6 mrg NETBSD32TO64_UAP(arg);
306 1.1 mrg return (compat_43_sys_getkerninfo(p, &ua, retval));
307 1.1 mrg }
308 1.1 mrg
309 1.1 mrg int
310 1.8 eeh compat_43_netbsd32_ogethostname(p, v, retval)
311 1.1 mrg struct proc *p;
312 1.1 mrg void *v;
313 1.1 mrg register_t *retval;
314 1.1 mrg {
315 1.8 eeh struct compat_43_netbsd32_ogethostname_args /* {
316 1.5 mrg syscallarg(netbsd32_charp) hostname;
317 1.1 mrg syscallarg(u_int) len;
318 1.1 mrg } */ *uap = v;
319 1.1 mrg int name;
320 1.1 mrg size_t sz;
321 1.1 mrg
322 1.1 mrg name = KERN_HOSTNAME;
323 1.1 mrg sz = SCARG(uap, len);
324 1.23 scw return (kern_sysctl(&name, 1,
325 1.23 scw (char *)NETBSD32PTR64(SCARG(uap, hostname)), &sz, 0, 0, p));
326 1.1 mrg }
327 1.1 mrg
328 1.1 mrg int
329 1.8 eeh compat_43_netbsd32_osethostname(p, v, retval)
330 1.1 mrg struct proc *p;
331 1.1 mrg void *v;
332 1.1 mrg register_t *retval;
333 1.1 mrg {
334 1.8 eeh struct compat_43_netbsd32_osethostname_args /* {
335 1.5 mrg syscallarg(netbsd32_charp) hostname;
336 1.1 mrg syscallarg(u_int) len;
337 1.1 mrg } */ *uap = v;
338 1.1 mrg int name;
339 1.1 mrg int error;
340 1.1 mrg
341 1.1 mrg if ((error = suser(p->p_ucred, &p->p_acflag)) != 0)
342 1.1 mrg return (error);
343 1.1 mrg name = KERN_HOSTNAME;
344 1.23 scw return (kern_sysctl(&name, 1, 0, 0, (char *)NETBSD32PTR64(SCARG(uap,
345 1.23 scw hostname)), SCARG(uap, len), p));
346 1.1 mrg }
347 1.1 mrg
348 1.1 mrg int
349 1.8 eeh compat_43_netbsd32_sethostid(p, v, retval)
350 1.4 eeh struct proc *p;
351 1.4 eeh void *v;
352 1.4 eeh register_t *retval;
353 1.4 eeh {
354 1.8 eeh struct compat_43_netbsd32_sethostid_args /* {
355 1.4 eeh syscallarg(int32_t) hostid;
356 1.4 eeh } */ *uap = v;
357 1.4 eeh struct compat_43_sys_sethostid_args ua;
358 1.4 eeh
359 1.6 mrg NETBSD32TO64_UAP(hostid);
360 1.4 eeh return (compat_43_sys_sethostid(p, &ua, retval));
361 1.4 eeh }
362 1.4 eeh
363 1.4 eeh int
364 1.8 eeh compat_43_netbsd32_ogetrlimit(p, v, retval)
365 1.1 mrg struct proc *p;
366 1.1 mrg void *v;
367 1.1 mrg register_t *retval;
368 1.1 mrg {
369 1.8 eeh struct compat_43_netbsd32_ogetrlimit_args /* {
370 1.1 mrg syscallarg(int) which;
371 1.5 mrg syscallarg(netbsd32_orlimitp_t) rlp;
372 1.1 mrg } */ *uap = v;
373 1.1 mrg struct compat_43_sys_getrlimit_args ua;
374 1.1 mrg
375 1.6 mrg NETBSD32TO64_UAP(which);
376 1.6 mrg NETBSD32TOP_UAP(rlp, struct orlimit);
377 1.1 mrg return (compat_43_sys_getrlimit(p, &ua, retval));
378 1.1 mrg }
379 1.1 mrg
380 1.1 mrg int
381 1.8 eeh compat_43_netbsd32_osetrlimit(p, v, retval)
382 1.1 mrg struct proc *p;
383 1.1 mrg void *v;
384 1.1 mrg register_t *retval;
385 1.1 mrg {
386 1.8 eeh struct compat_43_netbsd32_osetrlimit_args /* {
387 1.1 mrg syscallarg(int) which;
388 1.5 mrg syscallarg(netbsd32_orlimitp_t) rlp;
389 1.1 mrg } */ *uap = v;
390 1.1 mrg struct compat_43_sys_setrlimit_args ua;
391 1.1 mrg
392 1.6 mrg NETBSD32TO64_UAP(which);
393 1.6 mrg NETBSD32TOP_UAP(rlp, struct orlimit);
394 1.1 mrg return (compat_43_sys_setrlimit(p, &ua, retval));
395 1.1 mrg }
396 1.1 mrg
397 1.4 eeh int
398 1.8 eeh compat_43_netbsd32_killpg(p, v, retval)
399 1.4 eeh struct proc *p;
400 1.4 eeh void *v;
401 1.4 eeh register_t *retval;
402 1.4 eeh {
403 1.8 eeh struct compat_43_netbsd32_killpg_args /* {
404 1.4 eeh syscallarg(int) pgid;
405 1.4 eeh syscallarg(int) signum;
406 1.4 eeh } */ *uap = v;
407 1.4 eeh struct compat_43_sys_killpg_args ua;
408 1.4 eeh
409 1.6 mrg NETBSD32TO64_UAP(pgid);
410 1.6 mrg NETBSD32TO64_UAP(signum);
411 1.4 eeh return (compat_43_sys_killpg(p, &ua, retval));
412 1.4 eeh }
413 1.4 eeh
414 1.1 mrg /* virtual memory syscalls */
415 1.1 mrg int
416 1.8 eeh compat_43_netbsd32_ommap(p, v, retval)
417 1.1 mrg struct proc *p;
418 1.1 mrg void *v;
419 1.1 mrg register_t *retval;
420 1.1 mrg {
421 1.8 eeh struct compat_43_netbsd32_ommap_args /* {
422 1.5 mrg syscallarg(netbsd32_caddr_t) addr;
423 1.5 mrg syscallarg(netbsd32_size_t) len;
424 1.1 mrg syscallarg(int) prot;
425 1.1 mrg syscallarg(int) flags;
426 1.1 mrg syscallarg(int) fd;
427 1.5 mrg syscallarg(netbsd32_long) pos;
428 1.1 mrg } */ *uap = v;
429 1.1 mrg struct compat_43_sys_mmap_args ua;
430 1.1 mrg
431 1.6 mrg NETBSD32TOX64_UAP(addr, caddr_t);
432 1.6 mrg NETBSD32TOX_UAP(len, size_t);
433 1.6 mrg NETBSD32TO64_UAP(prot);
434 1.6 mrg NETBSD32TO64_UAP(flags);
435 1.6 mrg NETBSD32TO64_UAP(fd);
436 1.6 mrg NETBSD32TOX_UAP(pos, long);
437 1.2 mrg return (compat_43_sys_mmap(p, &ua, retval));
438 1.4 eeh }
439 1.4 eeh
440 1.1 mrg /* network syscalls */
441 1.1 mrg int
442 1.8 eeh compat_43_netbsd32_oaccept(p, v, retval)
443 1.1 mrg struct proc *p;
444 1.1 mrg void *v;
445 1.1 mrg register_t *retval;
446 1.1 mrg {
447 1.8 eeh struct compat_43_netbsd32_oaccept_args /* {
448 1.1 mrg syscallarg(int) s;
449 1.5 mrg syscallarg(netbsd32_caddr_t) name;
450 1.5 mrg syscallarg(netbsd32_intp) anamelen;
451 1.1 mrg } */ *uap = v;
452 1.1 mrg struct compat_43_sys_accept_args ua;
453 1.1 mrg
454 1.6 mrg NETBSD32TOX_UAP(s, int);
455 1.6 mrg NETBSD32TOX64_UAP(name, caddr_t);
456 1.6 mrg NETBSD32TOP_UAP(anamelen, int);
457 1.2 mrg return (compat_43_sys_accept(p, &ua, retval));
458 1.1 mrg }
459 1.1 mrg
460 1.1 mrg int
461 1.8 eeh compat_43_netbsd32_osend(p, v, retval)
462 1.1 mrg struct proc *p;
463 1.1 mrg void *v;
464 1.1 mrg register_t *retval;
465 1.1 mrg {
466 1.8 eeh struct compat_43_netbsd32_osend_args /* {
467 1.1 mrg syscallarg(int) s;
468 1.5 mrg syscallarg(netbsd32_caddr_t) buf;
469 1.1 mrg syscallarg(int) len;
470 1.1 mrg syscallarg(int) flags;
471 1.1 mrg } */ *uap = v;
472 1.1 mrg struct compat_43_sys_send_args ua;
473 1.1 mrg
474 1.6 mrg NETBSD32TO64_UAP(s);
475 1.6 mrg NETBSD32TOX64_UAP(buf, caddr_t);
476 1.6 mrg NETBSD32TO64_UAP(len);
477 1.6 mrg NETBSD32TO64_UAP(flags);
478 1.2 mrg return (compat_43_sys_send(p, &ua, retval));
479 1.1 mrg }
480 1.1 mrg
481 1.1 mrg int
482 1.8 eeh compat_43_netbsd32_orecv(p, v, retval)
483 1.1 mrg struct proc *p;
484 1.1 mrg void *v;
485 1.1 mrg register_t *retval;
486 1.1 mrg {
487 1.8 eeh struct compat_43_netbsd32_orecv_args /* {
488 1.1 mrg syscallarg(int) s;
489 1.5 mrg syscallarg(netbsd32_caddr_t) buf;
490 1.1 mrg syscallarg(int) len;
491 1.1 mrg syscallarg(int) flags;
492 1.1 mrg } */ *uap = v;
493 1.1 mrg struct compat_43_sys_recv_args ua;
494 1.1 mrg
495 1.6 mrg NETBSD32TO64_UAP(s);
496 1.6 mrg NETBSD32TOX64_UAP(buf, caddr_t);
497 1.6 mrg NETBSD32TO64_UAP(len);
498 1.6 mrg NETBSD32TO64_UAP(flags);
499 1.2 mrg return (compat_43_sys_recv(p, &ua, retval));
500 1.1 mrg }
501 1.1 mrg
502 1.1 mrg /*
503 1.1 mrg * XXX convert these to use a common iovec code to the native
504 1.1 mrg * netbsd call.
505 1.1 mrg */
506 1.1 mrg int
507 1.8 eeh compat_43_netbsd32_orecvmsg(p, v, retval)
508 1.1 mrg struct proc *p;
509 1.1 mrg void *v;
510 1.1 mrg register_t *retval;
511 1.1 mrg {
512 1.8 eeh struct compat_43_netbsd32_orecvmsg_args /* {
513 1.1 mrg syscallarg(int) s;
514 1.5 mrg syscallarg(netbsd32_omsghdrp_t) msg;
515 1.1 mrg syscallarg(int) flags;
516 1.1 mrg } */ *uap = v;
517 1.1 mrg struct compat_43_sys_recvmsg_args ua;
518 1.16 mrg struct omsghdr omh, *sgsbp;
519 1.16 mrg struct netbsd32_omsghdr omh32;
520 1.16 mrg struct iovec iov, *sgsbp2;
521 1.16 mrg struct netbsd32_iovec iov32, *iovec32p;
522 1.21 christos caddr_t sg = stackgap_init(p, 0);
523 1.16 mrg int i, error, rv;
524 1.1 mrg
525 1.6 mrg NETBSD32TO64_UAP(s);
526 1.6 mrg NETBSD32TO64_UAP(flags);
527 1.1 mrg
528 1.16 mrg /*
529 1.16 mrg * this is annoying:
530 1.16 mrg * - copyin the msghdr32 struct
531 1.16 mrg * - stackgap_alloc a msghdr struct
532 1.16 mrg * - convert msghdr32 to msghdr:
533 1.16 mrg * - stackgap_alloc enough space for iovec's
534 1.16 mrg * - copy in each iov32, and convert to iov
535 1.16 mrg * - copyout converted iov
536 1.16 mrg * - copyout converted msghdr
537 1.16 mrg * - do real syscall
538 1.16 mrg * - copyin the msghdr struct
539 1.16 mrg * - convert msghdr to msghdr32
540 1.16 mrg * - copyin each iov and convert to iov32
541 1.16 mrg * - copyout converted iov32
542 1.16 mrg * - copyout converted msghdr32
543 1.16 mrg */
544 1.23 scw error = copyin((caddr_t)NETBSD32PTR64(SCARG(uap, msg)), &omh32,
545 1.23 scw sizeof(omh32));
546 1.16 mrg if (error)
547 1.16 mrg return (error);
548 1.16 mrg
549 1.21 christos SCARG(&ua, msg) = sgsbp = stackgap_alloc(p, &sg, sizeof(omh));
550 1.23 scw omh.msg_name = (caddr_t)NETBSD32PTR64(omh32.msg_name);
551 1.16 mrg omh.msg_namelen = omh32.msg_namelen;
552 1.16 mrg omh.msg_iovlen = (size_t)omh32.msg_iovlen;
553 1.21 christos omh.msg_iov = sgsbp2 = stackgap_alloc(p, &sg, sizeof(struct iovec) * omh.msg_iovlen);
554 1.23 scw iovec32p = (struct netbsd32_iovec *)NETBSD32PTR64(omh32.msg_iov);
555 1.16 mrg for (i = 0; i < omh.msg_iovlen; i++, sgsbp2++, iovec32p++) {
556 1.16 mrg error = copyin(iovec32p, &iov32, sizeof(iov32));
557 1.16 mrg if (error)
558 1.16 mrg return (error);
559 1.23 scw iov.iov_base =
560 1.23 scw (struct iovec *)NETBSD32PTR64(iovec32p->iov_base);
561 1.16 mrg iov.iov_len = (size_t)iovec32p->iov_len;
562 1.16 mrg error = copyout(&iov, sgsbp2, sizeof(iov));
563 1.16 mrg if (error)
564 1.16 mrg return (error);
565 1.1 mrg }
566 1.23 scw omh.msg_accrights = (caddr_t)NETBSD32PTR64(omh32.msg_accrights);
567 1.16 mrg omh.msg_accrightslen = omh32.msg_accrightslen;
568 1.16 mrg error = copyout(&omh, sgsbp, sizeof(omh));
569 1.16 mrg if (error)
570 1.16 mrg return (error);
571 1.1 mrg
572 1.16 mrg rv = compat_43_sys_recvmsg(p, &ua, retval);
573 1.1 mrg
574 1.16 mrg error = copyin(sgsbp, &omh, sizeof(omh));
575 1.16 mrg if (error)
576 1.16 mrg return error;
577 1.16 mrg omh32.msg_name = (netbsd32_caddr_t)(u_long)omh.msg_name;
578 1.16 mrg omh32.msg_namelen = omh.msg_namelen;
579 1.16 mrg omh32.msg_iovlen = (netbsd32_size_t)omh.msg_iovlen;
580 1.23 scw iovec32p = (struct netbsd32_iovec *)NETBSD32PTR64(omh32.msg_iov);
581 1.16 mrg sgsbp2 = omh.msg_iov;
582 1.16 mrg for (i = 0; i < omh.msg_iovlen; i++, sgsbp2++, iovec32p++) {
583 1.16 mrg error = copyin(sgsbp2, &iov, sizeof(iov));
584 1.16 mrg if (error)
585 1.16 mrg return (error);
586 1.16 mrg iov32.iov_base = (netbsd32_iovecp_t)(u_long)iov.iov_base;
587 1.16 mrg iov32.iov_len = (netbsd32_size_t)iov.iov_len;
588 1.16 mrg error = copyout(&iov32, iovec32p, sizeof(iov32));
589 1.16 mrg if (error)
590 1.16 mrg return (error);
591 1.16 mrg }
592 1.16 mrg omh32.msg_accrights = (netbsd32_caddr_t)(u_long)omh.msg_accrights;
593 1.16 mrg omh32.msg_accrightslen = omh.msg_accrightslen;
594 1.16 mrg
595 1.23 scw error = copyout(&omh32, (char *)NETBSD32PTR64(SCARG(uap, msg)),
596 1.23 scw sizeof(omh32));
597 1.16 mrg if (error)
598 1.16 mrg return error;
599 1.16 mrg
600 1.16 mrg return (rv);
601 1.1 mrg }
602 1.1 mrg
603 1.1 mrg int
604 1.8 eeh compat_43_netbsd32_osendmsg(p, v, retval)
605 1.1 mrg struct proc *p;
606 1.1 mrg void *v;
607 1.1 mrg register_t *retval;
608 1.1 mrg {
609 1.8 eeh struct compat_43_netbsd32_osendmsg_args /* {
610 1.1 mrg syscallarg(int) s;
611 1.5 mrg syscallarg(netbsd32_caddr_t) msg;
612 1.1 mrg syscallarg(int) flags;
613 1.1 mrg } */ *uap = v;
614 1.16 mrg struct compat_43_sys_recvmsg_args ua;
615 1.16 mrg struct omsghdr omh, *sgsbp;
616 1.16 mrg struct netbsd32_omsghdr omh32;
617 1.16 mrg struct iovec iov, *sgsbp2;
618 1.16 mrg struct netbsd32_iovec iov32, *iovec32p;
619 1.21 christos caddr_t sg = stackgap_init(p, 0);
620 1.16 mrg int i, error, rv;
621 1.1 mrg
622 1.6 mrg NETBSD32TO64_UAP(s);
623 1.6 mrg NETBSD32TO64_UAP(flags);
624 1.1 mrg
625 1.16 mrg /*
626 1.16 mrg * this is annoying:
627 1.16 mrg * - copyin the msghdr32 struct
628 1.16 mrg * - stackgap_alloc a msghdr struct
629 1.16 mrg * - convert msghdr32 to msghdr:
630 1.16 mrg * - stackgap_alloc enough space for iovec's
631 1.16 mrg * - copy in each iov32, and convert to iov
632 1.16 mrg * - copyout converted iov
633 1.16 mrg * - copyout converted msghdr
634 1.16 mrg * - do real syscall
635 1.16 mrg * - copyin the msghdr struct
636 1.16 mrg * - convert msghdr to msghdr32
637 1.16 mrg * - copyin each iov and convert to iov32
638 1.16 mrg * - copyout converted iov32
639 1.16 mrg * - copyout converted msghdr32
640 1.16 mrg */
641 1.23 scw error = copyin((caddr_t)NETBSD32PTR64(SCARG(uap, msg)), &omh32,
642 1.23 scw sizeof(omh32));
643 1.16 mrg if (error)
644 1.16 mrg return (error);
645 1.16 mrg
646 1.21 christos SCARG(&ua, msg) = sgsbp = stackgap_alloc(p, &sg, sizeof(omh));
647 1.23 scw omh.msg_name = (caddr_t)NETBSD32PTR64(omh32.msg_name);
648 1.16 mrg omh.msg_namelen = omh32.msg_namelen;
649 1.16 mrg omh.msg_iovlen = (size_t)omh32.msg_iovlen;
650 1.21 christos omh.msg_iov = sgsbp2 = stackgap_alloc(p, &sg, sizeof(struct iovec) * omh.msg_iovlen);
651 1.23 scw iovec32p = (struct netbsd32_iovec *)NETBSD32PTR64(omh32.msg_iov);
652 1.16 mrg for (i = 0; i < omh.msg_iovlen; i++, sgsbp2++, iovec32p++) {
653 1.16 mrg error = copyin(iovec32p, &iov32, sizeof(iov32));
654 1.16 mrg if (error)
655 1.16 mrg return (error);
656 1.23 scw iov.iov_base =
657 1.23 scw (struct iovec *)NETBSD32PTR64(iovec32p->iov_base);
658 1.16 mrg iov.iov_len = (size_t)iovec32p->iov_len;
659 1.16 mrg error = copyout(&iov, sgsbp2, sizeof(iov));
660 1.16 mrg if (error)
661 1.16 mrg return (error);
662 1.1 mrg }
663 1.23 scw omh.msg_accrights = (caddr_t)NETBSD32PTR64(omh32.msg_accrights);
664 1.16 mrg omh.msg_accrightslen = omh32.msg_accrightslen;
665 1.16 mrg error = copyout(&omh, sgsbp, sizeof(omh));
666 1.16 mrg if (error)
667 1.16 mrg return (error);
668 1.1 mrg
669 1.16 mrg rv = compat_43_sys_sendmsg(p, &ua, retval);
670 1.1 mrg
671 1.16 mrg error = copyin(sgsbp, &omh, sizeof(omh));
672 1.16 mrg if (error)
673 1.16 mrg return error;
674 1.16 mrg omh32.msg_name = (netbsd32_caddr_t)(u_long)omh.msg_name;
675 1.16 mrg omh32.msg_namelen = omh.msg_namelen;
676 1.16 mrg omh32.msg_iovlen = (netbsd32_size_t)omh.msg_iovlen;
677 1.23 scw iovec32p = (struct netbsd32_iovec *)NETBSD32PTR64(omh32.msg_iov);
678 1.16 mrg sgsbp2 = omh.msg_iov;
679 1.16 mrg for (i = 0; i < omh.msg_iovlen; i++, sgsbp2++, iovec32p++) {
680 1.16 mrg error = copyin(sgsbp2, &iov, sizeof(iov));
681 1.16 mrg if (error)
682 1.16 mrg return (error);
683 1.16 mrg iov32.iov_base = (netbsd32_iovecp_t)(u_long)iov.iov_base;
684 1.16 mrg iov32.iov_len = (netbsd32_size_t)iov.iov_len;
685 1.16 mrg error = copyout(&iov32, iovec32p, sizeof(iov32));
686 1.16 mrg if (error)
687 1.16 mrg return (error);
688 1.16 mrg }
689 1.16 mrg omh32.msg_accrights = (netbsd32_caddr_t)(u_long)omh.msg_accrights;
690 1.16 mrg omh32.msg_accrightslen = omh.msg_accrightslen;
691 1.16 mrg
692 1.23 scw error = copyout(&omh32, (char *)NETBSD32PTR64(SCARG(uap, msg)),
693 1.23 scw sizeof(omh32));
694 1.16 mrg if (error)
695 1.16 mrg return error;
696 1.16 mrg
697 1.16 mrg return (rv);
698 1.1 mrg }
699 1.1 mrg
700 1.1 mrg int
701 1.8 eeh compat_43_netbsd32_orecvfrom(p, v, retval)
702 1.1 mrg struct proc *p;
703 1.1 mrg void *v;
704 1.1 mrg register_t *retval;
705 1.1 mrg {
706 1.8 eeh struct compat_43_netbsd32_orecvfrom_args /* {
707 1.1 mrg syscallarg(int) s;
708 1.5 mrg syscallarg(netbsd32_caddr_t) buf;
709 1.5 mrg syscallarg(netbsd32_size_t) len;
710 1.1 mrg syscallarg(int) flags;
711 1.5 mrg syscallarg(netbsd32_caddr_t) from;
712 1.5 mrg syscallarg(netbsd32_intp) fromlenaddr;
713 1.1 mrg } */ *uap = v;
714 1.1 mrg struct compat_43_sys_recvfrom_args ua;
715 1.1 mrg
716 1.6 mrg NETBSD32TO64_UAP(s);
717 1.6 mrg NETBSD32TOX64_UAP(buf, caddr_t);
718 1.6 mrg NETBSD32TOX_UAP(len, size_t);
719 1.6 mrg NETBSD32TO64_UAP(flags);
720 1.6 mrg NETBSD32TOX64_UAP(from, caddr_t);
721 1.6 mrg NETBSD32TOP_UAP(fromlenaddr, int);
722 1.1 mrg return (compat_43_sys_recvfrom(p, &ua, retval));
723 1.1 mrg }
724 1.1 mrg
725 1.1 mrg int
726 1.8 eeh compat_43_netbsd32_ogetsockname(p, v, retval)
727 1.1 mrg struct proc *p;
728 1.1 mrg void *v;
729 1.1 mrg register_t *retval;
730 1.1 mrg {
731 1.8 eeh struct compat_43_netbsd32_ogetsockname_args /* {
732 1.1 mrg syscallarg(int) fdec;
733 1.5 mrg syscallarg(netbsd32_caddr_t) asa;
734 1.5 mrg syscallarg(netbsd32_intp) alen;
735 1.1 mrg } */ *uap = v;
736 1.1 mrg struct compat_43_sys_getsockname_args ua;
737 1.1 mrg
738 1.6 mrg NETBSD32TO64_UAP(fdec);
739 1.6 mrg NETBSD32TOX64_UAP(asa, caddr_t);
740 1.6 mrg NETBSD32TOP_UAP(alen, int);
741 1.1 mrg return (compat_43_sys_getsockname(p, &ua, retval));
742 1.1 mrg }
743 1.1 mrg
744 1.1 mrg int
745 1.8 eeh compat_43_netbsd32_ogetpeername(p, v, retval)
746 1.1 mrg struct proc *p;
747 1.1 mrg void *v;
748 1.1 mrg register_t *retval;
749 1.1 mrg {
750 1.8 eeh struct compat_43_netbsd32_ogetpeername_args /* {
751 1.1 mrg syscallarg(int) fdes;
752 1.5 mrg syscallarg(netbsd32_caddr_t) asa;
753 1.5 mrg syscallarg(netbsd32_intp) alen;
754 1.1 mrg } */ *uap = v;
755 1.1 mrg struct compat_43_sys_getpeername_args ua;
756 1.1 mrg
757 1.6 mrg NETBSD32TO64_UAP(fdes);
758 1.6 mrg NETBSD32TOX64_UAP(asa, caddr_t);
759 1.6 mrg NETBSD32TOP_UAP(alen, int);
760 1.1 mrg return (compat_43_sys_getpeername(p, &ua, retval));
761 1.1 mrg }
762 1.1 mrg
763 1.1 mrg /* signal syscalls */
764 1.1 mrg int
765 1.8 eeh compat_43_netbsd32_osigvec(p, v, retval)
766 1.1 mrg struct proc *p;
767 1.1 mrg void *v;
768 1.1 mrg register_t *retval;
769 1.1 mrg {
770 1.8 eeh struct compat_43_netbsd32_osigvec_args /* {
771 1.1 mrg syscallarg(int) signum;
772 1.5 mrg syscallarg(netbsd32_sigvecp_t) nsv;
773 1.5 mrg syscallarg(netbsd32_sigvecp_t) osv;
774 1.1 mrg } */ *uap = v;
775 1.1 mrg struct compat_43_sys_sigvec_args ua;
776 1.16 mrg struct netbsd32_sigvec sv32;
777 1.16 mrg struct sigvec sv, *sgnsvp, *sgosvp;
778 1.21 christos caddr_t sg = stackgap_init(p, 0);
779 1.16 mrg int rv, error;
780 1.1 mrg
781 1.6 mrg NETBSD32TO64_UAP(signum);
782 1.1 mrg if (SCARG(uap, osv))
783 1.21 christos SCARG(&ua, osv) = sgosvp = stackgap_alloc(p, &sg, sizeof(sv));
784 1.1 mrg else
785 1.1 mrg SCARG(&ua, osv) = NULL;
786 1.1 mrg if (SCARG(uap, nsv)) {
787 1.21 christos SCARG(&ua, nsv) = sgnsvp = stackgap_alloc(p, &sg, sizeof(sv));
788 1.23 scw error = copyin((caddr_t)NETBSD32PTR64(SCARG(uap, nsv)), &sv32,
789 1.23 scw sizeof(sv32));
790 1.16 mrg if (error)
791 1.16 mrg return (error);
792 1.23 scw sv.sv_handler = (void *)NETBSD32PTR64(sv32.sv_handler);
793 1.16 mrg sv.sv_mask = sv32.sv_mask;
794 1.16 mrg sv.sv_flags = sv32.sv_flags;
795 1.16 mrg error = copyout(&sv, sgnsvp, sizeof(sv));
796 1.16 mrg if (error)
797 1.16 mrg return (error);
798 1.1 mrg } else
799 1.1 mrg SCARG(&ua, nsv) = NULL;
800 1.1 mrg rv = compat_43_sys_sigvec(p, &ua, retval);
801 1.1 mrg if (rv)
802 1.1 mrg return (rv);
803 1.1 mrg
804 1.1 mrg if (SCARG(uap, osv)) {
805 1.16 mrg error = copyin(sgosvp, &sv, sizeof(sv));
806 1.16 mrg if (error)
807 1.16 mrg return (error);
808 1.16 mrg sv32.sv_handler = (netbsd32_sigvecp_t)(u_long)sv.sv_handler;
809 1.16 mrg sv32.sv_mask = sv.sv_mask;
810 1.16 mrg sv32.sv_flags = sv.sv_flags;
811 1.23 scw error = copyout(&sv32, (caddr_t)NETBSD32PTR64(SCARG(uap, osv)),
812 1.23 scw sizeof(sv32));
813 1.16 mrg if (error)
814 1.16 mrg return (error);
815 1.1 mrg }
816 1.1 mrg
817 1.1 mrg return (0);
818 1.4 eeh }
819 1.4 eeh
820 1.4 eeh int
821 1.8 eeh compat_43_netbsd32_sigblock(p, v, retval)
822 1.4 eeh struct proc *p;
823 1.4 eeh void *v;
824 1.4 eeh register_t *retval;
825 1.4 eeh {
826 1.8 eeh struct compat_43_netbsd32_sigblock_args /* {
827 1.4 eeh syscallarg(int) mask;
828 1.4 eeh } */ *uap = v;
829 1.4 eeh struct compat_43_sys_sigblock_args ua;
830 1.4 eeh
831 1.6 mrg NETBSD32TO64_UAP(mask);
832 1.4 eeh return (compat_43_sys_sigblock(p, &ua, retval));
833 1.4 eeh }
834 1.4 eeh
835 1.4 eeh int
836 1.8 eeh compat_43_netbsd32_sigsetmask(p, v, retval)
837 1.4 eeh struct proc *p;
838 1.4 eeh void *v;
839 1.4 eeh register_t *retval;
840 1.4 eeh {
841 1.8 eeh struct compat_43_netbsd32_sigsetmask_args /* {
842 1.4 eeh syscallarg(int) mask;
843 1.4 eeh } */ *uap = v;
844 1.4 eeh struct compat_43_sys_sigsetmask_args ua;
845 1.4 eeh
846 1.6 mrg NETBSD32TO64_UAP(mask);
847 1.4 eeh return (compat_43_sys_sigsetmask(p, &ua, retval));
848 1.1 mrg }
849 1.1 mrg
850 1.1 mrg int
851 1.8 eeh compat_43_netbsd32_osigstack(p, v, retval)
852 1.1 mrg struct proc *p;
853 1.1 mrg void *v;
854 1.1 mrg register_t *retval;
855 1.1 mrg {
856 1.8 eeh struct compat_43_netbsd32_osigstack_args /* {
857 1.5 mrg syscallarg(netbsd32_sigstackp_t) nss;
858 1.5 mrg syscallarg(netbsd32_sigstackp_t) oss;
859 1.1 mrg } */ *uap = v;
860 1.1 mrg struct compat_43_sys_sigstack_args ua;
861 1.16 mrg struct netbsd32_sigstack ss32;
862 1.16 mrg struct sigstack ss, *sgossp, *sgnssp;
863 1.21 christos caddr_t sg = stackgap_init(p, 0);
864 1.16 mrg int error, rv;
865 1.1 mrg
866 1.1 mrg if (SCARG(uap, oss))
867 1.21 christos SCARG(&ua, oss) = sgossp = stackgap_alloc(p, &sg, sizeof(ss));
868 1.1 mrg else
869 1.1 mrg SCARG(&ua, oss) = NULL;
870 1.1 mrg if (SCARG(uap, nss)) {
871 1.21 christos SCARG(&ua, nss) = sgnssp = stackgap_alloc(p, &sg, sizeof(ss));
872 1.23 scw error = copyin((caddr_t)NETBSD32PTR64(SCARG(uap, nss)), &ss32,
873 1.23 scw sizeof(ss32));
874 1.16 mrg if (error)
875 1.16 mrg return (error);
876 1.23 scw ss.ss_sp = (void *)NETBSD32PTR64(ss32.ss_sp);
877 1.16 mrg ss.ss_onstack = ss32.ss_onstack;
878 1.16 mrg error = copyout(&ss, sgnssp, sizeof(ss));
879 1.16 mrg if (error)
880 1.16 mrg return (error);
881 1.1 mrg } else
882 1.1 mrg SCARG(&ua, nss) = NULL;
883 1.1 mrg
884 1.1 mrg rv = compat_43_sys_sigstack(p, &ua, retval);
885 1.1 mrg if (rv)
886 1.1 mrg return (rv);
887 1.1 mrg
888 1.1 mrg if (SCARG(uap, oss)) {
889 1.16 mrg error = copyin(sgossp, &ss, sizeof(ss));
890 1.16 mrg if (error)
891 1.16 mrg return (error);
892 1.16 mrg ss32.ss_sp = (netbsd32_sigstackp_t)(u_long)ss.ss_sp;
893 1.16 mrg ss32.ss_onstack = ss.ss_onstack;
894 1.23 scw error = copyout(&ss32, (caddr_t)NETBSD32PTR64(SCARG(uap, oss)),
895 1.23 scw sizeof(ss32));
896 1.16 mrg if (error)
897 1.16 mrg return (error);
898 1.1 mrg }
899 1.1 mrg
900 1.1 mrg return (0);
901 1.1 mrg }
902