netbsd32.h revision 1.88 1 /* $NetBSD: netbsd32.h,v 1.88 2011/10/12 23:04:22 dholland Exp $ */
2
3 /*
4 * Copyright (c) 1998, 2001, 2008 Matthew R. Green
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
28
29 #ifndef _COMPAT_NETBSD32_NETBSD32_H_
30 #define _COMPAT_NETBSD32_NETBSD32_H_
31 /* We need to change the size of register_t */
32 #ifdef syscallargs
33 #undef syscallargs
34 #endif
35 /*
36 * NetBSD 32-bit compatibility module.
37 */
38
39 #include <sys/param.h> /* precautionary upon removal from ucred.h */
40 #include <sys/systm.h>
41 #include <sys/mount.h>
42 #include <sys/stat.h>
43 #include <sys/statvfs.h>
44 #include <sys/syscallargs.h>
45 #include <sys/ipc.h>
46 #include <sys/shm.h>
47 #include <sys/ucontext.h>
48 #include <sys/ucred.h>
49 #include <compat/sys/ucontext.h>
50 #include <compat/sys/mount.h>
51
52 /*
53 * first, define the basic types we need.
54 */
55
56 typedef int32_t netbsd32_long;
57 typedef uint32_t netbsd32_u_long;
58 typedef int64_t netbsd32_quad;
59
60 typedef uint32_t netbsd32_clock_t;
61 typedef uint32_t netbsd32_size_t;
62 typedef int32_t netbsd32_ssize_t;
63 typedef int32_t netbsd32_clockid_t;
64 typedef int32_t netbsd32_key_t;
65 typedef int32_t netbsd32_intptr_t;
66 typedef uint32_t netbsd32_uintptr_t;
67
68 /* netbsd32_[u]int64 are machine dependent and defined below */
69
70 /*
71 * machine depedant section; must define:
72 * netbsd32_pointer_t
73 * - 32-bit pointer type, normally uint32_t but can be int32_t
74 * for platforms which rely on sign-extension of pointers
75 * such as SH-5.
76 * NETBSD32PTR64(p32)
77 * - Translate a 32-bit pointer into something valid in a
78 * 64-bit context.
79 * struct netbsd32_sigcontext
80 * - 32bit compatibility sigcontext structure for this arch.
81 * netbsd32_sigcontextp_t
82 * - type of pointer to above, normally uint32_t
83 * void netbsd32_setregs(struct proc *p, struct exec_package *pack,
84 * unsigned long stack);
85 * int netbsd32_sigreturn(struct proc *p, void *v,
86 * register_t *retval);
87 * void netbsd32_sendsig(sig_t catcher, int sig, int mask, u_long code);
88 * char netbsd32_esigcode[], netbsd32_sigcode[]
89 * - the above are abvious
90 *
91 * pull in the netbsd32 machine dependent header, that may help with the
92 * above, or it may be provided via the MD layer itself.
93 */
94 #include <machine/netbsd32_machdep.h>
95
96 /* netbsd32_machdep.h will have (typically) defined:
97 #define NETBSD32_POINTER_TYPE uint32_t
98 typedef struct { NETBSD32_POINTER_TYPE i32; } netbsd32_pointer_t;
99 */
100
101 /*
102 * Conversion functions for the rest of the compat32 code:
103 *
104 * NETBSD32PTR64() Convert user-supplied 32bit pointer to 'void *'
105 * NETBSD32PTR32() Assign a 'void *' to a 32bit pointer variable
106 * NETBSD32PTR32PLUS() Add an integer to a 32bit pointer
107 *
108 * Under rare circumstances the following get used:
109 *
110 * NETBSD32PTR32I() Convert 'void *' to the 32bit pointer base type.
111 * NETBSD32IPTR64() Convert 32bit pointer base type to 'void *'
112 */
113 #define NETBSD32PTR64(p32) NETBSD32IPTR64((p32).i32)
114 #define NETBSD32PTR32(p32, p64) ((p32).i32 = NETBSD32PTR32I(p64))
115 #define NETBSD32PTR32PLUS(p32, incr) ((p32).i32 += incr)
116
117 static __inline NETBSD32_POINTER_TYPE
118 NETBSD32PTR32I(const void *p64) { return (uintptr_t)p64; }
119 static __inline void *
120 NETBSD32IPTR64(NETBSD32_POINTER_TYPE p32) { return (void *)(intptr_t)p32; }
121
122 /* Nothing should be using the raw type, so kill it */
123 #undef NETBSD32_POINTER_TYPE
124
125 /*
126 * 64 bit integers only have 4-byte alignment on some 32 bit ports,
127 * but always have 8-byte alignment on 64 bit systems.
128 * NETBSD32_INT64_ALIGN may be __attribute__((__aligned__(4)))
129 */
130 typedef int64_t netbsd32_int64 NETBSD32_INT64_ALIGN;
131 typedef uint64_t netbsd32_uint64 NETBSD32_INT64_ALIGN;
132 #undef NETBSD32_INT64_ALIGN
133
134 /*
135 * all pointers are netbsd32_pointer_t (defined in <machine/netbsd32_machdep.h>)
136 */
137
138 typedef netbsd32_pointer_t netbsd32_voidp;
139 typedef netbsd32_pointer_t netbsd32_u_shortp;
140 typedef netbsd32_pointer_t netbsd32_charp;
141 typedef netbsd32_pointer_t netbsd32_u_charp;
142 typedef netbsd32_pointer_t netbsd32_charpp;
143 typedef netbsd32_pointer_t netbsd32_size_tp;
144 typedef netbsd32_pointer_t netbsd32_intp;
145 typedef netbsd32_pointer_t netbsd32_longp;
146 typedef netbsd32_pointer_t netbsd32_caddrp;
147 typedef netbsd32_pointer_t netbsd32_caddr;
148 typedef netbsd32_pointer_t netbsd32_gid_tp;
149 typedef netbsd32_pointer_t netbsd32_fsid_tp_t;
150 typedef netbsd32_pointer_t netbsd32_lwpidp;
151 typedef netbsd32_pointer_t netbsd32_ucontextp;
152 typedef netbsd32_pointer_t netbsd32_caddr_t;
153 typedef netbsd32_pointer_t netbsd32_lwpctlp;
154
155 /*
156 * now, the compatibility structures and their fake pointer types.
157 */
158
159 /* from <sys/types.h> */
160 typedef netbsd32_pointer_t netbsd32_fd_setp_t;
161 typedef netbsd32_intptr_t netbsd32_semid_t;
162 typedef netbsd32_pointer_t netbsd32_semidp_t;
163 typedef netbsd32_uint64 netbsd32_dev_t;
164
165 /* from <sys/uio.h> */
166 typedef netbsd32_pointer_t netbsd32_iovecp_t;
167 struct netbsd32_iovec {
168 netbsd32_voidp iov_base; /* Base address. */
169 netbsd32_size_t iov_len; /* Length. */
170 };
171
172 /* from <sys/time.h> */
173 typedef int32_t netbsd32_timer_t;
174 typedef int32_t netbsd32_time50_t;
175 typedef netbsd32_int64 netbsd32_time_t;
176 typedef netbsd32_pointer_t netbsd32_timerp_t;
177
178 typedef netbsd32_pointer_t netbsd32_timespec50p_t;
179 struct netbsd32_timespec50 {
180 netbsd32_time50_t tv_sec; /* seconds */
181 netbsd32_long tv_nsec; /* and nanoseconds */
182 };
183
184 typedef netbsd32_pointer_t netbsd32_timespecp_t;
185 struct netbsd32_timespec {
186 netbsd32_time_t tv_sec; /* seconds */
187 netbsd32_long tv_nsec; /* and nanoseconds */
188 };
189
190 typedef netbsd32_pointer_t netbsd32_timeval50p_t;
191 struct netbsd32_timeval50 {
192 netbsd32_time50_t tv_sec; /* seconds */
193 netbsd32_long tv_usec; /* and microseconds */
194 };
195
196 typedef netbsd32_pointer_t netbsd32_timevalp_t;
197 struct netbsd32_timeval {
198 netbsd32_time_t tv_sec; /* seconds */
199 netbsd32_long tv_usec; /* and microseconds */
200 };
201
202 typedef netbsd32_pointer_t netbsd32_timezonep_t;
203 struct netbsd32_timezone {
204 int tz_minuteswest; /* minutes west of Greenwich */
205 int tz_dsttime; /* type of dst correction */
206 };
207
208 typedef netbsd32_pointer_t netbsd32_itimerval50p_t;
209 struct netbsd32_itimerval50 {
210 struct netbsd32_timeval50 it_interval; /* timer interval */
211 struct netbsd32_timeval50 it_value; /* current value */
212 };
213
214 typedef netbsd32_pointer_t netbsd32_itimervalp_t;
215 struct netbsd32_itimerval {
216 struct netbsd32_timeval it_interval; /* timer interval */
217 struct netbsd32_timeval it_value; /* current value */
218 };
219
220 typedef netbsd32_pointer_t netbsd32_itimerspec50p_t;
221 struct netbsd32_itimerspec50 {
222 struct netbsd32_timespec50 it_interval;
223 struct netbsd32_timespec50 it_value;
224 };
225
226 typedef netbsd32_pointer_t netbsd32_itimerspecp_t;
227 struct netbsd32_itimerspec {
228 struct netbsd32_timespec it_interval;
229 struct netbsd32_timespec it_value;
230 };
231
232 /* from <sys/mount.h> */
233 typedef netbsd32_pointer_t netbsd32_fidp_t;
234
235 typedef netbsd32_pointer_t netbsd32_fhandlep_t;
236 typedef netbsd32_pointer_t netbsd32_compat_30_fhandlep_t;
237
238 typedef netbsd32_pointer_t netbsd32_statfsp_t;
239 struct netbsd32_statfs {
240 short f_type; /* type of file system */
241 unsigned short f_flags; /* copy of mount flags */
242 netbsd32_long f_bsize; /* fundamental file system block size */
243 netbsd32_long f_iosize; /* optimal transfer block size */
244 netbsd32_long f_blocks; /* total data blocks in file system */
245 netbsd32_long f_bfree; /* free blocks in fs */
246 netbsd32_long f_bavail; /* free blocks avail to non-superuser */
247 netbsd32_long f_files; /* total file nodes in file system */
248 netbsd32_long f_ffree; /* free file nodes in fs */
249 fsid_t f_fsid; /* file system id */
250 uid_t f_owner; /* user that mounted the file system */
251 netbsd32_long f_spare[4]; /* spare for later */
252 char f_fstypename[MFSNAMELEN]; /* fs type name */
253 char f_mntonname[MNAMELEN]; /* directory on which mounted */
254 char f_mntfromname[MNAMELEN]; /* mounted file system */
255 };
256
257 struct netbsd32_export_args30 {
258 int ex_flags; /* export related flags */
259 uid_t ex_root; /* mapping for root uid */
260 struct uucred ex_anon; /* mapping for anonymous user */
261 netbsd32_pointer_t ex_addr; /* net address to which exported */
262 int ex_addrlen; /* and the net address length */
263 netbsd32_pointer_t ex_mask; /* mask of valid bits in saddr */
264 int ex_masklen; /* and the smask length */
265 netbsd32_charp ex_indexfile; /* index file for WebNFS URLs */
266 };
267
268 /* from <sys/poll.h> */
269 typedef netbsd32_pointer_t netbsd32_pollfdp_t;
270
271 /* from <sys/resource.h> */
272 typedef netbsd32_pointer_t netbsd32_rusage50p_t;
273 struct netbsd32_rusage50 {
274 struct netbsd32_timeval50 ru_utime;/* user time used */
275 struct netbsd32_timeval50 ru_stime;/* system time used */
276 netbsd32_long ru_maxrss; /* max resident set size */
277 netbsd32_long ru_ixrss; /* integral shared memory size */
278 netbsd32_long ru_idrss; /* integral unshared data " */
279 netbsd32_long ru_isrss; /* integral unshared stack " */
280 netbsd32_long ru_minflt; /* page reclaims */
281 netbsd32_long ru_majflt; /* page faults */
282 netbsd32_long ru_nswap; /* swaps */
283 netbsd32_long ru_inblock; /* block input operations */
284 netbsd32_long ru_oublock; /* block output operations */
285 netbsd32_long ru_msgsnd; /* messages sent */
286 netbsd32_long ru_msgrcv; /* messages received */
287 netbsd32_long ru_nsignals; /* signals received */
288 netbsd32_long ru_nvcsw; /* voluntary context switches */
289 netbsd32_long ru_nivcsw; /* involuntary " */
290 };
291
292 typedef netbsd32_pointer_t netbsd32_rusagep_t;
293 struct netbsd32_rusage {
294 struct netbsd32_timeval ru_utime;/* user time used */
295 struct netbsd32_timeval ru_stime;/* system time used */
296 netbsd32_long ru_maxrss; /* max resident set size */
297 netbsd32_long ru_ixrss; /* integral shared memory size */
298 netbsd32_long ru_idrss; /* integral unshared data " */
299 netbsd32_long ru_isrss; /* integral unshared stack " */
300 netbsd32_long ru_minflt; /* page reclaims */
301 netbsd32_long ru_majflt; /* page faults */
302 netbsd32_long ru_nswap; /* swaps */
303 netbsd32_long ru_inblock; /* block input operations */
304 netbsd32_long ru_oublock; /* block output operations */
305 netbsd32_long ru_msgsnd; /* messages sent */
306 netbsd32_long ru_msgrcv; /* messages received */
307 netbsd32_long ru_nsignals; /* signals received */
308 netbsd32_long ru_nvcsw; /* voluntary context switches */
309 netbsd32_long ru_nivcsw; /* involuntary " */
310 };
311
312 typedef netbsd32_pointer_t netbsd32_orlimitp_t;
313
314 typedef netbsd32_pointer_t netbsd32_rlimitp_t;
315
316 struct netbsd32_loadavg {
317 fixpt_t ldavg[3];
318 netbsd32_long fscale;
319 };
320
321 /* from <sys/ipc.h> */
322 typedef netbsd32_pointer_t netbsd32_ipc_permp_t;
323 struct netbsd32_ipc_perm {
324 uid_t cuid; /* creator user id */
325 gid_t cgid; /* creator group id */
326 uid_t uid; /* user id */
327 gid_t gid; /* group id */
328 mode_t mode; /* r/w permission */
329 unsigned short _seq; /* sequence # (to generate unique msg/sem/shm id) */
330 netbsd32_key_t _key; /* user specified msg/sem/shm key */
331 };
332 struct netbsd32_ipc_perm14 {
333 unsigned short cuid; /* creator user id */
334 unsigned short cgid; /* creator group id */
335 unsigned short uid; /* user id */
336 unsigned short gid; /* group id */
337 unsigned short mode; /* r/w permission */
338 unsigned short seq; /* sequence # (to generate unique msg/sem/shm id) */
339 netbsd32_key_t key; /* user specified msg/sem/shm key */
340 };
341
342 /* from <sys/msg.h> */
343 typedef netbsd32_pointer_t netbsd32_msgp_t;
344 struct netbsd32_msg {
345 netbsd32_msgp_t msg_next; /* next msg in the chain */
346 netbsd32_long msg_type; /* type of this message */
347 /* >0 -> type of this message */
348 /* 0 -> free header */
349 unsigned short msg_ts; /* size of this message */
350 short msg_spot; /* location of start of msg in buffer */
351 };
352
353 typedef uint32_t netbsd32_msgqnum_t;
354 typedef netbsd32_size_t netbsd32_msglen_t;
355
356 typedef netbsd32_pointer_t netbsd32_msqid_dsp_t;
357 struct netbsd32_msqid_ds {
358 struct netbsd32_ipc_perm msg_perm; /* operation permission strucure */
359 netbsd32_msgqnum_t msg_qnum; /* number of messages in the queue */
360 netbsd32_msglen_t msg_qbytes; /* max # of bytes in the queue */
361 pid_t msg_lspid; /* process ID of last msgsend() */
362 pid_t msg_lrpid; /* process ID of last msgrcv() */
363 netbsd32_time_t msg_stime; /* time of last msgsend() */
364 netbsd32_time_t msg_rtime; /* time of last msgrcv() */
365 netbsd32_time_t msg_ctime; /* time of last change */
366
367 /*
368 * These members are private and used only in the internal
369 * implementation of this interface.
370 */
371 netbsd32_msgp_t _msg_first; /* first message in the queue */
372 netbsd32_msgp_t _msg_last; /* last message in the queue */
373 netbsd32_msglen_t _msg_cbytes; /* # of bytes currently in queue */
374 };
375 typedef netbsd32_pointer_t netbsd32_msqid_ds50p_t;
376 struct netbsd32_msqid_ds50 {
377 struct netbsd32_ipc_perm msg_perm; /* operation permission strucure */
378 netbsd32_msgqnum_t msg_qnum; /* number of messages in the queue */
379 netbsd32_msglen_t msg_qbytes; /* max # of bytes in the queue */
380 pid_t msg_lspid; /* process ID of last msgsend() */
381 pid_t msg_lrpid; /* process ID of last msgrcv() */
382 int32_t msg_stime; /* time of last msgsend() */
383 int32_t msg_rtime; /* time of last msgrcv() */
384 int32_t msg_ctime; /* time of last change */
385
386 /*
387 * These members are private and used only in the internal
388 * implementation of this interface.
389 */
390 netbsd32_msgp_t _msg_first; /* first message in the queue */
391 netbsd32_msgp_t _msg_last; /* last message in the queue */
392 netbsd32_msglen_t _msg_cbytes; /* # of bytes currently in queue */
393 };
394
395 typedef netbsd32_pointer_t netbsd32_msqid_ds14p_t;
396 struct netbsd32_msqid_ds14 {
397 struct netbsd32_ipc_perm14 msg_perm; /* msg queue permission bits */
398 netbsd32_msgp_t msg_first; /* first message in the queue */
399 netbsd32_msgp_t msg_last; /* last message in the queue */
400 netbsd32_u_long msg_cbytes; /* number of bytes in use on the queue */
401 netbsd32_u_long msg_qnum; /* number of msgs in the queue */
402 netbsd32_u_long msg_qbytes; /* max # of bytes on the queue */
403 pid_t msg_lspid; /* pid of last msgsnd() */
404 pid_t msg_lrpid; /* pid of last msgrcv() */
405 int32_t msg_stime; /* time of last msgsnd() */
406 netbsd32_long msg_pad1;
407 int32_t msg_rtime; /* time of last msgrcv() */
408 netbsd32_long msg_pad2;
409 int32_t msg_ctime; /* time of last msgctl() */
410 netbsd32_long msg_pad3;
411 netbsd32_long msg_pad4[4];
412 };
413
414 /* from <sys/sa.h> */
415 typedef netbsd32_pointer_t netbsd32_sa_upcall_t;
416 typedef netbsd32_pointer_t netbsd32_sa_upcallp_t;
417
418 void netbsd32_cpu_upcall(struct lwp *, int, int, int, void *, void *,
419 void *, sa_upcall_t);
420
421 /* from <sys/sem.h> */
422 typedef netbsd32_pointer_t netbsd32_semp_t;
423
424 typedef netbsd32_pointer_t netbsd32_semid_dsp_t;
425 struct netbsd32_semid_ds {
426 struct netbsd32_ipc_perm sem_perm;/* operation permission struct */
427 unsigned short sem_nsems; /* number of sems in set */
428 netbsd32_time_t sem_otime; /* last operation time */
429 netbsd32_time_t sem_ctime; /* last change time */
430
431 /*
432 * These members are private and used only in the internal
433 * implementation of this interface.
434 */
435 netbsd32_semp_t _sem_base; /* pointer to first semaphore in set */
436 };
437
438 typedef netbsd32_pointer_t netbsd32_semid_ds50p_t;
439 struct netbsd32_semid_ds50 {
440 struct netbsd32_ipc_perm sem_perm;/* operation permission struct */
441 unsigned short sem_nsems; /* number of sems in set */
442 int32_t sem_otime; /* last operation time */
443 int32_t sem_ctime; /* last change time */
444
445 /*
446 * These members are private and used only in the internal
447 * implementation of this interface.
448 */
449 netbsd32_semp_t _sem_base; /* pointer to first semaphore in set */
450 };
451
452 typedef netbsd32_pointer_t netbsd32_semid_ds14p_t;
453 struct netbsd32_semid_ds14 {
454 struct netbsd32_ipc_perm14 sem_perm;/* operation permission struct */
455 netbsd32_semp_t sem_base; /* pointer to first semaphore in set */
456 unsigned short sem_nsems; /* number of sems in set */
457 netbsd32_time_t sem_otime; /* last operation time */
458 netbsd32_long sem_pad1; /* SVABI/386 says I need this here */
459 netbsd32_time_t sem_ctime; /* last change time */
460 /* Times measured in secs since */
461 /* 00:00:00 GMT, Jan. 1, 1970 */
462 int32_t sem_pad2; /* SVABI/386 says I need this here */
463 int32_t sem_pad3[4]; /* SVABI/386 says I need this here */
464 };
465
466 typedef uint32_t netbsd32_semunu_t;
467 typedef netbsd32_pointer_t netbsd32_semunp_t;
468 union netbsd32_semun {
469 int val; /* value for SETVAL */
470 netbsd32_semid_dsp_t buf; /* buffer for IPC_STAT & IPC_SET */
471 netbsd32_u_shortp array; /* array for GETALL & SETALL */
472 };
473
474 typedef netbsd32_pointer_t netbsd32_semun50p_t;
475 union netbsd32_semun50 {
476 int val; /* value for SETVAL */
477 netbsd32_semid_ds50p_t buf; /* buffer for IPC_STAT & IPC_SET */
478 netbsd32_u_shortp array; /* array for GETALL & SETALL */
479 };
480
481 typedef netbsd32_pointer_t netbsd32_sembufp_t;
482 struct netbsd32_sembuf {
483 unsigned short sem_num; /* semaphore # */
484 short sem_op; /* semaphore operation */
485 short sem_flg; /* operation flags */
486 };
487
488 /* from <sys/shm.h> */
489 typedef netbsd32_pointer_t netbsd32_shmid_dsp_t;
490 struct netbsd32_shmid_ds {
491 struct netbsd32_ipc_perm shm_perm; /* operation permission structure */
492 netbsd32_size_t shm_segsz; /* size of segment in bytes */
493 pid_t shm_lpid; /* process ID of last shm op */
494 pid_t shm_cpid; /* process ID of creator */
495 shmatt_t shm_nattch; /* number of current attaches */
496 netbsd32_time_t shm_atime; /* time of last shmat() */
497 netbsd32_time_t shm_dtime; /* time of last shmdt() */
498 netbsd32_time_t shm_ctime; /* time of last change by shmctl() */
499 netbsd32_voidp _shm_internal; /* sysv stupidity */
500 };
501
502 typedef netbsd32_pointer_t netbsd32_shmid_ds50p_t;
503 struct netbsd32_shmid_ds50 {
504 struct netbsd32_ipc_perm shm_perm; /* operation permission structure */
505 netbsd32_size_t shm_segsz; /* size of segment in bytes */
506 pid_t shm_lpid; /* process ID of last shm op */
507 pid_t shm_cpid; /* process ID of creator */
508 shmatt_t shm_nattch; /* number of current attaches */
509 int32_t shm_atime; /* time of last shmat() */
510 int32_t shm_dtime; /* time of last shmdt() */
511 int32_t shm_ctime; /* time of last change by shmctl() */
512 netbsd32_voidp _shm_internal; /* sysv stupidity */
513 };
514
515 typedef netbsd32_pointer_t netbsd32_shmid_ds14p_t;
516 struct netbsd32_shmid_ds14 {
517 struct netbsd32_ipc_perm14 shm_perm; /* operation permission structure */
518 int shm_segsz; /* size of segment in bytes */
519 pid_t shm_lpid; /* process ID of last shm op */
520 pid_t shm_cpid; /* process ID of creator */
521 short shm_nattch; /* number of current attaches */
522 int32_t shm_atime; /* time of last shmat() */
523 int32_t shm_dtime; /* time of last shmdt() */
524 int32_t shm_ctime; /* time of last change by shmctl() */
525 netbsd32_voidp _shm_internal; /* sysv stupidity */
526 };
527
528 /* from <sys/signal.h> */
529 typedef netbsd32_pointer_t netbsd32_sigsetp_t;
530 typedef netbsd32_pointer_t netbsd32_sigactionp_t;
531 struct netbsd32_sigaction {
532 netbsd32_voidp netbsd32_sa_handler; /* signal handler */
533 sigset_t netbsd32_sa_mask; /* signal mask to apply */
534 int netbsd32_sa_flags; /* see signal options below */
535 };
536
537 typedef netbsd32_pointer_t netbsd32_sigaltstack13p_t;
538 struct netbsd32_sigaltstack13 {
539 netbsd32_charp ss_sp; /* signal stack base */
540 int ss_size; /* signal stack length */
541 int ss_flags; /* SS_DISABLE and/or SS_ONSTACK */
542 };
543
544 typedef netbsd32_pointer_t netbsd32_sigaltstackp_t;
545 struct netbsd32_sigaltstack {
546 netbsd32_voidp ss_sp; /* signal stack base */
547 netbsd32_size_t ss_size; /* signal stack length */
548 int ss_flags; /* SS_DISABLE and/or SS_ONSTACK */
549 };
550
551 typedef netbsd32_pointer_t netbsd32_sigstackp_t;
552 struct netbsd32_sigstack {
553 netbsd32_voidp ss_sp; /* signal stack pointer */
554 int ss_onstack; /* current status */
555 };
556
557 typedef netbsd32_pointer_t netbsd32_sigvecp_t;
558 struct netbsd32_sigvec {
559 netbsd32_voidp sv_handler; /* signal handler */
560 int sv_mask; /* signal mask to apply */
561 int sv_flags; /* see signal options below */
562 };
563
564 typedef netbsd32_pointer_t netbsd32_siginfop_t;
565
566 union netbsd32_sigval {
567 int sival_int;
568 netbsd32_voidp sival_ptr;
569 };
570
571 typedef netbsd32_pointer_t netbsd32_sigeventp_t;
572 struct netbsd32_sigevent {
573 int sigev_notify;
574 int sigev_signo;
575 union netbsd32_sigval sigev_value;
576 netbsd32_voidp sigev_notify_function;
577 netbsd32_voidp sigev_notify_attributes;
578 };
579
580 /* from <sys/sigtypes.h> */
581 typedef netbsd32_pointer_t netbsd32_stackp_t;
582
583 /* from <sys/socket.h> */
584 typedef netbsd32_pointer_t netbsd32_sockaddrp_t;
585 typedef netbsd32_pointer_t netbsd32_osockaddrp_t;
586
587 typedef netbsd32_pointer_t netbsd32_msghdrp_t;
588 struct netbsd32_msghdr {
589 netbsd32_caddr_t msg_name; /* optional address */
590 unsigned int msg_namelen; /* size of address */
591 netbsd32_iovecp_t msg_iov; /* scatter/gather array */
592 unsigned int msg_iovlen; /* # elements in msg_iov */
593 netbsd32_caddr_t msg_control; /* ancillary data, see below */
594 unsigned int msg_controllen; /* ancillary data buffer len */
595 int msg_flags; /* flags on received message */
596 };
597
598 typedef netbsd32_pointer_t netbsd32_omsghdrp_t;
599 struct netbsd32_omsghdr {
600 netbsd32_caddr_t msg_name; /* optional address */
601 int msg_namelen; /* size of address */
602 netbsd32_iovecp_t msg_iov; /* scatter/gather array */
603 int msg_iovlen; /* # elements in msg_iov */
604 netbsd32_caddr_t msg_accrights; /* access rights sent/recvd */
605 int msg_accrightslen;
606 };
607
608 /* from <sys/stat.h> */
609 typedef netbsd32_pointer_t netbsd32_stat12p_t;
610 struct netbsd32_stat12 { /* NetBSD-1.2 stat struct */
611 uint32_t st_dev; /* inode's device */
612 uint32_t st_ino; /* inode's number */
613 uint16_t st_mode; /* inode protection mode */
614 uint16_t st_nlink; /* number of hard links */
615 uid_t st_uid; /* user ID of the file's owner */
616 gid_t st_gid; /* group ID of the file's group */
617 uint32_t st_rdev; /* device type */
618 struct netbsd32_timespec st_atimespec;/* time of last access */
619 struct netbsd32_timespec st_mtimespec;/* time of last data modification */
620 struct netbsd32_timespec st_ctimespec;/* time of last file status change */
621 netbsd32_int64 st_size; /* file size, in bytes */
622 netbsd32_int64 st_blocks; /* blocks allocated for file */
623 uint32_t st_blksize; /* optimal blocksize for I/O */
624 uint32_t st_flags; /* user defined flags for file */
625 uint32_t st_gen; /* file generation number */
626 int32_t st_lspare;
627 netbsd32_int64 st_qspare[2];
628 };
629
630 typedef netbsd32_pointer_t netbsd32_stat43p_t;
631 struct netbsd32_stat43 { /* BSD-4.3 stat struct */
632 uint16_t st_dev; /* inode's device */
633 uint32_t st_ino; /* inode's number */
634 uint16_t st_mode; /* inode protection mode */
635 uint16_t st_nlink; /* number of hard links */
636 uint16_t st_uid; /* user ID of the file's owner */
637 uint16_t st_gid; /* group ID of the file's group */
638 uint16_t st_rdev; /* device type */
639 int32_t st_size; /* file size, in bytes */
640 struct netbsd32_timespec st_atimespec;/* time of last access */
641 struct netbsd32_timespec st_mtimespec;/* time of last data modification */
642 struct netbsd32_timespec st_ctimespec;/* time of last file status change */
643 int32_t st_blksize; /* optimal blocksize for I/O */
644 int32_t st_blocks; /* blocks allocated for file */
645 uint32_t st_flags; /* user defined flags for file */
646 uint32_t st_gen; /* file generation number */
647 };
648 typedef netbsd32_pointer_t netbsd32_stat13p_t;
649 struct netbsd32_stat13 {
650 uint32_t st_dev; /* inode's device */
651 uint32_t st_ino; /* inode's number */
652 mode_t st_mode; /* inode protection mode */
653 nlink_t st_nlink; /* number of hard links */
654 uid_t st_uid; /* user ID of the file's owner */
655 gid_t st_gid; /* group ID of the file's group */
656 uint32_t st_rdev; /* device type */
657 struct netbsd32_timespec st_atimespec;/* time of last access */
658 struct netbsd32_timespec st_mtimespec;/* time of last data modification */
659 struct netbsd32_timespec st_ctimespec;/* time of last file status change */
660 netbsd32_int64 st_size; /* file size, in bytes */
661 netbsd32_uint64 st_blocks; /* blocks allocated for file */
662 blksize_t st_blksize; /* optimal blocksize for I/O */
663 uint32_t st_flags; /* user defined flags for file */
664 uint32_t st_gen; /* file generation number */
665 uint32_t st_spare; /* file generation number */
666 struct netbsd32_timespec st_birthtimespec;
667 uint32_t st_spare2;
668 };
669
670 typedef netbsd32_pointer_t netbsd32_stat50p_t;
671 struct netbsd32_stat50 {
672 uint32_t st_dev; /* inode's device */
673 mode_t st_mode; /* inode protection mode */
674 netbsd32_uint64 st_ino; /* inode's number */
675 nlink_t st_nlink; /* number of hard links */
676 uid_t st_uid; /* user ID of the file's owner */
677 gid_t st_gid; /* group ID of the file's group */
678 uint32_t st_rdev; /* device type */
679 struct netbsd32_timespec50 st_atimespec;/* time of last access */
680 struct netbsd32_timespec50 st_mtimespec;/* time of last data modification */
681 struct netbsd32_timespec50 st_ctimespec;/* time of last file status change */
682 struct netbsd32_timespec50 st_birthtimespec; /* time of creation */
683 netbsd32_int64 st_size; /* file size, in bytes */
684 netbsd32_uint64 st_blocks; /* blocks allocated for file */
685 blksize_t st_blksize; /* optimal blocksize for I/O */
686 uint32_t st_flags; /* user defined flags for file */
687 uint32_t st_gen; /* file generation number */
688 uint32_t st_spare[2];
689 };
690
691 typedef netbsd32_pointer_t netbsd32_statp_t;
692 struct netbsd32_stat {
693 netbsd32_dev_t st_dev; /* inode's device */
694 mode_t st_mode; /* inode protection mode */
695 netbsd32_uint64 st_ino; /* inode's number */
696 nlink_t st_nlink; /* number of hard links */
697 uid_t st_uid; /* user ID of the file's owner */
698 gid_t st_gid; /* group ID of the file's group */
699 netbsd32_dev_t st_rdev; /* device type */
700 struct netbsd32_timespec st_atimespec;/* time of last access */
701 struct netbsd32_timespec st_mtimespec;/* time of last data modification */
702 struct netbsd32_timespec st_ctimespec;/* time of last file status change */
703 struct netbsd32_timespec st_birthtimespec; /* time of creation */
704 netbsd32_int64 st_size; /* file size, in bytes */
705 netbsd32_uint64 st_blocks; /* blocks allocated for file */
706 blksize_t st_blksize; /* optimal blocksize for I/O */
707 uint32_t st_flags; /* user defined flags for file */
708 uint32_t st_gen; /* file generation number */
709 uint32_t st_spare[2];
710 };
711
712 /* from <sys/statvfs.h> */
713 typedef netbsd32_pointer_t netbsd32_statvfsp_t;
714 struct netbsd32_statvfs {
715 netbsd32_u_long f_flag; /* copy of mount exported flags */
716 netbsd32_u_long f_bsize; /* system block size */
717 netbsd32_u_long f_frsize; /* system fragment size */
718 netbsd32_u_long f_iosize; /* optimal file system block size */
719 netbsd32_uint64 f_blocks; /* number of blocks in file system */
720 netbsd32_uint64 f_bfree; /* free blocks avail in file system */
721 netbsd32_uint64 f_bavail; /* free blocks avail to non-root */
722 netbsd32_uint64 f_bresvd; /* blocks reserved for root */
723 netbsd32_uint64 f_files; /* total file nodes in file system */
724 netbsd32_uint64 f_ffree; /* free file nodes in file system */
725 netbsd32_uint64 f_favail; /* free file nodes avail to non-root */
726 netbsd32_uint64 f_fresvd; /* file nodes reserved for root */
727 netbsd32_uint64 f_syncreads; /* count of sync reads since mount */
728 netbsd32_uint64 f_syncwrites; /* count of sync writes since mount */
729 netbsd32_uint64 f_asyncreads; /* count of async reads since mount */
730 netbsd32_uint64 f_asyncwrites; /* count of async writes since mount */
731 fsid_t f_fsidx; /* NetBSD compatible fsid */
732 netbsd32_u_long f_fsid; /* Posix compatible fsid */
733 netbsd32_u_long f_namemax; /* maximum filename length */
734 uid_t f_owner; /* user that mounted the file system */
735 uint32_t f_spare[4]; /* spare space */
736 char f_fstypename[_VFS_NAMELEN]; /* fs type name */
737 char f_mntonname[_VFS_MNAMELEN]; /* directory on which mounted */
738 char f_mntfromname[_VFS_MNAMELEN]; /* mounted file system */
739 };
740
741 /* from <sys/timex.h> */
742 typedef netbsd32_pointer_t netbsd32_ntptimevalp_t;
743 typedef netbsd32_pointer_t netbsd32_ntptimeval30p_t;
744 typedef netbsd32_pointer_t netbsd32_ntptimeval50p_t;
745
746 struct netbsd32_ntptimeval30 {
747 struct netbsd32_timeval50 time; /* current time (ro) */
748 netbsd32_long maxerror; /* maximum error (us) (ro) */
749 netbsd32_long esterror; /* estimated error (us) (ro) */
750 };
751 struct netbsd32_ntptimeval50 {
752 struct netbsd32_timespec50 time; /* current time (ro) */
753 netbsd32_long maxerror; /* maximum error (us) (ro) */
754 netbsd32_long esterror; /* estimated error (us) (ro) */
755 netbsd32_long tai; /* TAI offset */
756 int time_state; /* time status */
757 };
758
759 struct netbsd32_ntptimeval {
760 struct netbsd32_timespec time; /* current time (ro) */
761 netbsd32_long maxerror; /* maximum error (us) (ro) */
762 netbsd32_long esterror; /* estimated error (us) (ro) */
763 netbsd32_long tai; /* TAI offset */
764 int time_state; /* time status */
765 };
766 typedef netbsd32_pointer_t netbsd32_timexp_t;
767 struct netbsd32_timex {
768 unsigned int modes; /* clock mode bits (wo) */
769 netbsd32_long offset; /* time offset (us) (rw) */
770 netbsd32_long freq; /* frequency offset (scaled ppm) (rw) */
771 netbsd32_long maxerror; /* maximum error (us) (rw) */
772 netbsd32_long esterror; /* estimated error (us) (rw) */
773 int status; /* clock status bits (rw) */
774 netbsd32_long constant; /* pll time constant (rw) */
775 netbsd32_long precision; /* clock precision (us) (ro) */
776 netbsd32_long tolerance; /* clock frequency tolerance (scaled
777 * ppm) (ro) */
778 /*
779 * The following read-only structure members are implemented
780 * only if the PPS signal discipline is configured in the
781 * kernel.
782 */
783 netbsd32_long ppsfreq; /* pps frequency (scaled ppm) (ro) */
784 netbsd32_long jitter; /* pps jitter (us) (ro) */
785 int shift; /* interval duration (s) (shift) (ro) */
786 netbsd32_long stabil; /* pps stability (scaled ppm) (ro) */
787 netbsd32_long jitcnt; /* jitter limit exceeded (ro) */
788 netbsd32_long calcnt; /* calibration intervals (ro) */
789 netbsd32_long errcnt; /* calibration errors (ro) */
790 netbsd32_long stbcnt; /* stability limit exceeded (ro) */
791 };
792
793 /* <prop/plistref.h> */
794 struct netbsd32_plistref {
795 netbsd32_pointer_t pref_plist;
796 netbsd32_size_t pref_len;
797 };
798
799 /* from <ufs/lfs/lfs.h> */
800 typedef netbsd32_pointer_t netbsd32_block_infop_t; /* XXX broken */
801
802 /* from <sys/utsname.h> */
803 typedef netbsd32_pointer_t netbsd32_utsnamep_t;
804
805 /* from <compat/common/kern_info_09.c> */
806 typedef netbsd32_pointer_t netbsd32_outsnamep_t;
807
808 /* from <arch/sparc{,64}/include/vuid_event.h> */
809 typedef struct firm_event32 {
810 unsigned short id; /* key or MS_* or LOC_[XY]_DELTA */
811 unsigned short pad; /* unused, at least by X11 */
812 int value; /* VKEY_{UP,DOWN} or locator delta */
813 struct netbsd32_timeval time;
814 } Firm_event32;
815
816 /* from <sys/uuid.h> */
817 typedef netbsd32_pointer_t netbsd32_uuidp_t;
818
819 /* from <sys/event.h> */
820 typedef netbsd32_pointer_t netbsd32_keventp_t;
821
822 struct netbsd32_kevent {
823 netbsd32_uintptr_t ident;
824 uint32_t filter;
825 uint32_t flags;
826 uint32_t fflags;
827 netbsd32_int64 data;
828 netbsd32_intptr_t udata;
829 };
830
831 /* from <sys/sched.h> */
832 typedef netbsd32_pointer_t netbsd32_sched_paramp_t;
833 typedef netbsd32_pointer_t netbsd32_cpusetp_t;
834
835 /* from <fs/cd9660/cd9660_mount.h> */
836 struct netbsd32_iso_args {
837 netbsd32_charp fspec;
838 struct export_args30 _pad1;
839 int flags;
840 };
841
842 /* from <ufs/ufs/ufs_mount.h> */
843 struct netbsd32_ufs_args {
844 netbsd32_charp fspec;
845 };
846
847 struct netbsd32_mfs_args {
848 netbsd32_charp fspec;
849 struct netbsd32_export_args30 _pad1;
850 netbsd32_voidp base;
851 netbsd32_u_long size;
852 };
853
854 /* from <nfs/nfsmount,h> */
855 struct netbsd32_nfs_args {
856 int32_t version; /* args structure version number */
857 netbsd32_sockaddrp_t addr; /* file server address */
858 int32_t addrlen; /* length of address */
859 int32_t sotype; /* Socket type */
860 int32_t proto; /* and Protocol */
861 netbsd32_u_charp fh; /* File handle to be mounted */
862 int32_t fhsize; /* Size, in bytes, of fh */
863 int32_t flags; /* flags */
864 int32_t wsize; /* write size in bytes */
865 int32_t rsize; /* read size in bytes */
866 int32_t readdirsize; /* readdir size in bytes */
867 int32_t timeo; /* initial timeout in .1 secs */
868 int32_t retrans; /* times to retry send */
869 int32_t maxgrouplist; /* Max. size of group list */
870 int32_t readahead; /* # of blocks to readahead */
871 int32_t leaseterm; /* Ignored; Term (sec) of lease */
872 int32_t deadthresh; /* Retrans threshold */
873 netbsd32_charp hostname; /* server's name */
874 };
875
876 #if 0
877 int netbsd32_kevent(struct lwp *, void *, register_t *);
878 #endif
879
880 /*
881 * here are some macros to convert between netbsd32 and sparc64 types.
882 * note that they do *NOT* act like good macros and put ()'s around all
883 * arguments cuz this _breaks_ SCARG().
884 */
885 #define NETBSD32TO64(s32uap, uap, name) \
886 SCARG(uap, name) = SCARG(s32uap, name)
887 #define NETBSD32TOP(s32uap, uap, name, type) \
888 SCARG(uap, name) = SCARG_P32(s32uap, name)
889 #define NETBSD32TOX(s32uap, uap, name, type) \
890 SCARG(uap, name) = (type)SCARG(s32uap, name)
891 #define NETBSD32TOX64(s32uap, uap, name, type) \
892 SCARG(uap, name) = (type)(long)SCARG(s32uap, name)
893
894 /* and some standard versions */
895 #define NETBSD32TO64_UAP(name) NETBSD32TO64(uap, &ua, name)
896 #define NETBSD32TOP_UAP(name, type) NETBSD32TOP(uap, &ua, name, type)
897 #define NETBSD32TOX_UAP(name, type) NETBSD32TOX(uap, &ua, name, type)
898 #define NETBSD32TOX64_UAP(name, type) NETBSD32TOX64(uap, &ua, name, type)
899
900 #define SCARG_P32(uap, name) NETBSD32PTR64(SCARG(uap, name))
901
902 int coredump_netbsd32(struct lwp *, void *);
903
904 /*
905 * random other stuff
906 */
907 #include <compat/common/compat_util.h>
908 #include <compat/sys/siginfo.h>
909
910 vaddr_t netbsd32_vm_default_addr(struct proc *, vaddr_t, vsize_t);
911 void netbsd32_adjust_limits(struct proc *);
912
913 void netbsd32_si_to_si32(siginfo32_t *, const siginfo_t *);
914 void netbsd32_si32_to_si(siginfo_t *, const siginfo32_t *);
915
916 void startlwp32(void *);
917 struct compat_50_netbsd32___semctl14_args;
918 int do_netbsd32___semctl14(struct lwp *, const struct compat_50_netbsd32___semctl14_args *, register_t *, void *);
919
920 struct iovec *netbsd32_get_iov(struct netbsd32_iovec *, int, struct iovec *,
921 int);
922
923 #ifdef SYSCTL_SETUP_PROTO
924 SYSCTL_SETUP_PROTO(netbsd32_sysctl_emul_setup);
925 #endif /* SYSCTL_SETUP_PROTO */
926 #endif /* _COMPAT_NETBSD32_NETBSD32_H_ */
927