xref: /openbmc/qemu/linux-user/syscall.c (revision f7680a55)
1 /*
2  *  Linux syscalls
3  *
4  *  Copyright (c) 2003 Fabrice Bellard
5  *
6  *  This program is free software; you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation; either version 2 of the License, or
9  *  (at your option) any later version.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this program; if not, see <http://www.gnu.org/licenses/>.
18  */
19 #define _ATFILE_SOURCE
20 #include <stdlib.h>
21 #include <stdio.h>
22 #include <stdarg.h>
23 #include <string.h>
24 #include <elf.h>
25 #include <endian.h>
26 #include <errno.h>
27 #include <unistd.h>
28 #include <fcntl.h>
29 #include <time.h>
30 #include <limits.h>
31 #include <sys/types.h>
32 #include <sys/ipc.h>
33 #include <sys/msg.h>
34 #include <sys/wait.h>
35 #include <sys/time.h>
36 #include <sys/stat.h>
37 #include <sys/mount.h>
38 #include <sys/prctl.h>
39 #include <sys/resource.h>
40 #include <sys/mman.h>
41 #include <sys/swap.h>
42 #include <signal.h>
43 #include <sched.h>
44 #include <sys/socket.h>
45 #include <sys/un.h>
46 #include <sys/uio.h>
47 #include <sys/poll.h>
48 #include <sys/times.h>
49 #include <sys/shm.h>
50 #include <sys/sem.h>
51 #include <sys/statfs.h>
52 #include <utime.h>
53 #include <sys/sysinfo.h>
54 #include <sys/utsname.h>
55 //#include <sys/user.h>
56 #include <netinet/ip.h>
57 #include <netinet/tcp.h>
58 #include <qemu-common.h>
59 #ifdef TARGET_GPROF
60 #include <sys/gmon.h>
61 #endif
62 #ifdef CONFIG_EVENTFD
63 #include <sys/eventfd.h>
64 #endif
65 
66 #define termios host_termios
67 #define winsize host_winsize
68 #define termio host_termio
69 #define sgttyb host_sgttyb /* same as target */
70 #define tchars host_tchars /* same as target */
71 #define ltchars host_ltchars /* same as target */
72 
73 #include <linux/termios.h>
74 #include <linux/unistd.h>
75 #include <linux/utsname.h>
76 #include <linux/cdrom.h>
77 #include <linux/hdreg.h>
78 #include <linux/soundcard.h>
79 #include <linux/kd.h>
80 #include <linux/mtio.h>
81 #include <linux/fs.h>
82 #include <linux/fb.h>
83 #include <linux/vt.h>
84 #include "linux_loop.h"
85 
86 #include "qemu.h"
87 #include "qemu-common.h"
88 
89 #if defined(CONFIG_USE_NPTL)
90 #define CLONE_NPTL_FLAGS2 (CLONE_SETTLS | \
91     CLONE_PARENT_SETTID | CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID)
92 #else
93 /* XXX: Hardcode the above values.  */
94 #define CLONE_NPTL_FLAGS2 0
95 #endif
96 
97 //#define DEBUG
98 
99 //#include <linux/msdos_fs.h>
100 #define	VFAT_IOCTL_READDIR_BOTH		_IOR('r', 1, struct linux_dirent [2])
101 #define	VFAT_IOCTL_READDIR_SHORT	_IOR('r', 2, struct linux_dirent [2])
102 
103 
104 #undef _syscall0
105 #undef _syscall1
106 #undef _syscall2
107 #undef _syscall3
108 #undef _syscall4
109 #undef _syscall5
110 #undef _syscall6
111 
112 #define _syscall0(type,name)		\
113 static type name (void)			\
114 {					\
115 	return syscall(__NR_##name);	\
116 }
117 
118 #define _syscall1(type,name,type1,arg1)		\
119 static type name (type1 arg1)			\
120 {						\
121 	return syscall(__NR_##name, arg1);	\
122 }
123 
124 #define _syscall2(type,name,type1,arg1,type2,arg2)	\
125 static type name (type1 arg1,type2 arg2)		\
126 {							\
127 	return syscall(__NR_##name, arg1, arg2);	\
128 }
129 
130 #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3)	\
131 static type name (type1 arg1,type2 arg2,type3 arg3)		\
132 {								\
133 	return syscall(__NR_##name, arg1, arg2, arg3);		\
134 }
135 
136 #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4)	\
137 static type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4)			\
138 {										\
139 	return syscall(__NR_##name, arg1, arg2, arg3, arg4);			\
140 }
141 
142 #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,	\
143 		  type5,arg5)							\
144 static type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5)	\
145 {										\
146 	return syscall(__NR_##name, arg1, arg2, arg3, arg4, arg5);		\
147 }
148 
149 
150 #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,	\
151 		  type5,arg5,type6,arg6)					\
152 static type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5,	\
153                   type6 arg6)							\
154 {										\
155 	return syscall(__NR_##name, arg1, arg2, arg3, arg4, arg5, arg6);	\
156 }
157 
158 
159 #define __NR_sys_uname __NR_uname
160 #define __NR_sys_faccessat __NR_faccessat
161 #define __NR_sys_fchmodat __NR_fchmodat
162 #define __NR_sys_fchownat __NR_fchownat
163 #define __NR_sys_fstatat64 __NR_fstatat64
164 #define __NR_sys_futimesat __NR_futimesat
165 #define __NR_sys_getcwd1 __NR_getcwd
166 #define __NR_sys_getdents __NR_getdents
167 #define __NR_sys_getdents64 __NR_getdents64
168 #define __NR_sys_getpriority __NR_getpriority
169 #define __NR_sys_linkat __NR_linkat
170 #define __NR_sys_mkdirat __NR_mkdirat
171 #define __NR_sys_mknodat __NR_mknodat
172 #define __NR_sys_newfstatat __NR_newfstatat
173 #define __NR_sys_openat __NR_openat
174 #define __NR_sys_readlinkat __NR_readlinkat
175 #define __NR_sys_renameat __NR_renameat
176 #define __NR_sys_rt_sigqueueinfo __NR_rt_sigqueueinfo
177 #define __NR_sys_symlinkat __NR_symlinkat
178 #define __NR_sys_syslog __NR_syslog
179 #define __NR_sys_tgkill __NR_tgkill
180 #define __NR_sys_tkill __NR_tkill
181 #define __NR_sys_unlinkat __NR_unlinkat
182 #define __NR_sys_utimensat __NR_utimensat
183 #define __NR_sys_futex __NR_futex
184 #define __NR_sys_inotify_init __NR_inotify_init
185 #define __NR_sys_inotify_add_watch __NR_inotify_add_watch
186 #define __NR_sys_inotify_rm_watch __NR_inotify_rm_watch
187 
188 #if defined(__alpha__) || defined (__ia64__) || defined(__x86_64__)
189 #define __NR__llseek __NR_lseek
190 #endif
191 
192 #ifdef __NR_gettid
193 _syscall0(int, gettid)
194 #else
195 /* This is a replacement for the host gettid() and must return a host
196    errno. */
197 static int gettid(void) {
198     return -ENOSYS;
199 }
200 #endif
201 _syscall3(int, sys_getdents, uint, fd, struct linux_dirent *, dirp, uint, count);
202 #if defined(TARGET_NR_getdents64) && defined(__NR_getdents64)
203 _syscall3(int, sys_getdents64, uint, fd, struct linux_dirent64 *, dirp, uint, count);
204 #endif
205 _syscall2(int, sys_getpriority, int, which, int, who);
206 #if defined(TARGET_NR__llseek) && !defined (__x86_64__)
207 _syscall5(int, _llseek,  uint,  fd, ulong, hi, ulong, lo,
208           loff_t *, res, uint, wh);
209 #endif
210 _syscall3(int,sys_rt_sigqueueinfo,int,pid,int,sig,siginfo_t *,uinfo)
211 _syscall3(int,sys_syslog,int,type,char*,bufp,int,len)
212 #if defined(TARGET_NR_tgkill) && defined(__NR_tgkill)
213 _syscall3(int,sys_tgkill,int,tgid,int,pid,int,sig)
214 #endif
215 #if defined(TARGET_NR_tkill) && defined(__NR_tkill)
216 _syscall2(int,sys_tkill,int,tid,int,sig)
217 #endif
218 #ifdef __NR_exit_group
219 _syscall1(int,exit_group,int,error_code)
220 #endif
221 #if defined(TARGET_NR_set_tid_address) && defined(__NR_set_tid_address)
222 _syscall1(int,set_tid_address,int *,tidptr)
223 #endif
224 #if defined(CONFIG_USE_NPTL)
225 #if defined(TARGET_NR_futex) && defined(__NR_futex)
226 _syscall6(int,sys_futex,int *,uaddr,int,op,int,val,
227           const struct timespec *,timeout,int *,uaddr2,int,val3)
228 #endif
229 #endif
230 
231 static bitmask_transtbl fcntl_flags_tbl[] = {
232   { TARGET_O_ACCMODE,   TARGET_O_WRONLY,    O_ACCMODE,   O_WRONLY,    },
233   { TARGET_O_ACCMODE,   TARGET_O_RDWR,      O_ACCMODE,   O_RDWR,      },
234   { TARGET_O_CREAT,     TARGET_O_CREAT,     O_CREAT,     O_CREAT,     },
235   { TARGET_O_EXCL,      TARGET_O_EXCL,      O_EXCL,      O_EXCL,      },
236   { TARGET_O_NOCTTY,    TARGET_O_NOCTTY,    O_NOCTTY,    O_NOCTTY,    },
237   { TARGET_O_TRUNC,     TARGET_O_TRUNC,     O_TRUNC,     O_TRUNC,     },
238   { TARGET_O_APPEND,    TARGET_O_APPEND,    O_APPEND,    O_APPEND,    },
239   { TARGET_O_NONBLOCK,  TARGET_O_NONBLOCK,  O_NONBLOCK,  O_NONBLOCK,  },
240   { TARGET_O_SYNC,      TARGET_O_SYNC,      O_SYNC,      O_SYNC,      },
241   { TARGET_FASYNC,      TARGET_FASYNC,      FASYNC,      FASYNC,      },
242   { TARGET_O_DIRECTORY, TARGET_O_DIRECTORY, O_DIRECTORY, O_DIRECTORY, },
243   { TARGET_O_NOFOLLOW,  TARGET_O_NOFOLLOW,  O_NOFOLLOW,  O_NOFOLLOW,  },
244   { TARGET_O_LARGEFILE, TARGET_O_LARGEFILE, O_LARGEFILE, O_LARGEFILE, },
245 #if defined(O_DIRECT)
246   { TARGET_O_DIRECT,    TARGET_O_DIRECT,    O_DIRECT,    O_DIRECT,    },
247 #endif
248   { 0, 0, 0, 0 }
249 };
250 
251 #define COPY_UTSNAME_FIELD(dest, src) \
252   do { \
253       /* __NEW_UTS_LEN doesn't include terminating null */ \
254       (void) strncpy((dest), (src), __NEW_UTS_LEN); \
255       (dest)[__NEW_UTS_LEN] = '\0'; \
256   } while (0)
257 
258 static int sys_uname(struct new_utsname *buf)
259 {
260   struct utsname uts_buf;
261 
262   if (uname(&uts_buf) < 0)
263       return (-1);
264 
265   /*
266    * Just in case these have some differences, we
267    * translate utsname to new_utsname (which is the
268    * struct linux kernel uses).
269    */
270 
271   bzero(buf, sizeof (*buf));
272   COPY_UTSNAME_FIELD(buf->sysname, uts_buf.sysname);
273   COPY_UTSNAME_FIELD(buf->nodename, uts_buf.nodename);
274   COPY_UTSNAME_FIELD(buf->release, uts_buf.release);
275   COPY_UTSNAME_FIELD(buf->version, uts_buf.version);
276   COPY_UTSNAME_FIELD(buf->machine, uts_buf.machine);
277 #ifdef _GNU_SOURCE
278   COPY_UTSNAME_FIELD(buf->domainname, uts_buf.domainname);
279 #endif
280   return (0);
281 
282 #undef COPY_UTSNAME_FIELD
283 }
284 
285 static int sys_getcwd1(char *buf, size_t size)
286 {
287   if (getcwd(buf, size) == NULL) {
288       /* getcwd() sets errno */
289       return (-1);
290   }
291   return strlen(buf)+1;
292 }
293 
294 #ifdef CONFIG_ATFILE
295 /*
296  * Host system seems to have atfile syscall stubs available.  We
297  * now enable them one by one as specified by target syscall_nr.h.
298  */
299 
300 #ifdef TARGET_NR_faccessat
301 static int sys_faccessat(int dirfd, const char *pathname, int mode)
302 {
303   return (faccessat(dirfd, pathname, mode, 0));
304 }
305 #endif
306 #ifdef TARGET_NR_fchmodat
307 static int sys_fchmodat(int dirfd, const char *pathname, mode_t mode)
308 {
309   return (fchmodat(dirfd, pathname, mode, 0));
310 }
311 #endif
312 #if defined(TARGET_NR_fchownat) && defined(USE_UID16)
313 static int sys_fchownat(int dirfd, const char *pathname, uid_t owner,
314     gid_t group, int flags)
315 {
316   return (fchownat(dirfd, pathname, owner, group, flags));
317 }
318 #endif
319 #ifdef __NR_fstatat64
320 static int sys_fstatat64(int dirfd, const char *pathname, struct stat *buf,
321     int flags)
322 {
323   return (fstatat(dirfd, pathname, buf, flags));
324 }
325 #endif
326 #ifdef __NR_newfstatat
327 static int sys_newfstatat(int dirfd, const char *pathname, struct stat *buf,
328     int flags)
329 {
330   return (fstatat(dirfd, pathname, buf, flags));
331 }
332 #endif
333 #ifdef TARGET_NR_futimesat
334 static int sys_futimesat(int dirfd, const char *pathname,
335     const struct timeval times[2])
336 {
337   return (futimesat(dirfd, pathname, times));
338 }
339 #endif
340 #ifdef TARGET_NR_linkat
341 static int sys_linkat(int olddirfd, const char *oldpath,
342     int newdirfd, const char *newpath, int flags)
343 {
344   return (linkat(olddirfd, oldpath, newdirfd, newpath, flags));
345 }
346 #endif
347 #ifdef TARGET_NR_mkdirat
348 static int sys_mkdirat(int dirfd, const char *pathname, mode_t mode)
349 {
350   return (mkdirat(dirfd, pathname, mode));
351 }
352 #endif
353 #ifdef TARGET_NR_mknodat
354 static int sys_mknodat(int dirfd, const char *pathname, mode_t mode,
355     dev_t dev)
356 {
357   return (mknodat(dirfd, pathname, mode, dev));
358 }
359 #endif
360 #ifdef TARGET_NR_openat
361 static int sys_openat(int dirfd, const char *pathname, int flags, ...)
362 {
363   /*
364    * open(2) has extra parameter 'mode' when called with
365    * flag O_CREAT.
366    */
367   if ((flags & O_CREAT) != 0) {
368       va_list ap;
369       mode_t mode;
370 
371       /*
372        * Get the 'mode' parameter and translate it to
373        * host bits.
374        */
375       va_start(ap, flags);
376       mode = va_arg(ap, mode_t);
377       mode = target_to_host_bitmask(mode, fcntl_flags_tbl);
378       va_end(ap);
379 
380       return (openat(dirfd, pathname, flags, mode));
381   }
382   return (openat(dirfd, pathname, flags));
383 }
384 #endif
385 #ifdef TARGET_NR_readlinkat
386 static int sys_readlinkat(int dirfd, const char *pathname, char *buf, size_t bufsiz)
387 {
388   return (readlinkat(dirfd, pathname, buf, bufsiz));
389 }
390 #endif
391 #ifdef TARGET_NR_renameat
392 static int sys_renameat(int olddirfd, const char *oldpath,
393     int newdirfd, const char *newpath)
394 {
395   return (renameat(olddirfd, oldpath, newdirfd, newpath));
396 }
397 #endif
398 #ifdef TARGET_NR_symlinkat
399 static int sys_symlinkat(const char *oldpath, int newdirfd, const char *newpath)
400 {
401   return (symlinkat(oldpath, newdirfd, newpath));
402 }
403 #endif
404 #ifdef TARGET_NR_unlinkat
405 static int sys_unlinkat(int dirfd, const char *pathname, int flags)
406 {
407   return (unlinkat(dirfd, pathname, flags));
408 }
409 #endif
410 #else /* !CONFIG_ATFILE */
411 
412 /*
413  * Try direct syscalls instead
414  */
415 #if defined(TARGET_NR_faccessat) && defined(__NR_faccessat)
416 _syscall3(int,sys_faccessat,int,dirfd,const char *,pathname,int,mode)
417 #endif
418 #if defined(TARGET_NR_fchmodat) && defined(__NR_fchmodat)
419 _syscall3(int,sys_fchmodat,int,dirfd,const char *,pathname, mode_t,mode)
420 #endif
421 #if defined(TARGET_NR_fchownat) && defined(__NR_fchownat) && defined(USE_UID16)
422 _syscall5(int,sys_fchownat,int,dirfd,const char *,pathname,
423           uid_t,owner,gid_t,group,int,flags)
424 #endif
425 #if (defined(TARGET_NR_fstatat64) || defined(TARGET_NR_newfstatat)) && \
426         defined(__NR_fstatat64)
427 _syscall4(int,sys_fstatat64,int,dirfd,const char *,pathname,
428           struct stat *,buf,int,flags)
429 #endif
430 #if defined(TARGET_NR_futimesat) && defined(__NR_futimesat)
431 _syscall3(int,sys_futimesat,int,dirfd,const char *,pathname,
432          const struct timeval *,times)
433 #endif
434 #if (defined(TARGET_NR_newfstatat) || defined(TARGET_NR_fstatat64) ) && \
435         defined(__NR_newfstatat)
436 _syscall4(int,sys_newfstatat,int,dirfd,const char *,pathname,
437           struct stat *,buf,int,flags)
438 #endif
439 #if defined(TARGET_NR_linkat) && defined(__NR_linkat)
440 _syscall5(int,sys_linkat,int,olddirfd,const char *,oldpath,
441       int,newdirfd,const char *,newpath,int,flags)
442 #endif
443 #if defined(TARGET_NR_mkdirat) && defined(__NR_mkdirat)
444 _syscall3(int,sys_mkdirat,int,dirfd,const char *,pathname,mode_t,mode)
445 #endif
446 #if defined(TARGET_NR_mknodat) && defined(__NR_mknodat)
447 _syscall4(int,sys_mknodat,int,dirfd,const char *,pathname,
448           mode_t,mode,dev_t,dev)
449 #endif
450 #if defined(TARGET_NR_openat) && defined(__NR_openat)
451 _syscall4(int,sys_openat,int,dirfd,const char *,pathname,int,flags,mode_t,mode)
452 #endif
453 #if defined(TARGET_NR_readlinkat) && defined(__NR_readlinkat)
454 _syscall4(int,sys_readlinkat,int,dirfd,const char *,pathname,
455           char *,buf,size_t,bufsize)
456 #endif
457 #if defined(TARGET_NR_renameat) && defined(__NR_renameat)
458 _syscall4(int,sys_renameat,int,olddirfd,const char *,oldpath,
459           int,newdirfd,const char *,newpath)
460 #endif
461 #if defined(TARGET_NR_symlinkat) && defined(__NR_symlinkat)
462 _syscall3(int,sys_symlinkat,const char *,oldpath,
463           int,newdirfd,const char *,newpath)
464 #endif
465 #if defined(TARGET_NR_unlinkat) && defined(__NR_unlinkat)
466 _syscall3(int,sys_unlinkat,int,dirfd,const char *,pathname,int,flags)
467 #endif
468 
469 #endif /* CONFIG_ATFILE */
470 
471 #ifdef CONFIG_UTIMENSAT
472 static int sys_utimensat(int dirfd, const char *pathname,
473     const struct timespec times[2], int flags)
474 {
475     if (pathname == NULL)
476         return futimens(dirfd, times);
477     else
478         return utimensat(dirfd, pathname, times, flags);
479 }
480 #else
481 #if defined(TARGET_NR_utimensat) && defined(__NR_utimensat)
482 _syscall4(int,sys_utimensat,int,dirfd,const char *,pathname,
483           const struct timespec *,tsp,int,flags)
484 #endif
485 #endif /* CONFIG_UTIMENSAT  */
486 
487 #ifdef CONFIG_INOTIFY
488 #include <sys/inotify.h>
489 
490 #if defined(TARGET_NR_inotify_init) && defined(__NR_inotify_init)
491 static int sys_inotify_init(void)
492 {
493   return (inotify_init());
494 }
495 #endif
496 #if defined(TARGET_NR_inotify_add_watch) && defined(__NR_inotify_add_watch)
497 static int sys_inotify_add_watch(int fd,const char *pathname, int32_t mask)
498 {
499   return (inotify_add_watch(fd, pathname, mask));
500 }
501 #endif
502 #if defined(TARGET_NR_inotify_rm_watch) && defined(__NR_inotify_rm_watch)
503 static int sys_inotify_rm_watch(int fd, int32_t wd)
504 {
505   return (inotify_rm_watch(fd, wd));
506 }
507 #endif
508 #else
509 /* Userspace can usually survive runtime without inotify */
510 #undef TARGET_NR_inotify_init
511 #undef TARGET_NR_inotify_add_watch
512 #undef TARGET_NR_inotify_rm_watch
513 #endif /* CONFIG_INOTIFY  */
514 
515 
516 extern int personality(int);
517 extern int flock(int, int);
518 extern int setfsuid(int);
519 extern int setfsgid(int);
520 extern int setgroups(int, gid_t *);
521 
522 #define ERRNO_TABLE_SIZE 1200
523 
524 /* target_to_host_errno_table[] is initialized from
525  * host_to_target_errno_table[] in syscall_init(). */
526 static uint16_t target_to_host_errno_table[ERRNO_TABLE_SIZE] = {
527 };
528 
529 /*
530  * This list is the union of errno values overridden in asm-<arch>/errno.h
531  * minus the errnos that are not actually generic to all archs.
532  */
533 static uint16_t host_to_target_errno_table[ERRNO_TABLE_SIZE] = {
534     [EIDRM]		= TARGET_EIDRM,
535     [ECHRNG]		= TARGET_ECHRNG,
536     [EL2NSYNC]		= TARGET_EL2NSYNC,
537     [EL3HLT]		= TARGET_EL3HLT,
538     [EL3RST]		= TARGET_EL3RST,
539     [ELNRNG]		= TARGET_ELNRNG,
540     [EUNATCH]		= TARGET_EUNATCH,
541     [ENOCSI]		= TARGET_ENOCSI,
542     [EL2HLT]		= TARGET_EL2HLT,
543     [EDEADLK]		= TARGET_EDEADLK,
544     [ENOLCK]		= TARGET_ENOLCK,
545     [EBADE]		= TARGET_EBADE,
546     [EBADR]		= TARGET_EBADR,
547     [EXFULL]		= TARGET_EXFULL,
548     [ENOANO]		= TARGET_ENOANO,
549     [EBADRQC]		= TARGET_EBADRQC,
550     [EBADSLT]		= TARGET_EBADSLT,
551     [EBFONT]		= TARGET_EBFONT,
552     [ENOSTR]		= TARGET_ENOSTR,
553     [ENODATA]		= TARGET_ENODATA,
554     [ETIME]		= TARGET_ETIME,
555     [ENOSR]		= TARGET_ENOSR,
556     [ENONET]		= TARGET_ENONET,
557     [ENOPKG]		= TARGET_ENOPKG,
558     [EREMOTE]		= TARGET_EREMOTE,
559     [ENOLINK]		= TARGET_ENOLINK,
560     [EADV]		= TARGET_EADV,
561     [ESRMNT]		= TARGET_ESRMNT,
562     [ECOMM]		= TARGET_ECOMM,
563     [EPROTO]		= TARGET_EPROTO,
564     [EDOTDOT]		= TARGET_EDOTDOT,
565     [EMULTIHOP]		= TARGET_EMULTIHOP,
566     [EBADMSG]		= TARGET_EBADMSG,
567     [ENAMETOOLONG]	= TARGET_ENAMETOOLONG,
568     [EOVERFLOW]		= TARGET_EOVERFLOW,
569     [ENOTUNIQ]		= TARGET_ENOTUNIQ,
570     [EBADFD]		= TARGET_EBADFD,
571     [EREMCHG]		= TARGET_EREMCHG,
572     [ELIBACC]		= TARGET_ELIBACC,
573     [ELIBBAD]		= TARGET_ELIBBAD,
574     [ELIBSCN]		= TARGET_ELIBSCN,
575     [ELIBMAX]		= TARGET_ELIBMAX,
576     [ELIBEXEC]		= TARGET_ELIBEXEC,
577     [EILSEQ]		= TARGET_EILSEQ,
578     [ENOSYS]		= TARGET_ENOSYS,
579     [ELOOP]		= TARGET_ELOOP,
580     [ERESTART]		= TARGET_ERESTART,
581     [ESTRPIPE]		= TARGET_ESTRPIPE,
582     [ENOTEMPTY]		= TARGET_ENOTEMPTY,
583     [EUSERS]		= TARGET_EUSERS,
584     [ENOTSOCK]		= TARGET_ENOTSOCK,
585     [EDESTADDRREQ]	= TARGET_EDESTADDRREQ,
586     [EMSGSIZE]		= TARGET_EMSGSIZE,
587     [EPROTOTYPE]	= TARGET_EPROTOTYPE,
588     [ENOPROTOOPT]	= TARGET_ENOPROTOOPT,
589     [EPROTONOSUPPORT]	= TARGET_EPROTONOSUPPORT,
590     [ESOCKTNOSUPPORT]	= TARGET_ESOCKTNOSUPPORT,
591     [EOPNOTSUPP]	= TARGET_EOPNOTSUPP,
592     [EPFNOSUPPORT]	= TARGET_EPFNOSUPPORT,
593     [EAFNOSUPPORT]	= TARGET_EAFNOSUPPORT,
594     [EADDRINUSE]	= TARGET_EADDRINUSE,
595     [EADDRNOTAVAIL]	= TARGET_EADDRNOTAVAIL,
596     [ENETDOWN]		= TARGET_ENETDOWN,
597     [ENETUNREACH]	= TARGET_ENETUNREACH,
598     [ENETRESET]		= TARGET_ENETRESET,
599     [ECONNABORTED]	= TARGET_ECONNABORTED,
600     [ECONNRESET]	= TARGET_ECONNRESET,
601     [ENOBUFS]		= TARGET_ENOBUFS,
602     [EISCONN]		= TARGET_EISCONN,
603     [ENOTCONN]		= TARGET_ENOTCONN,
604     [EUCLEAN]		= TARGET_EUCLEAN,
605     [ENOTNAM]		= TARGET_ENOTNAM,
606     [ENAVAIL]		= TARGET_ENAVAIL,
607     [EISNAM]		= TARGET_EISNAM,
608     [EREMOTEIO]		= TARGET_EREMOTEIO,
609     [ESHUTDOWN]		= TARGET_ESHUTDOWN,
610     [ETOOMANYREFS]	= TARGET_ETOOMANYREFS,
611     [ETIMEDOUT]		= TARGET_ETIMEDOUT,
612     [ECONNREFUSED]	= TARGET_ECONNREFUSED,
613     [EHOSTDOWN]		= TARGET_EHOSTDOWN,
614     [EHOSTUNREACH]	= TARGET_EHOSTUNREACH,
615     [EALREADY]		= TARGET_EALREADY,
616     [EINPROGRESS]	= TARGET_EINPROGRESS,
617     [ESTALE]		= TARGET_ESTALE,
618     [ECANCELED]		= TARGET_ECANCELED,
619     [ENOMEDIUM]		= TARGET_ENOMEDIUM,
620     [EMEDIUMTYPE]	= TARGET_EMEDIUMTYPE,
621 #ifdef ENOKEY
622     [ENOKEY]		= TARGET_ENOKEY,
623 #endif
624 #ifdef EKEYEXPIRED
625     [EKEYEXPIRED]	= TARGET_EKEYEXPIRED,
626 #endif
627 #ifdef EKEYREVOKED
628     [EKEYREVOKED]	= TARGET_EKEYREVOKED,
629 #endif
630 #ifdef EKEYREJECTED
631     [EKEYREJECTED]	= TARGET_EKEYREJECTED,
632 #endif
633 #ifdef EOWNERDEAD
634     [EOWNERDEAD]	= TARGET_EOWNERDEAD,
635 #endif
636 #ifdef ENOTRECOVERABLE
637     [ENOTRECOVERABLE]	= TARGET_ENOTRECOVERABLE,
638 #endif
639 };
640 
641 static inline int host_to_target_errno(int err)
642 {
643     if(host_to_target_errno_table[err])
644         return host_to_target_errno_table[err];
645     return err;
646 }
647 
648 static inline int target_to_host_errno(int err)
649 {
650     if (target_to_host_errno_table[err])
651         return target_to_host_errno_table[err];
652     return err;
653 }
654 
655 static inline abi_long get_errno(abi_long ret)
656 {
657     if (ret == -1)
658         return -host_to_target_errno(errno);
659     else
660         return ret;
661 }
662 
663 static inline int is_error(abi_long ret)
664 {
665     return (abi_ulong)ret >= (abi_ulong)(-4096);
666 }
667 
668 char *target_strerror(int err)
669 {
670     return strerror(target_to_host_errno(err));
671 }
672 
673 static abi_ulong target_brk;
674 static abi_ulong target_original_brk;
675 
676 void target_set_brk(abi_ulong new_brk)
677 {
678     target_original_brk = target_brk = HOST_PAGE_ALIGN(new_brk);
679 }
680 
681 /* do_brk() must return target values and target errnos. */
682 abi_long do_brk(abi_ulong new_brk)
683 {
684     abi_ulong brk_page;
685     abi_long mapped_addr;
686     int	new_alloc_size;
687 
688     if (!new_brk)
689         return target_brk;
690     if (new_brk < target_original_brk)
691         return target_brk;
692 
693     brk_page = HOST_PAGE_ALIGN(target_brk);
694 
695     /* If the new brk is less than this, set it and we're done... */
696     if (new_brk < brk_page) {
697 	target_brk = new_brk;
698     	return target_brk;
699     }
700 
701     /* We need to allocate more memory after the brk... */
702     new_alloc_size = HOST_PAGE_ALIGN(new_brk - brk_page + 1);
703     mapped_addr = get_errno(target_mmap(brk_page, new_alloc_size,
704                                         PROT_READ|PROT_WRITE,
705                                         MAP_ANON|MAP_FIXED|MAP_PRIVATE, 0, 0));
706 
707     if (!is_error(mapped_addr))
708 	target_brk = new_brk;
709 
710     return target_brk;
711 }
712 
713 static inline abi_long copy_from_user_fdset(fd_set *fds,
714                                             abi_ulong target_fds_addr,
715                                             int n)
716 {
717     int i, nw, j, k;
718     abi_ulong b, *target_fds;
719 
720     nw = (n + TARGET_ABI_BITS - 1) / TARGET_ABI_BITS;
721     if (!(target_fds = lock_user(VERIFY_READ,
722                                  target_fds_addr,
723                                  sizeof(abi_ulong) * nw,
724                                  1)))
725         return -TARGET_EFAULT;
726 
727     FD_ZERO(fds);
728     k = 0;
729     for (i = 0; i < nw; i++) {
730         /* grab the abi_ulong */
731         __get_user(b, &target_fds[i]);
732         for (j = 0; j < TARGET_ABI_BITS; j++) {
733             /* check the bit inside the abi_ulong */
734             if ((b >> j) & 1)
735                 FD_SET(k, fds);
736             k++;
737         }
738     }
739 
740     unlock_user(target_fds, target_fds_addr, 0);
741 
742     return 0;
743 }
744 
745 static inline abi_long copy_to_user_fdset(abi_ulong target_fds_addr,
746                                           const fd_set *fds,
747                                           int n)
748 {
749     int i, nw, j, k;
750     abi_long v;
751     abi_ulong *target_fds;
752 
753     nw = (n + TARGET_ABI_BITS - 1) / TARGET_ABI_BITS;
754     if (!(target_fds = lock_user(VERIFY_WRITE,
755                                  target_fds_addr,
756                                  sizeof(abi_ulong) * nw,
757                                  0)))
758         return -TARGET_EFAULT;
759 
760     k = 0;
761     for (i = 0; i < nw; i++) {
762         v = 0;
763         for (j = 0; j < TARGET_ABI_BITS; j++) {
764             v |= ((FD_ISSET(k, fds) != 0) << j);
765             k++;
766         }
767         __put_user(v, &target_fds[i]);
768     }
769 
770     unlock_user(target_fds, target_fds_addr, sizeof(abi_ulong) * nw);
771 
772     return 0;
773 }
774 
775 #if defined(__alpha__)
776 #define HOST_HZ 1024
777 #else
778 #define HOST_HZ 100
779 #endif
780 
781 static inline abi_long host_to_target_clock_t(long ticks)
782 {
783 #if HOST_HZ == TARGET_HZ
784     return ticks;
785 #else
786     return ((int64_t)ticks * TARGET_HZ) / HOST_HZ;
787 #endif
788 }
789 
790 static inline abi_long host_to_target_rusage(abi_ulong target_addr,
791                                              const struct rusage *rusage)
792 {
793     struct target_rusage *target_rusage;
794 
795     if (!lock_user_struct(VERIFY_WRITE, target_rusage, target_addr, 0))
796         return -TARGET_EFAULT;
797     target_rusage->ru_utime.tv_sec = tswapl(rusage->ru_utime.tv_sec);
798     target_rusage->ru_utime.tv_usec = tswapl(rusage->ru_utime.tv_usec);
799     target_rusage->ru_stime.tv_sec = tswapl(rusage->ru_stime.tv_sec);
800     target_rusage->ru_stime.tv_usec = tswapl(rusage->ru_stime.tv_usec);
801     target_rusage->ru_maxrss = tswapl(rusage->ru_maxrss);
802     target_rusage->ru_ixrss = tswapl(rusage->ru_ixrss);
803     target_rusage->ru_idrss = tswapl(rusage->ru_idrss);
804     target_rusage->ru_isrss = tswapl(rusage->ru_isrss);
805     target_rusage->ru_minflt = tswapl(rusage->ru_minflt);
806     target_rusage->ru_majflt = tswapl(rusage->ru_majflt);
807     target_rusage->ru_nswap = tswapl(rusage->ru_nswap);
808     target_rusage->ru_inblock = tswapl(rusage->ru_inblock);
809     target_rusage->ru_oublock = tswapl(rusage->ru_oublock);
810     target_rusage->ru_msgsnd = tswapl(rusage->ru_msgsnd);
811     target_rusage->ru_msgrcv = tswapl(rusage->ru_msgrcv);
812     target_rusage->ru_nsignals = tswapl(rusage->ru_nsignals);
813     target_rusage->ru_nvcsw = tswapl(rusage->ru_nvcsw);
814     target_rusage->ru_nivcsw = tswapl(rusage->ru_nivcsw);
815     unlock_user_struct(target_rusage, target_addr, 1);
816 
817     return 0;
818 }
819 
820 static inline abi_long copy_from_user_timeval(struct timeval *tv,
821                                               abi_ulong target_tv_addr)
822 {
823     struct target_timeval *target_tv;
824 
825     if (!lock_user_struct(VERIFY_READ, target_tv, target_tv_addr, 1))
826         return -TARGET_EFAULT;
827 
828     __get_user(tv->tv_sec, &target_tv->tv_sec);
829     __get_user(tv->tv_usec, &target_tv->tv_usec);
830 
831     unlock_user_struct(target_tv, target_tv_addr, 0);
832 
833     return 0;
834 }
835 
836 static inline abi_long copy_to_user_timeval(abi_ulong target_tv_addr,
837                                             const struct timeval *tv)
838 {
839     struct target_timeval *target_tv;
840 
841     if (!lock_user_struct(VERIFY_WRITE, target_tv, target_tv_addr, 0))
842         return -TARGET_EFAULT;
843 
844     __put_user(tv->tv_sec, &target_tv->tv_sec);
845     __put_user(tv->tv_usec, &target_tv->tv_usec);
846 
847     unlock_user_struct(target_tv, target_tv_addr, 1);
848 
849     return 0;
850 }
851 
852 #if defined(TARGET_NR_mq_open) && defined(__NR_mq_open)
853 #include <mqueue.h>
854 
855 static inline abi_long copy_from_user_mq_attr(struct mq_attr *attr,
856                                               abi_ulong target_mq_attr_addr)
857 {
858     struct target_mq_attr *target_mq_attr;
859 
860     if (!lock_user_struct(VERIFY_READ, target_mq_attr,
861                           target_mq_attr_addr, 1))
862         return -TARGET_EFAULT;
863 
864     __get_user(attr->mq_flags, &target_mq_attr->mq_flags);
865     __get_user(attr->mq_maxmsg, &target_mq_attr->mq_maxmsg);
866     __get_user(attr->mq_msgsize, &target_mq_attr->mq_msgsize);
867     __get_user(attr->mq_curmsgs, &target_mq_attr->mq_curmsgs);
868 
869     unlock_user_struct(target_mq_attr, target_mq_attr_addr, 0);
870 
871     return 0;
872 }
873 
874 static inline abi_long copy_to_user_mq_attr(abi_ulong target_mq_attr_addr,
875                                             const struct mq_attr *attr)
876 {
877     struct target_mq_attr *target_mq_attr;
878 
879     if (!lock_user_struct(VERIFY_WRITE, target_mq_attr,
880                           target_mq_attr_addr, 0))
881         return -TARGET_EFAULT;
882 
883     __put_user(attr->mq_flags, &target_mq_attr->mq_flags);
884     __put_user(attr->mq_maxmsg, &target_mq_attr->mq_maxmsg);
885     __put_user(attr->mq_msgsize, &target_mq_attr->mq_msgsize);
886     __put_user(attr->mq_curmsgs, &target_mq_attr->mq_curmsgs);
887 
888     unlock_user_struct(target_mq_attr, target_mq_attr_addr, 1);
889 
890     return 0;
891 }
892 #endif
893 
894 /* do_select() must return target values and target errnos. */
895 static abi_long do_select(int n,
896                           abi_ulong rfd_addr, abi_ulong wfd_addr,
897                           abi_ulong efd_addr, abi_ulong target_tv_addr)
898 {
899     fd_set rfds, wfds, efds;
900     fd_set *rfds_ptr, *wfds_ptr, *efds_ptr;
901     struct timeval tv, *tv_ptr;
902     abi_long ret;
903 
904     if (rfd_addr) {
905         if (copy_from_user_fdset(&rfds, rfd_addr, n))
906             return -TARGET_EFAULT;
907         rfds_ptr = &rfds;
908     } else {
909         rfds_ptr = NULL;
910     }
911     if (wfd_addr) {
912         if (copy_from_user_fdset(&wfds, wfd_addr, n))
913             return -TARGET_EFAULT;
914         wfds_ptr = &wfds;
915     } else {
916         wfds_ptr = NULL;
917     }
918     if (efd_addr) {
919         if (copy_from_user_fdset(&efds, efd_addr, n))
920             return -TARGET_EFAULT;
921         efds_ptr = &efds;
922     } else {
923         efds_ptr = NULL;
924     }
925 
926     if (target_tv_addr) {
927         if (copy_from_user_timeval(&tv, target_tv_addr))
928             return -TARGET_EFAULT;
929         tv_ptr = &tv;
930     } else {
931         tv_ptr = NULL;
932     }
933 
934     ret = get_errno(select(n, rfds_ptr, wfds_ptr, efds_ptr, tv_ptr));
935 
936     if (!is_error(ret)) {
937         if (rfd_addr && copy_to_user_fdset(rfd_addr, &rfds, n))
938             return -TARGET_EFAULT;
939         if (wfd_addr && copy_to_user_fdset(wfd_addr, &wfds, n))
940             return -TARGET_EFAULT;
941         if (efd_addr && copy_to_user_fdset(efd_addr, &efds, n))
942             return -TARGET_EFAULT;
943 
944         if (target_tv_addr && copy_to_user_timeval(target_tv_addr, &tv))
945             return -TARGET_EFAULT;
946     }
947 
948     return ret;
949 }
950 
951 static abi_long do_pipe2(int host_pipe[], int flags)
952 {
953 #ifdef CONFIG_PIPE2
954     return pipe2(host_pipe, flags);
955 #else
956     return -ENOSYS;
957 #endif
958 }
959 
960 static abi_long do_pipe(void *cpu_env, abi_ulong pipedes, int flags)
961 {
962     int host_pipe[2];
963     abi_long ret;
964     ret = flags ? do_pipe2(host_pipe, flags) : pipe(host_pipe);
965 
966     if (is_error(ret))
967         return get_errno(ret);
968 #if defined(TARGET_MIPS)
969     ((CPUMIPSState*)cpu_env)->active_tc.gpr[3] = host_pipe[1];
970     ret = host_pipe[0];
971 #elif defined(TARGET_SH4)
972     ((CPUSH4State*)cpu_env)->gregs[1] = host_pipe[1];
973     ret = host_pipe[0];
974 #else
975     if (put_user_s32(host_pipe[0], pipedes)
976         || put_user_s32(host_pipe[1], pipedes + sizeof(host_pipe[0])))
977         return -TARGET_EFAULT;
978 #endif
979     return get_errno(ret);
980 }
981 
982 static inline abi_long target_to_host_ip_mreq(struct ip_mreqn *mreqn,
983                                               abi_ulong target_addr,
984                                               socklen_t len)
985 {
986     struct target_ip_mreqn *target_smreqn;
987 
988     target_smreqn = lock_user(VERIFY_READ, target_addr, len, 1);
989     if (!target_smreqn)
990         return -TARGET_EFAULT;
991     mreqn->imr_multiaddr.s_addr = target_smreqn->imr_multiaddr.s_addr;
992     mreqn->imr_address.s_addr = target_smreqn->imr_address.s_addr;
993     if (len == sizeof(struct target_ip_mreqn))
994         mreqn->imr_ifindex = tswapl(target_smreqn->imr_ifindex);
995     unlock_user(target_smreqn, target_addr, 0);
996 
997     return 0;
998 }
999 
1000 static inline abi_long target_to_host_sockaddr(struct sockaddr *addr,
1001                                                abi_ulong target_addr,
1002                                                socklen_t len)
1003 {
1004     const socklen_t unix_maxlen = sizeof (struct sockaddr_un);
1005     sa_family_t sa_family;
1006     struct target_sockaddr *target_saddr;
1007 
1008     target_saddr = lock_user(VERIFY_READ, target_addr, len, 1);
1009     if (!target_saddr)
1010         return -TARGET_EFAULT;
1011 
1012     sa_family = tswap16(target_saddr->sa_family);
1013 
1014     /* Oops. The caller might send a incomplete sun_path; sun_path
1015      * must be terminated by \0 (see the manual page), but
1016      * unfortunately it is quite common to specify sockaddr_un
1017      * length as "strlen(x->sun_path)" while it should be
1018      * "strlen(...) + 1". We'll fix that here if needed.
1019      * Linux kernel has a similar feature.
1020      */
1021 
1022     if (sa_family == AF_UNIX) {
1023         if (len < unix_maxlen && len > 0) {
1024             char *cp = (char*)target_saddr;
1025 
1026             if ( cp[len-1] && !cp[len] )
1027                 len++;
1028         }
1029         if (len > unix_maxlen)
1030             len = unix_maxlen;
1031     }
1032 
1033     memcpy(addr, target_saddr, len);
1034     addr->sa_family = sa_family;
1035     unlock_user(target_saddr, target_addr, 0);
1036 
1037     return 0;
1038 }
1039 
1040 static inline abi_long host_to_target_sockaddr(abi_ulong target_addr,
1041                                                struct sockaddr *addr,
1042                                                socklen_t len)
1043 {
1044     struct target_sockaddr *target_saddr;
1045 
1046     target_saddr = lock_user(VERIFY_WRITE, target_addr, len, 0);
1047     if (!target_saddr)
1048         return -TARGET_EFAULT;
1049     memcpy(target_saddr, addr, len);
1050     target_saddr->sa_family = tswap16(addr->sa_family);
1051     unlock_user(target_saddr, target_addr, len);
1052 
1053     return 0;
1054 }
1055 
1056 /* ??? Should this also swap msgh->name?  */
1057 static inline abi_long target_to_host_cmsg(struct msghdr *msgh,
1058                                            struct target_msghdr *target_msgh)
1059 {
1060     struct cmsghdr *cmsg = CMSG_FIRSTHDR(msgh);
1061     abi_long msg_controllen;
1062     abi_ulong target_cmsg_addr;
1063     struct target_cmsghdr *target_cmsg;
1064     socklen_t space = 0;
1065 
1066     msg_controllen = tswapl(target_msgh->msg_controllen);
1067     if (msg_controllen < sizeof (struct target_cmsghdr))
1068         goto the_end;
1069     target_cmsg_addr = tswapl(target_msgh->msg_control);
1070     target_cmsg = lock_user(VERIFY_READ, target_cmsg_addr, msg_controllen, 1);
1071     if (!target_cmsg)
1072         return -TARGET_EFAULT;
1073 
1074     while (cmsg && target_cmsg) {
1075         void *data = CMSG_DATA(cmsg);
1076         void *target_data = TARGET_CMSG_DATA(target_cmsg);
1077 
1078         int len = tswapl(target_cmsg->cmsg_len)
1079                   - TARGET_CMSG_ALIGN(sizeof (struct target_cmsghdr));
1080 
1081         space += CMSG_SPACE(len);
1082         if (space > msgh->msg_controllen) {
1083             space -= CMSG_SPACE(len);
1084             gemu_log("Host cmsg overflow\n");
1085             break;
1086         }
1087 
1088         cmsg->cmsg_level = tswap32(target_cmsg->cmsg_level);
1089         cmsg->cmsg_type = tswap32(target_cmsg->cmsg_type);
1090         cmsg->cmsg_len = CMSG_LEN(len);
1091 
1092         if (cmsg->cmsg_level != TARGET_SOL_SOCKET || cmsg->cmsg_type != SCM_RIGHTS) {
1093             gemu_log("Unsupported ancillary data: %d/%d\n", cmsg->cmsg_level, cmsg->cmsg_type);
1094             memcpy(data, target_data, len);
1095         } else {
1096             int *fd = (int *)data;
1097             int *target_fd = (int *)target_data;
1098             int i, numfds = len / sizeof(int);
1099 
1100             for (i = 0; i < numfds; i++)
1101                 fd[i] = tswap32(target_fd[i]);
1102         }
1103 
1104         cmsg = CMSG_NXTHDR(msgh, cmsg);
1105         target_cmsg = TARGET_CMSG_NXTHDR(target_msgh, target_cmsg);
1106     }
1107     unlock_user(target_cmsg, target_cmsg_addr, 0);
1108  the_end:
1109     msgh->msg_controllen = space;
1110     return 0;
1111 }
1112 
1113 /* ??? Should this also swap msgh->name?  */
1114 static inline abi_long host_to_target_cmsg(struct target_msghdr *target_msgh,
1115                                            struct msghdr *msgh)
1116 {
1117     struct cmsghdr *cmsg = CMSG_FIRSTHDR(msgh);
1118     abi_long msg_controllen;
1119     abi_ulong target_cmsg_addr;
1120     struct target_cmsghdr *target_cmsg;
1121     socklen_t space = 0;
1122 
1123     msg_controllen = tswapl(target_msgh->msg_controllen);
1124     if (msg_controllen < sizeof (struct target_cmsghdr))
1125         goto the_end;
1126     target_cmsg_addr = tswapl(target_msgh->msg_control);
1127     target_cmsg = lock_user(VERIFY_WRITE, target_cmsg_addr, msg_controllen, 0);
1128     if (!target_cmsg)
1129         return -TARGET_EFAULT;
1130 
1131     while (cmsg && target_cmsg) {
1132         void *data = CMSG_DATA(cmsg);
1133         void *target_data = TARGET_CMSG_DATA(target_cmsg);
1134 
1135         int len = cmsg->cmsg_len - CMSG_ALIGN(sizeof (struct cmsghdr));
1136 
1137         space += TARGET_CMSG_SPACE(len);
1138         if (space > msg_controllen) {
1139             space -= TARGET_CMSG_SPACE(len);
1140             gemu_log("Target cmsg overflow\n");
1141             break;
1142         }
1143 
1144         target_cmsg->cmsg_level = tswap32(cmsg->cmsg_level);
1145         target_cmsg->cmsg_type = tswap32(cmsg->cmsg_type);
1146         target_cmsg->cmsg_len = tswapl(TARGET_CMSG_LEN(len));
1147 
1148         if (cmsg->cmsg_level != TARGET_SOL_SOCKET || cmsg->cmsg_type != SCM_RIGHTS) {
1149             gemu_log("Unsupported ancillary data: %d/%d\n", cmsg->cmsg_level, cmsg->cmsg_type);
1150             memcpy(target_data, data, len);
1151         } else {
1152             int *fd = (int *)data;
1153             int *target_fd = (int *)target_data;
1154             int i, numfds = len / sizeof(int);
1155 
1156             for (i = 0; i < numfds; i++)
1157                 target_fd[i] = tswap32(fd[i]);
1158         }
1159 
1160         cmsg = CMSG_NXTHDR(msgh, cmsg);
1161         target_cmsg = TARGET_CMSG_NXTHDR(target_msgh, target_cmsg);
1162     }
1163     unlock_user(target_cmsg, target_cmsg_addr, space);
1164  the_end:
1165     target_msgh->msg_controllen = tswapl(space);
1166     return 0;
1167 }
1168 
1169 /* do_setsockopt() Must return target values and target errnos. */
1170 static abi_long do_setsockopt(int sockfd, int level, int optname,
1171                               abi_ulong optval_addr, socklen_t optlen)
1172 {
1173     abi_long ret;
1174     int val;
1175     struct ip_mreqn *ip_mreq;
1176     struct ip_mreq_source *ip_mreq_source;
1177 
1178     switch(level) {
1179     case SOL_TCP:
1180         /* TCP options all take an 'int' value.  */
1181         if (optlen < sizeof(uint32_t))
1182             return -TARGET_EINVAL;
1183 
1184         if (get_user_u32(val, optval_addr))
1185             return -TARGET_EFAULT;
1186         ret = get_errno(setsockopt(sockfd, level, optname, &val, sizeof(val)));
1187         break;
1188     case SOL_IP:
1189         switch(optname) {
1190         case IP_TOS:
1191         case IP_TTL:
1192         case IP_HDRINCL:
1193         case IP_ROUTER_ALERT:
1194         case IP_RECVOPTS:
1195         case IP_RETOPTS:
1196         case IP_PKTINFO:
1197         case IP_MTU_DISCOVER:
1198         case IP_RECVERR:
1199         case IP_RECVTOS:
1200 #ifdef IP_FREEBIND
1201         case IP_FREEBIND:
1202 #endif
1203         case IP_MULTICAST_TTL:
1204         case IP_MULTICAST_LOOP:
1205             val = 0;
1206             if (optlen >= sizeof(uint32_t)) {
1207                 if (get_user_u32(val, optval_addr))
1208                     return -TARGET_EFAULT;
1209             } else if (optlen >= 1) {
1210                 if (get_user_u8(val, optval_addr))
1211                     return -TARGET_EFAULT;
1212             }
1213             ret = get_errno(setsockopt(sockfd, level, optname, &val, sizeof(val)));
1214             break;
1215         case IP_ADD_MEMBERSHIP:
1216         case IP_DROP_MEMBERSHIP:
1217             if (optlen < sizeof (struct target_ip_mreq) ||
1218                 optlen > sizeof (struct target_ip_mreqn))
1219                 return -TARGET_EINVAL;
1220 
1221             ip_mreq = (struct ip_mreqn *) alloca(optlen);
1222             target_to_host_ip_mreq(ip_mreq, optval_addr, optlen);
1223             ret = get_errno(setsockopt(sockfd, level, optname, ip_mreq, optlen));
1224             break;
1225 
1226         case IP_BLOCK_SOURCE:
1227         case IP_UNBLOCK_SOURCE:
1228         case IP_ADD_SOURCE_MEMBERSHIP:
1229         case IP_DROP_SOURCE_MEMBERSHIP:
1230             if (optlen != sizeof (struct target_ip_mreq_source))
1231                 return -TARGET_EINVAL;
1232 
1233             ip_mreq_source = lock_user(VERIFY_READ, optval_addr, optlen, 1);
1234             ret = get_errno(setsockopt(sockfd, level, optname, ip_mreq_source, optlen));
1235             unlock_user (ip_mreq_source, optval_addr, 0);
1236             break;
1237 
1238         default:
1239             goto unimplemented;
1240         }
1241         break;
1242     case TARGET_SOL_SOCKET:
1243         switch (optname) {
1244             /* Options with 'int' argument.  */
1245         case TARGET_SO_DEBUG:
1246 		optname = SO_DEBUG;
1247 		break;
1248         case TARGET_SO_REUSEADDR:
1249 		optname = SO_REUSEADDR;
1250 		break;
1251         case TARGET_SO_TYPE:
1252 		optname = SO_TYPE;
1253 		break;
1254         case TARGET_SO_ERROR:
1255 		optname = SO_ERROR;
1256 		break;
1257         case TARGET_SO_DONTROUTE:
1258 		optname = SO_DONTROUTE;
1259 		break;
1260         case TARGET_SO_BROADCAST:
1261 		optname = SO_BROADCAST;
1262 		break;
1263         case TARGET_SO_SNDBUF:
1264 		optname = SO_SNDBUF;
1265 		break;
1266         case TARGET_SO_RCVBUF:
1267 		optname = SO_RCVBUF;
1268 		break;
1269         case TARGET_SO_KEEPALIVE:
1270 		optname = SO_KEEPALIVE;
1271 		break;
1272         case TARGET_SO_OOBINLINE:
1273 		optname = SO_OOBINLINE;
1274 		break;
1275         case TARGET_SO_NO_CHECK:
1276 		optname = SO_NO_CHECK;
1277 		break;
1278         case TARGET_SO_PRIORITY:
1279 		optname = SO_PRIORITY;
1280 		break;
1281 #ifdef SO_BSDCOMPAT
1282         case TARGET_SO_BSDCOMPAT:
1283 		optname = SO_BSDCOMPAT;
1284 		break;
1285 #endif
1286         case TARGET_SO_PASSCRED:
1287 		optname = SO_PASSCRED;
1288 		break;
1289         case TARGET_SO_TIMESTAMP:
1290 		optname = SO_TIMESTAMP;
1291 		break;
1292         case TARGET_SO_RCVLOWAT:
1293 		optname = SO_RCVLOWAT;
1294 		break;
1295         case TARGET_SO_RCVTIMEO:
1296 		optname = SO_RCVTIMEO;
1297 		break;
1298         case TARGET_SO_SNDTIMEO:
1299 		optname = SO_SNDTIMEO;
1300 		break;
1301             break;
1302         default:
1303             goto unimplemented;
1304         }
1305 	if (optlen < sizeof(uint32_t))
1306             return -TARGET_EINVAL;
1307 
1308 	if (get_user_u32(val, optval_addr))
1309             return -TARGET_EFAULT;
1310 	ret = get_errno(setsockopt(sockfd, SOL_SOCKET, optname, &val, sizeof(val)));
1311         break;
1312     default:
1313     unimplemented:
1314         gemu_log("Unsupported setsockopt level=%d optname=%d \n", level, optname);
1315         ret = -TARGET_ENOPROTOOPT;
1316     }
1317     return ret;
1318 }
1319 
1320 /* do_getsockopt() Must return target values and target errnos. */
1321 static abi_long do_getsockopt(int sockfd, int level, int optname,
1322                               abi_ulong optval_addr, abi_ulong optlen)
1323 {
1324     abi_long ret;
1325     int len, val;
1326     socklen_t lv;
1327 
1328     switch(level) {
1329     case TARGET_SOL_SOCKET:
1330     	level = SOL_SOCKET;
1331 	switch (optname) {
1332 	case TARGET_SO_LINGER:
1333 	case TARGET_SO_RCVTIMEO:
1334 	case TARGET_SO_SNDTIMEO:
1335 	case TARGET_SO_PEERCRED:
1336 	case TARGET_SO_PEERNAME:
1337 	    /* These don't just return a single integer */
1338 	    goto unimplemented;
1339         default:
1340             goto int_case;
1341         }
1342         break;
1343     case SOL_TCP:
1344         /* TCP options all take an 'int' value.  */
1345     int_case:
1346         if (get_user_u32(len, optlen))
1347             return -TARGET_EFAULT;
1348         if (len < 0)
1349             return -TARGET_EINVAL;
1350         lv = sizeof(int);
1351         ret = get_errno(getsockopt(sockfd, level, optname, &val, &lv));
1352         if (ret < 0)
1353             return ret;
1354         if (len > lv)
1355             len = lv;
1356         if (len == 4) {
1357             if (put_user_u32(val, optval_addr))
1358                 return -TARGET_EFAULT;
1359         } else {
1360             if (put_user_u8(val, optval_addr))
1361                 return -TARGET_EFAULT;
1362 	}
1363         if (put_user_u32(len, optlen))
1364             return -TARGET_EFAULT;
1365         break;
1366     case SOL_IP:
1367         switch(optname) {
1368         case IP_TOS:
1369         case IP_TTL:
1370         case IP_HDRINCL:
1371         case IP_ROUTER_ALERT:
1372         case IP_RECVOPTS:
1373         case IP_RETOPTS:
1374         case IP_PKTINFO:
1375         case IP_MTU_DISCOVER:
1376         case IP_RECVERR:
1377         case IP_RECVTOS:
1378 #ifdef IP_FREEBIND
1379         case IP_FREEBIND:
1380 #endif
1381         case IP_MULTICAST_TTL:
1382         case IP_MULTICAST_LOOP:
1383             if (get_user_u32(len, optlen))
1384                 return -TARGET_EFAULT;
1385             if (len < 0)
1386                 return -TARGET_EINVAL;
1387             lv = sizeof(int);
1388             ret = get_errno(getsockopt(sockfd, level, optname, &val, &lv));
1389             if (ret < 0)
1390                 return ret;
1391             if (len < sizeof(int) && len > 0 && val >= 0 && val < 255) {
1392                 len = 1;
1393                 if (put_user_u32(len, optlen)
1394                     || put_user_u8(val, optval_addr))
1395                     return -TARGET_EFAULT;
1396             } else {
1397                 if (len > sizeof(int))
1398                     len = sizeof(int);
1399                 if (put_user_u32(len, optlen)
1400                     || put_user_u32(val, optval_addr))
1401                     return -TARGET_EFAULT;
1402             }
1403             break;
1404         default:
1405             ret = -TARGET_ENOPROTOOPT;
1406             break;
1407         }
1408         break;
1409     default:
1410     unimplemented:
1411         gemu_log("getsockopt level=%d optname=%d not yet supported\n",
1412                  level, optname);
1413         ret = -TARGET_EOPNOTSUPP;
1414         break;
1415     }
1416     return ret;
1417 }
1418 
1419 /* FIXME
1420  * lock_iovec()/unlock_iovec() have a return code of 0 for success where
1421  * other lock functions have a return code of 0 for failure.
1422  */
1423 static abi_long lock_iovec(int type, struct iovec *vec, abi_ulong target_addr,
1424                            int count, int copy)
1425 {
1426     struct target_iovec *target_vec;
1427     abi_ulong base;
1428     int i;
1429 
1430     target_vec = lock_user(VERIFY_READ, target_addr, count * sizeof(struct target_iovec), 1);
1431     if (!target_vec)
1432         return -TARGET_EFAULT;
1433     for(i = 0;i < count; i++) {
1434         base = tswapl(target_vec[i].iov_base);
1435         vec[i].iov_len = tswapl(target_vec[i].iov_len);
1436         if (vec[i].iov_len != 0) {
1437             vec[i].iov_base = lock_user(type, base, vec[i].iov_len, copy);
1438             /* Don't check lock_user return value. We must call writev even
1439                if a element has invalid base address. */
1440         } else {
1441             /* zero length pointer is ignored */
1442             vec[i].iov_base = NULL;
1443         }
1444     }
1445     unlock_user (target_vec, target_addr, 0);
1446     return 0;
1447 }
1448 
1449 static abi_long unlock_iovec(struct iovec *vec, abi_ulong target_addr,
1450                              int count, int copy)
1451 {
1452     struct target_iovec *target_vec;
1453     abi_ulong base;
1454     int i;
1455 
1456     target_vec = lock_user(VERIFY_READ, target_addr, count * sizeof(struct target_iovec), 1);
1457     if (!target_vec)
1458         return -TARGET_EFAULT;
1459     for(i = 0;i < count; i++) {
1460         if (target_vec[i].iov_base) {
1461             base = tswapl(target_vec[i].iov_base);
1462             unlock_user(vec[i].iov_base, base, copy ? vec[i].iov_len : 0);
1463         }
1464     }
1465     unlock_user (target_vec, target_addr, 0);
1466 
1467     return 0;
1468 }
1469 
1470 /* do_socket() Must return target values and target errnos. */
1471 static abi_long do_socket(int domain, int type, int protocol)
1472 {
1473 #if defined(TARGET_MIPS)
1474     switch(type) {
1475     case TARGET_SOCK_DGRAM:
1476         type = SOCK_DGRAM;
1477         break;
1478     case TARGET_SOCK_STREAM:
1479         type = SOCK_STREAM;
1480         break;
1481     case TARGET_SOCK_RAW:
1482         type = SOCK_RAW;
1483         break;
1484     case TARGET_SOCK_RDM:
1485         type = SOCK_RDM;
1486         break;
1487     case TARGET_SOCK_SEQPACKET:
1488         type = SOCK_SEQPACKET;
1489         break;
1490     case TARGET_SOCK_PACKET:
1491         type = SOCK_PACKET;
1492         break;
1493     }
1494 #endif
1495     if (domain == PF_NETLINK)
1496         return -EAFNOSUPPORT; /* do not NETLINK socket connections possible */
1497     return get_errno(socket(domain, type, protocol));
1498 }
1499 
1500 /* do_bind() Must return target values and target errnos. */
1501 static abi_long do_bind(int sockfd, abi_ulong target_addr,
1502                         socklen_t addrlen)
1503 {
1504     void *addr;
1505     abi_long ret;
1506 
1507     if (addrlen < 0)
1508         return -TARGET_EINVAL;
1509 
1510     addr = alloca(addrlen+1);
1511 
1512     ret = target_to_host_sockaddr(addr, target_addr, addrlen);
1513     if (ret)
1514         return ret;
1515 
1516     return get_errno(bind(sockfd, addr, addrlen));
1517 }
1518 
1519 /* do_connect() Must return target values and target errnos. */
1520 static abi_long do_connect(int sockfd, abi_ulong target_addr,
1521                            socklen_t addrlen)
1522 {
1523     void *addr;
1524     abi_long ret;
1525 
1526     if (addrlen < 0)
1527         return -TARGET_EINVAL;
1528 
1529     addr = alloca(addrlen);
1530 
1531     ret = target_to_host_sockaddr(addr, target_addr, addrlen);
1532     if (ret)
1533         return ret;
1534 
1535     return get_errno(connect(sockfd, addr, addrlen));
1536 }
1537 
1538 /* do_sendrecvmsg() Must return target values and target errnos. */
1539 static abi_long do_sendrecvmsg(int fd, abi_ulong target_msg,
1540                                int flags, int send)
1541 {
1542     abi_long ret, len;
1543     struct target_msghdr *msgp;
1544     struct msghdr msg;
1545     int count;
1546     struct iovec *vec;
1547     abi_ulong target_vec;
1548 
1549     /* FIXME */
1550     if (!lock_user_struct(send ? VERIFY_READ : VERIFY_WRITE,
1551                           msgp,
1552                           target_msg,
1553                           send ? 1 : 0))
1554         return -TARGET_EFAULT;
1555     if (msgp->msg_name) {
1556         msg.msg_namelen = tswap32(msgp->msg_namelen);
1557         msg.msg_name = alloca(msg.msg_namelen);
1558         ret = target_to_host_sockaddr(msg.msg_name, tswapl(msgp->msg_name),
1559                                 msg.msg_namelen);
1560         if (ret) {
1561             unlock_user_struct(msgp, target_msg, send ? 0 : 1);
1562             return ret;
1563         }
1564     } else {
1565         msg.msg_name = NULL;
1566         msg.msg_namelen = 0;
1567     }
1568     msg.msg_controllen = 2 * tswapl(msgp->msg_controllen);
1569     msg.msg_control = alloca(msg.msg_controllen);
1570     msg.msg_flags = tswap32(msgp->msg_flags);
1571 
1572     count = tswapl(msgp->msg_iovlen);
1573     vec = alloca(count * sizeof(struct iovec));
1574     target_vec = tswapl(msgp->msg_iov);
1575     lock_iovec(send ? VERIFY_READ : VERIFY_WRITE, vec, target_vec, count, send);
1576     msg.msg_iovlen = count;
1577     msg.msg_iov = vec;
1578 
1579     if (send) {
1580         ret = target_to_host_cmsg(&msg, msgp);
1581         if (ret == 0)
1582             ret = get_errno(sendmsg(fd, &msg, flags));
1583     } else {
1584         ret = get_errno(recvmsg(fd, &msg, flags));
1585         if (!is_error(ret)) {
1586             len = ret;
1587             ret = host_to_target_cmsg(msgp, &msg);
1588             if (!is_error(ret))
1589                 ret = len;
1590         }
1591     }
1592     unlock_iovec(vec, target_vec, count, !send);
1593     unlock_user_struct(msgp, target_msg, send ? 0 : 1);
1594     return ret;
1595 }
1596 
1597 /* do_accept() Must return target values and target errnos. */
1598 static abi_long do_accept(int fd, abi_ulong target_addr,
1599                           abi_ulong target_addrlen_addr)
1600 {
1601     socklen_t addrlen;
1602     void *addr;
1603     abi_long ret;
1604 
1605     if (target_addr == 0)
1606        return get_errno(accept(fd, NULL, NULL));
1607 
1608     /* linux returns EINVAL if addrlen pointer is invalid */
1609     if (get_user_u32(addrlen, target_addrlen_addr))
1610         return -TARGET_EINVAL;
1611 
1612     if (addrlen < 0)
1613         return -TARGET_EINVAL;
1614 
1615     if (!access_ok(VERIFY_WRITE, target_addr, addrlen))
1616         return -TARGET_EINVAL;
1617 
1618     addr = alloca(addrlen);
1619 
1620     ret = get_errno(accept(fd, addr, &addrlen));
1621     if (!is_error(ret)) {
1622         host_to_target_sockaddr(target_addr, addr, addrlen);
1623         if (put_user_u32(addrlen, target_addrlen_addr))
1624             ret = -TARGET_EFAULT;
1625     }
1626     return ret;
1627 }
1628 
1629 /* do_getpeername() Must return target values and target errnos. */
1630 static abi_long do_getpeername(int fd, abi_ulong target_addr,
1631                                abi_ulong target_addrlen_addr)
1632 {
1633     socklen_t addrlen;
1634     void *addr;
1635     abi_long ret;
1636 
1637     if (get_user_u32(addrlen, target_addrlen_addr))
1638         return -TARGET_EFAULT;
1639 
1640     if (addrlen < 0)
1641         return -TARGET_EINVAL;
1642 
1643     if (!access_ok(VERIFY_WRITE, target_addr, addrlen))
1644         return -TARGET_EFAULT;
1645 
1646     addr = alloca(addrlen);
1647 
1648     ret = get_errno(getpeername(fd, addr, &addrlen));
1649     if (!is_error(ret)) {
1650         host_to_target_sockaddr(target_addr, addr, addrlen);
1651         if (put_user_u32(addrlen, target_addrlen_addr))
1652             ret = -TARGET_EFAULT;
1653     }
1654     return ret;
1655 }
1656 
1657 /* do_getsockname() Must return target values and target errnos. */
1658 static abi_long do_getsockname(int fd, abi_ulong target_addr,
1659                                abi_ulong target_addrlen_addr)
1660 {
1661     socklen_t addrlen;
1662     void *addr;
1663     abi_long ret;
1664 
1665     if (get_user_u32(addrlen, target_addrlen_addr))
1666         return -TARGET_EFAULT;
1667 
1668     if (addrlen < 0)
1669         return -TARGET_EINVAL;
1670 
1671     if (!access_ok(VERIFY_WRITE, target_addr, addrlen))
1672         return -TARGET_EFAULT;
1673 
1674     addr = alloca(addrlen);
1675 
1676     ret = get_errno(getsockname(fd, addr, &addrlen));
1677     if (!is_error(ret)) {
1678         host_to_target_sockaddr(target_addr, addr, addrlen);
1679         if (put_user_u32(addrlen, target_addrlen_addr))
1680             ret = -TARGET_EFAULT;
1681     }
1682     return ret;
1683 }
1684 
1685 /* do_socketpair() Must return target values and target errnos. */
1686 static abi_long do_socketpair(int domain, int type, int protocol,
1687                               abi_ulong target_tab_addr)
1688 {
1689     int tab[2];
1690     abi_long ret;
1691 
1692     ret = get_errno(socketpair(domain, type, protocol, tab));
1693     if (!is_error(ret)) {
1694         if (put_user_s32(tab[0], target_tab_addr)
1695             || put_user_s32(tab[1], target_tab_addr + sizeof(tab[0])))
1696             ret = -TARGET_EFAULT;
1697     }
1698     return ret;
1699 }
1700 
1701 /* do_sendto() Must return target values and target errnos. */
1702 static abi_long do_sendto(int fd, abi_ulong msg, size_t len, int flags,
1703                           abi_ulong target_addr, socklen_t addrlen)
1704 {
1705     void *addr;
1706     void *host_msg;
1707     abi_long ret;
1708 
1709     if (addrlen < 0)
1710         return -TARGET_EINVAL;
1711 
1712     host_msg = lock_user(VERIFY_READ, msg, len, 1);
1713     if (!host_msg)
1714         return -TARGET_EFAULT;
1715     if (target_addr) {
1716         addr = alloca(addrlen);
1717         ret = target_to_host_sockaddr(addr, target_addr, addrlen);
1718         if (ret) {
1719             unlock_user(host_msg, msg, 0);
1720             return ret;
1721         }
1722         ret = get_errno(sendto(fd, host_msg, len, flags, addr, addrlen));
1723     } else {
1724         ret = get_errno(send(fd, host_msg, len, flags));
1725     }
1726     unlock_user(host_msg, msg, 0);
1727     return ret;
1728 }
1729 
1730 /* do_recvfrom() Must return target values and target errnos. */
1731 static abi_long do_recvfrom(int fd, abi_ulong msg, size_t len, int flags,
1732                             abi_ulong target_addr,
1733                             abi_ulong target_addrlen)
1734 {
1735     socklen_t addrlen;
1736     void *addr;
1737     void *host_msg;
1738     abi_long ret;
1739 
1740     host_msg = lock_user(VERIFY_WRITE, msg, len, 0);
1741     if (!host_msg)
1742         return -TARGET_EFAULT;
1743     if (target_addr) {
1744         if (get_user_u32(addrlen, target_addrlen)) {
1745             ret = -TARGET_EFAULT;
1746             goto fail;
1747         }
1748         if (addrlen < 0) {
1749             ret = -TARGET_EINVAL;
1750             goto fail;
1751         }
1752         addr = alloca(addrlen);
1753         ret = get_errno(recvfrom(fd, host_msg, len, flags, addr, &addrlen));
1754     } else {
1755         addr = NULL; /* To keep compiler quiet.  */
1756         ret = get_errno(recv(fd, host_msg, len, flags));
1757     }
1758     if (!is_error(ret)) {
1759         if (target_addr) {
1760             host_to_target_sockaddr(target_addr, addr, addrlen);
1761             if (put_user_u32(addrlen, target_addrlen)) {
1762                 ret = -TARGET_EFAULT;
1763                 goto fail;
1764             }
1765         }
1766         unlock_user(host_msg, msg, len);
1767     } else {
1768 fail:
1769         unlock_user(host_msg, msg, 0);
1770     }
1771     return ret;
1772 }
1773 
1774 #ifdef TARGET_NR_socketcall
1775 /* do_socketcall() Must return target values and target errnos. */
1776 static abi_long do_socketcall(int num, abi_ulong vptr)
1777 {
1778     abi_long ret;
1779     const int n = sizeof(abi_ulong);
1780 
1781     switch(num) {
1782     case SOCKOP_socket:
1783 	{
1784             abi_ulong domain, type, protocol;
1785 
1786             if (get_user_ual(domain, vptr)
1787                 || get_user_ual(type, vptr + n)
1788                 || get_user_ual(protocol, vptr + 2 * n))
1789                 return -TARGET_EFAULT;
1790 
1791             ret = do_socket(domain, type, protocol);
1792 	}
1793         break;
1794     case SOCKOP_bind:
1795 	{
1796             abi_ulong sockfd;
1797             abi_ulong target_addr;
1798             socklen_t addrlen;
1799 
1800             if (get_user_ual(sockfd, vptr)
1801                 || get_user_ual(target_addr, vptr + n)
1802                 || get_user_ual(addrlen, vptr + 2 * n))
1803                 return -TARGET_EFAULT;
1804 
1805             ret = do_bind(sockfd, target_addr, addrlen);
1806         }
1807         break;
1808     case SOCKOP_connect:
1809         {
1810             abi_ulong sockfd;
1811             abi_ulong target_addr;
1812             socklen_t addrlen;
1813 
1814             if (get_user_ual(sockfd, vptr)
1815                 || get_user_ual(target_addr, vptr + n)
1816                 || get_user_ual(addrlen, vptr + 2 * n))
1817                 return -TARGET_EFAULT;
1818 
1819             ret = do_connect(sockfd, target_addr, addrlen);
1820         }
1821         break;
1822     case SOCKOP_listen:
1823         {
1824             abi_ulong sockfd, backlog;
1825 
1826             if (get_user_ual(sockfd, vptr)
1827                 || get_user_ual(backlog, vptr + n))
1828                 return -TARGET_EFAULT;
1829 
1830             ret = get_errno(listen(sockfd, backlog));
1831         }
1832         break;
1833     case SOCKOP_accept:
1834         {
1835             abi_ulong sockfd;
1836             abi_ulong target_addr, target_addrlen;
1837 
1838             if (get_user_ual(sockfd, vptr)
1839                 || get_user_ual(target_addr, vptr + n)
1840                 || get_user_ual(target_addrlen, vptr + 2 * n))
1841                 return -TARGET_EFAULT;
1842 
1843             ret = do_accept(sockfd, target_addr, target_addrlen);
1844         }
1845         break;
1846     case SOCKOP_getsockname:
1847         {
1848             abi_ulong sockfd;
1849             abi_ulong target_addr, target_addrlen;
1850 
1851             if (get_user_ual(sockfd, vptr)
1852                 || get_user_ual(target_addr, vptr + n)
1853                 || get_user_ual(target_addrlen, vptr + 2 * n))
1854                 return -TARGET_EFAULT;
1855 
1856             ret = do_getsockname(sockfd, target_addr, target_addrlen);
1857         }
1858         break;
1859     case SOCKOP_getpeername:
1860         {
1861             abi_ulong sockfd;
1862             abi_ulong target_addr, target_addrlen;
1863 
1864             if (get_user_ual(sockfd, vptr)
1865                 || get_user_ual(target_addr, vptr + n)
1866                 || get_user_ual(target_addrlen, vptr + 2 * n))
1867                 return -TARGET_EFAULT;
1868 
1869             ret = do_getpeername(sockfd, target_addr, target_addrlen);
1870         }
1871         break;
1872     case SOCKOP_socketpair:
1873         {
1874             abi_ulong domain, type, protocol;
1875             abi_ulong tab;
1876 
1877             if (get_user_ual(domain, vptr)
1878                 || get_user_ual(type, vptr + n)
1879                 || get_user_ual(protocol, vptr + 2 * n)
1880                 || get_user_ual(tab, vptr + 3 * n))
1881                 return -TARGET_EFAULT;
1882 
1883             ret = do_socketpair(domain, type, protocol, tab);
1884         }
1885         break;
1886     case SOCKOP_send:
1887         {
1888             abi_ulong sockfd;
1889             abi_ulong msg;
1890             size_t len;
1891             abi_ulong flags;
1892 
1893             if (get_user_ual(sockfd, vptr)
1894                 || get_user_ual(msg, vptr + n)
1895                 || get_user_ual(len, vptr + 2 * n)
1896                 || get_user_ual(flags, vptr + 3 * n))
1897                 return -TARGET_EFAULT;
1898 
1899             ret = do_sendto(sockfd, msg, len, flags, 0, 0);
1900         }
1901         break;
1902     case SOCKOP_recv:
1903         {
1904             abi_ulong sockfd;
1905             abi_ulong msg;
1906             size_t len;
1907             abi_ulong flags;
1908 
1909             if (get_user_ual(sockfd, vptr)
1910                 || get_user_ual(msg, vptr + n)
1911                 || get_user_ual(len, vptr + 2 * n)
1912                 || get_user_ual(flags, vptr + 3 * n))
1913                 return -TARGET_EFAULT;
1914 
1915             ret = do_recvfrom(sockfd, msg, len, flags, 0, 0);
1916         }
1917         break;
1918     case SOCKOP_sendto:
1919         {
1920             abi_ulong sockfd;
1921             abi_ulong msg;
1922             size_t len;
1923             abi_ulong flags;
1924             abi_ulong addr;
1925             socklen_t addrlen;
1926 
1927             if (get_user_ual(sockfd, vptr)
1928                 || get_user_ual(msg, vptr + n)
1929                 || get_user_ual(len, vptr + 2 * n)
1930                 || get_user_ual(flags, vptr + 3 * n)
1931                 || get_user_ual(addr, vptr + 4 * n)
1932                 || get_user_ual(addrlen, vptr + 5 * n))
1933                 return -TARGET_EFAULT;
1934 
1935             ret = do_sendto(sockfd, msg, len, flags, addr, addrlen);
1936         }
1937         break;
1938     case SOCKOP_recvfrom:
1939         {
1940             abi_ulong sockfd;
1941             abi_ulong msg;
1942             size_t len;
1943             abi_ulong flags;
1944             abi_ulong addr;
1945             socklen_t addrlen;
1946 
1947             if (get_user_ual(sockfd, vptr)
1948                 || get_user_ual(msg, vptr + n)
1949                 || get_user_ual(len, vptr + 2 * n)
1950                 || get_user_ual(flags, vptr + 3 * n)
1951                 || get_user_ual(addr, vptr + 4 * n)
1952                 || get_user_ual(addrlen, vptr + 5 * n))
1953                 return -TARGET_EFAULT;
1954 
1955             ret = do_recvfrom(sockfd, msg, len, flags, addr, addrlen);
1956         }
1957         break;
1958     case SOCKOP_shutdown:
1959         {
1960             abi_ulong sockfd, how;
1961 
1962             if (get_user_ual(sockfd, vptr)
1963                 || get_user_ual(how, vptr + n))
1964                 return -TARGET_EFAULT;
1965 
1966             ret = get_errno(shutdown(sockfd, how));
1967         }
1968         break;
1969     case SOCKOP_sendmsg:
1970     case SOCKOP_recvmsg:
1971         {
1972             abi_ulong fd;
1973             abi_ulong target_msg;
1974             abi_ulong flags;
1975 
1976             if (get_user_ual(fd, vptr)
1977                 || get_user_ual(target_msg, vptr + n)
1978                 || get_user_ual(flags, vptr + 2 * n))
1979                 return -TARGET_EFAULT;
1980 
1981             ret = do_sendrecvmsg(fd, target_msg, flags,
1982                                  (num == SOCKOP_sendmsg));
1983         }
1984         break;
1985     case SOCKOP_setsockopt:
1986         {
1987             abi_ulong sockfd;
1988             abi_ulong level;
1989             abi_ulong optname;
1990             abi_ulong optval;
1991             socklen_t optlen;
1992 
1993             if (get_user_ual(sockfd, vptr)
1994                 || get_user_ual(level, vptr + n)
1995                 || get_user_ual(optname, vptr + 2 * n)
1996                 || get_user_ual(optval, vptr + 3 * n)
1997                 || get_user_ual(optlen, vptr + 4 * n))
1998                 return -TARGET_EFAULT;
1999 
2000             ret = do_setsockopt(sockfd, level, optname, optval, optlen);
2001         }
2002         break;
2003     case SOCKOP_getsockopt:
2004         {
2005             abi_ulong sockfd;
2006             abi_ulong level;
2007             abi_ulong optname;
2008             abi_ulong optval;
2009             socklen_t optlen;
2010 
2011             if (get_user_ual(sockfd, vptr)
2012                 || get_user_ual(level, vptr + n)
2013                 || get_user_ual(optname, vptr + 2 * n)
2014                 || get_user_ual(optval, vptr + 3 * n)
2015                 || get_user_ual(optlen, vptr + 4 * n))
2016                 return -TARGET_EFAULT;
2017 
2018             ret = do_getsockopt(sockfd, level, optname, optval, optlen);
2019         }
2020         break;
2021     default:
2022         gemu_log("Unsupported socketcall: %d\n", num);
2023         ret = -TARGET_ENOSYS;
2024         break;
2025     }
2026     return ret;
2027 }
2028 #endif
2029 
2030 #define N_SHM_REGIONS	32
2031 
2032 static struct shm_region {
2033     abi_ulong	start;
2034     abi_ulong	size;
2035 } shm_regions[N_SHM_REGIONS];
2036 
2037 struct target_ipc_perm
2038 {
2039     abi_long __key;
2040     abi_ulong uid;
2041     abi_ulong gid;
2042     abi_ulong cuid;
2043     abi_ulong cgid;
2044     unsigned short int mode;
2045     unsigned short int __pad1;
2046     unsigned short int __seq;
2047     unsigned short int __pad2;
2048     abi_ulong __unused1;
2049     abi_ulong __unused2;
2050 };
2051 
2052 struct target_semid_ds
2053 {
2054   struct target_ipc_perm sem_perm;
2055   abi_ulong sem_otime;
2056   abi_ulong __unused1;
2057   abi_ulong sem_ctime;
2058   abi_ulong __unused2;
2059   abi_ulong sem_nsems;
2060   abi_ulong __unused3;
2061   abi_ulong __unused4;
2062 };
2063 
2064 static inline abi_long target_to_host_ipc_perm(struct ipc_perm *host_ip,
2065                                                abi_ulong target_addr)
2066 {
2067     struct target_ipc_perm *target_ip;
2068     struct target_semid_ds *target_sd;
2069 
2070     if (!lock_user_struct(VERIFY_READ, target_sd, target_addr, 1))
2071         return -TARGET_EFAULT;
2072     target_ip = &(target_sd->sem_perm);
2073     host_ip->__key = tswapl(target_ip->__key);
2074     host_ip->uid = tswapl(target_ip->uid);
2075     host_ip->gid = tswapl(target_ip->gid);
2076     host_ip->cuid = tswapl(target_ip->cuid);
2077     host_ip->cgid = tswapl(target_ip->cgid);
2078     host_ip->mode = tswapl(target_ip->mode);
2079     unlock_user_struct(target_sd, target_addr, 0);
2080     return 0;
2081 }
2082 
2083 static inline abi_long host_to_target_ipc_perm(abi_ulong target_addr,
2084                                                struct ipc_perm *host_ip)
2085 {
2086     struct target_ipc_perm *target_ip;
2087     struct target_semid_ds *target_sd;
2088 
2089     if (!lock_user_struct(VERIFY_WRITE, target_sd, target_addr, 0))
2090         return -TARGET_EFAULT;
2091     target_ip = &(target_sd->sem_perm);
2092     target_ip->__key = tswapl(host_ip->__key);
2093     target_ip->uid = tswapl(host_ip->uid);
2094     target_ip->gid = tswapl(host_ip->gid);
2095     target_ip->cuid = tswapl(host_ip->cuid);
2096     target_ip->cgid = tswapl(host_ip->cgid);
2097     target_ip->mode = tswapl(host_ip->mode);
2098     unlock_user_struct(target_sd, target_addr, 1);
2099     return 0;
2100 }
2101 
2102 static inline abi_long target_to_host_semid_ds(struct semid_ds *host_sd,
2103                                                abi_ulong target_addr)
2104 {
2105     struct target_semid_ds *target_sd;
2106 
2107     if (!lock_user_struct(VERIFY_READ, target_sd, target_addr, 1))
2108         return -TARGET_EFAULT;
2109     if (target_to_host_ipc_perm(&(host_sd->sem_perm),target_addr))
2110         return -TARGET_EFAULT;
2111     host_sd->sem_nsems = tswapl(target_sd->sem_nsems);
2112     host_sd->sem_otime = tswapl(target_sd->sem_otime);
2113     host_sd->sem_ctime = tswapl(target_sd->sem_ctime);
2114     unlock_user_struct(target_sd, target_addr, 0);
2115     return 0;
2116 }
2117 
2118 static inline abi_long host_to_target_semid_ds(abi_ulong target_addr,
2119                                                struct semid_ds *host_sd)
2120 {
2121     struct target_semid_ds *target_sd;
2122 
2123     if (!lock_user_struct(VERIFY_WRITE, target_sd, target_addr, 0))
2124         return -TARGET_EFAULT;
2125     if (host_to_target_ipc_perm(target_addr,&(host_sd->sem_perm)))
2126         return -TARGET_EFAULT;;
2127     target_sd->sem_nsems = tswapl(host_sd->sem_nsems);
2128     target_sd->sem_otime = tswapl(host_sd->sem_otime);
2129     target_sd->sem_ctime = tswapl(host_sd->sem_ctime);
2130     unlock_user_struct(target_sd, target_addr, 1);
2131     return 0;
2132 }
2133 
2134 struct target_seminfo {
2135     int semmap;
2136     int semmni;
2137     int semmns;
2138     int semmnu;
2139     int semmsl;
2140     int semopm;
2141     int semume;
2142     int semusz;
2143     int semvmx;
2144     int semaem;
2145 };
2146 
2147 static inline abi_long host_to_target_seminfo(abi_ulong target_addr,
2148                                               struct seminfo *host_seminfo)
2149 {
2150     struct target_seminfo *target_seminfo;
2151     if (!lock_user_struct(VERIFY_WRITE, target_seminfo, target_addr, 0))
2152         return -TARGET_EFAULT;
2153     __put_user(host_seminfo->semmap, &target_seminfo->semmap);
2154     __put_user(host_seminfo->semmni, &target_seminfo->semmni);
2155     __put_user(host_seminfo->semmns, &target_seminfo->semmns);
2156     __put_user(host_seminfo->semmnu, &target_seminfo->semmnu);
2157     __put_user(host_seminfo->semmsl, &target_seminfo->semmsl);
2158     __put_user(host_seminfo->semopm, &target_seminfo->semopm);
2159     __put_user(host_seminfo->semume, &target_seminfo->semume);
2160     __put_user(host_seminfo->semusz, &target_seminfo->semusz);
2161     __put_user(host_seminfo->semvmx, &target_seminfo->semvmx);
2162     __put_user(host_seminfo->semaem, &target_seminfo->semaem);
2163     unlock_user_struct(target_seminfo, target_addr, 1);
2164     return 0;
2165 }
2166 
2167 union semun {
2168 	int val;
2169 	struct semid_ds *buf;
2170 	unsigned short *array;
2171 	struct seminfo *__buf;
2172 };
2173 
2174 union target_semun {
2175 	int val;
2176 	abi_ulong buf;
2177 	abi_ulong array;
2178 	abi_ulong __buf;
2179 };
2180 
2181 static inline abi_long target_to_host_semarray(int semid, unsigned short **host_array,
2182                                                abi_ulong target_addr)
2183 {
2184     int nsems;
2185     unsigned short *array;
2186     union semun semun;
2187     struct semid_ds semid_ds;
2188     int i, ret;
2189 
2190     semun.buf = &semid_ds;
2191 
2192     ret = semctl(semid, 0, IPC_STAT, semun);
2193     if (ret == -1)
2194         return get_errno(ret);
2195 
2196     nsems = semid_ds.sem_nsems;
2197 
2198     *host_array = malloc(nsems*sizeof(unsigned short));
2199     array = lock_user(VERIFY_READ, target_addr,
2200                       nsems*sizeof(unsigned short), 1);
2201     if (!array)
2202         return -TARGET_EFAULT;
2203 
2204     for(i=0; i<nsems; i++) {
2205         __get_user((*host_array)[i], &array[i]);
2206     }
2207     unlock_user(array, target_addr, 0);
2208 
2209     return 0;
2210 }
2211 
2212 static inline abi_long host_to_target_semarray(int semid, abi_ulong target_addr,
2213                                                unsigned short **host_array)
2214 {
2215     int nsems;
2216     unsigned short *array;
2217     union semun semun;
2218     struct semid_ds semid_ds;
2219     int i, ret;
2220 
2221     semun.buf = &semid_ds;
2222 
2223     ret = semctl(semid, 0, IPC_STAT, semun);
2224     if (ret == -1)
2225         return get_errno(ret);
2226 
2227     nsems = semid_ds.sem_nsems;
2228 
2229     array = lock_user(VERIFY_WRITE, target_addr,
2230                       nsems*sizeof(unsigned short), 0);
2231     if (!array)
2232         return -TARGET_EFAULT;
2233 
2234     for(i=0; i<nsems; i++) {
2235         __put_user((*host_array)[i], &array[i]);
2236     }
2237     free(*host_array);
2238     unlock_user(array, target_addr, 1);
2239 
2240     return 0;
2241 }
2242 
2243 static inline abi_long do_semctl(int semid, int semnum, int cmd,
2244                                  union target_semun target_su)
2245 {
2246     union semun arg;
2247     struct semid_ds dsarg;
2248     unsigned short *array = NULL;
2249     struct seminfo seminfo;
2250     abi_long ret = -TARGET_EINVAL;
2251     abi_long err;
2252     cmd &= 0xff;
2253 
2254     switch( cmd ) {
2255 	case GETVAL:
2256 	case SETVAL:
2257             arg.val = tswapl(target_su.val);
2258             ret = get_errno(semctl(semid, semnum, cmd, arg));
2259             target_su.val = tswapl(arg.val);
2260             break;
2261 	case GETALL:
2262 	case SETALL:
2263             err = target_to_host_semarray(semid, &array, target_su.array);
2264             if (err)
2265                 return err;
2266             arg.array = array;
2267             ret = get_errno(semctl(semid, semnum, cmd, arg));
2268             err = host_to_target_semarray(semid, target_su.array, &array);
2269             if (err)
2270                 return err;
2271             break;
2272 	case IPC_STAT:
2273 	case IPC_SET:
2274 	case SEM_STAT:
2275             err = target_to_host_semid_ds(&dsarg, target_su.buf);
2276             if (err)
2277                 return err;
2278             arg.buf = &dsarg;
2279             ret = get_errno(semctl(semid, semnum, cmd, arg));
2280             err = host_to_target_semid_ds(target_su.buf, &dsarg);
2281             if (err)
2282                 return err;
2283             break;
2284 	case IPC_INFO:
2285 	case SEM_INFO:
2286             arg.__buf = &seminfo;
2287             ret = get_errno(semctl(semid, semnum, cmd, arg));
2288             err = host_to_target_seminfo(target_su.__buf, &seminfo);
2289             if (err)
2290                 return err;
2291             break;
2292 	case IPC_RMID:
2293 	case GETPID:
2294 	case GETNCNT:
2295 	case GETZCNT:
2296             ret = get_errno(semctl(semid, semnum, cmd, NULL));
2297             break;
2298     }
2299 
2300     return ret;
2301 }
2302 
2303 struct target_sembuf {
2304     unsigned short sem_num;
2305     short sem_op;
2306     short sem_flg;
2307 };
2308 
2309 static inline abi_long target_to_host_sembuf(struct sembuf *host_sembuf,
2310                                              abi_ulong target_addr,
2311                                              unsigned nsops)
2312 {
2313     struct target_sembuf *target_sembuf;
2314     int i;
2315 
2316     target_sembuf = lock_user(VERIFY_READ, target_addr,
2317                               nsops*sizeof(struct target_sembuf), 1);
2318     if (!target_sembuf)
2319         return -TARGET_EFAULT;
2320 
2321     for(i=0; i<nsops; i++) {
2322         __get_user(host_sembuf[i].sem_num, &target_sembuf[i].sem_num);
2323         __get_user(host_sembuf[i].sem_op, &target_sembuf[i].sem_op);
2324         __get_user(host_sembuf[i].sem_flg, &target_sembuf[i].sem_flg);
2325     }
2326 
2327     unlock_user(target_sembuf, target_addr, 0);
2328 
2329     return 0;
2330 }
2331 
2332 static inline abi_long do_semop(int semid, abi_long ptr, unsigned nsops)
2333 {
2334     struct sembuf sops[nsops];
2335 
2336     if (target_to_host_sembuf(sops, ptr, nsops))
2337         return -TARGET_EFAULT;
2338 
2339     return semop(semid, sops, nsops);
2340 }
2341 
2342 struct target_msqid_ds
2343 {
2344     struct target_ipc_perm msg_perm;
2345     abi_ulong msg_stime;
2346 #if TARGET_ABI_BITS == 32
2347     abi_ulong __unused1;
2348 #endif
2349     abi_ulong msg_rtime;
2350 #if TARGET_ABI_BITS == 32
2351     abi_ulong __unused2;
2352 #endif
2353     abi_ulong msg_ctime;
2354 #if TARGET_ABI_BITS == 32
2355     abi_ulong __unused3;
2356 #endif
2357     abi_ulong __msg_cbytes;
2358     abi_ulong msg_qnum;
2359     abi_ulong msg_qbytes;
2360     abi_ulong msg_lspid;
2361     abi_ulong msg_lrpid;
2362     abi_ulong __unused4;
2363     abi_ulong __unused5;
2364 };
2365 
2366 static inline abi_long target_to_host_msqid_ds(struct msqid_ds *host_md,
2367                                                abi_ulong target_addr)
2368 {
2369     struct target_msqid_ds *target_md;
2370 
2371     if (!lock_user_struct(VERIFY_READ, target_md, target_addr, 1))
2372         return -TARGET_EFAULT;
2373     if (target_to_host_ipc_perm(&(host_md->msg_perm),target_addr))
2374         return -TARGET_EFAULT;
2375     host_md->msg_stime = tswapl(target_md->msg_stime);
2376     host_md->msg_rtime = tswapl(target_md->msg_rtime);
2377     host_md->msg_ctime = tswapl(target_md->msg_ctime);
2378     host_md->__msg_cbytes = tswapl(target_md->__msg_cbytes);
2379     host_md->msg_qnum = tswapl(target_md->msg_qnum);
2380     host_md->msg_qbytes = tswapl(target_md->msg_qbytes);
2381     host_md->msg_lspid = tswapl(target_md->msg_lspid);
2382     host_md->msg_lrpid = tswapl(target_md->msg_lrpid);
2383     unlock_user_struct(target_md, target_addr, 0);
2384     return 0;
2385 }
2386 
2387 static inline abi_long host_to_target_msqid_ds(abi_ulong target_addr,
2388                                                struct msqid_ds *host_md)
2389 {
2390     struct target_msqid_ds *target_md;
2391 
2392     if (!lock_user_struct(VERIFY_WRITE, target_md, target_addr, 0))
2393         return -TARGET_EFAULT;
2394     if (host_to_target_ipc_perm(target_addr,&(host_md->msg_perm)))
2395         return -TARGET_EFAULT;
2396     target_md->msg_stime = tswapl(host_md->msg_stime);
2397     target_md->msg_rtime = tswapl(host_md->msg_rtime);
2398     target_md->msg_ctime = tswapl(host_md->msg_ctime);
2399     target_md->__msg_cbytes = tswapl(host_md->__msg_cbytes);
2400     target_md->msg_qnum = tswapl(host_md->msg_qnum);
2401     target_md->msg_qbytes = tswapl(host_md->msg_qbytes);
2402     target_md->msg_lspid = tswapl(host_md->msg_lspid);
2403     target_md->msg_lrpid = tswapl(host_md->msg_lrpid);
2404     unlock_user_struct(target_md, target_addr, 1);
2405     return 0;
2406 }
2407 
2408 struct target_msginfo {
2409     int msgpool;
2410     int msgmap;
2411     int msgmax;
2412     int msgmnb;
2413     int msgmni;
2414     int msgssz;
2415     int msgtql;
2416     unsigned short int msgseg;
2417 };
2418 
2419 static inline abi_long host_to_target_msginfo(abi_ulong target_addr,
2420                                               struct msginfo *host_msginfo)
2421 {
2422     struct target_msginfo *target_msginfo;
2423     if (!lock_user_struct(VERIFY_WRITE, target_msginfo, target_addr, 0))
2424         return -TARGET_EFAULT;
2425     __put_user(host_msginfo->msgpool, &target_msginfo->msgpool);
2426     __put_user(host_msginfo->msgmap, &target_msginfo->msgmap);
2427     __put_user(host_msginfo->msgmax, &target_msginfo->msgmax);
2428     __put_user(host_msginfo->msgmnb, &target_msginfo->msgmnb);
2429     __put_user(host_msginfo->msgmni, &target_msginfo->msgmni);
2430     __put_user(host_msginfo->msgssz, &target_msginfo->msgssz);
2431     __put_user(host_msginfo->msgtql, &target_msginfo->msgtql);
2432     __put_user(host_msginfo->msgseg, &target_msginfo->msgseg);
2433     unlock_user_struct(target_msginfo, target_addr, 1);
2434     return 0;
2435 }
2436 
2437 static inline abi_long do_msgctl(int msgid, int cmd, abi_long ptr)
2438 {
2439     struct msqid_ds dsarg;
2440     struct msginfo msginfo;
2441     abi_long ret = -TARGET_EINVAL;
2442 
2443     cmd &= 0xff;
2444 
2445     switch (cmd) {
2446     case IPC_STAT:
2447     case IPC_SET:
2448     case MSG_STAT:
2449         if (target_to_host_msqid_ds(&dsarg,ptr))
2450             return -TARGET_EFAULT;
2451         ret = get_errno(msgctl(msgid, cmd, &dsarg));
2452         if (host_to_target_msqid_ds(ptr,&dsarg))
2453             return -TARGET_EFAULT;
2454         break;
2455     case IPC_RMID:
2456         ret = get_errno(msgctl(msgid, cmd, NULL));
2457         break;
2458     case IPC_INFO:
2459     case MSG_INFO:
2460         ret = get_errno(msgctl(msgid, cmd, (struct msqid_ds *)&msginfo));
2461         if (host_to_target_msginfo(ptr, &msginfo))
2462             return -TARGET_EFAULT;
2463         break;
2464     }
2465 
2466     return ret;
2467 }
2468 
2469 struct target_msgbuf {
2470     abi_long mtype;
2471     char	mtext[1];
2472 };
2473 
2474 static inline abi_long do_msgsnd(int msqid, abi_long msgp,
2475                                  unsigned int msgsz, int msgflg)
2476 {
2477     struct target_msgbuf *target_mb;
2478     struct msgbuf *host_mb;
2479     abi_long ret = 0;
2480 
2481     if (!lock_user_struct(VERIFY_READ, target_mb, msgp, 0))
2482         return -TARGET_EFAULT;
2483     host_mb = malloc(msgsz+sizeof(long));
2484     host_mb->mtype = (abi_long) tswapl(target_mb->mtype);
2485     memcpy(host_mb->mtext, target_mb->mtext, msgsz);
2486     ret = get_errno(msgsnd(msqid, host_mb, msgsz, msgflg));
2487     free(host_mb);
2488     unlock_user_struct(target_mb, msgp, 0);
2489 
2490     return ret;
2491 }
2492 
2493 static inline abi_long do_msgrcv(int msqid, abi_long msgp,
2494                                  unsigned int msgsz, abi_long msgtyp,
2495                                  int msgflg)
2496 {
2497     struct target_msgbuf *target_mb;
2498     char *target_mtext;
2499     struct msgbuf *host_mb;
2500     abi_long ret = 0;
2501 
2502     if (!lock_user_struct(VERIFY_WRITE, target_mb, msgp, 0))
2503         return -TARGET_EFAULT;
2504 
2505     host_mb = malloc(msgsz+sizeof(long));
2506     ret = get_errno(msgrcv(msqid, host_mb, msgsz, tswapl(msgtyp), msgflg));
2507 
2508     if (ret > 0) {
2509         abi_ulong target_mtext_addr = msgp + sizeof(abi_ulong);
2510         target_mtext = lock_user(VERIFY_WRITE, target_mtext_addr, ret, 0);
2511         if (!target_mtext) {
2512             ret = -TARGET_EFAULT;
2513             goto end;
2514         }
2515         memcpy(target_mb->mtext, host_mb->mtext, ret);
2516         unlock_user(target_mtext, target_mtext_addr, ret);
2517     }
2518 
2519     target_mb->mtype = tswapl(host_mb->mtype);
2520     free(host_mb);
2521 
2522 end:
2523     if (target_mb)
2524         unlock_user_struct(target_mb, msgp, 1);
2525     return ret;
2526 }
2527 
2528 struct target_shmid_ds
2529 {
2530     struct target_ipc_perm shm_perm;
2531     abi_ulong shm_segsz;
2532     abi_ulong shm_atime;
2533 #if TARGET_ABI_BITS == 32
2534     abi_ulong __unused1;
2535 #endif
2536     abi_ulong shm_dtime;
2537 #if TARGET_ABI_BITS == 32
2538     abi_ulong __unused2;
2539 #endif
2540     abi_ulong shm_ctime;
2541 #if TARGET_ABI_BITS == 32
2542     abi_ulong __unused3;
2543 #endif
2544     int shm_cpid;
2545     int shm_lpid;
2546     abi_ulong shm_nattch;
2547     unsigned long int __unused4;
2548     unsigned long int __unused5;
2549 };
2550 
2551 static inline abi_long target_to_host_shmid_ds(struct shmid_ds *host_sd,
2552                                                abi_ulong target_addr)
2553 {
2554     struct target_shmid_ds *target_sd;
2555 
2556     if (!lock_user_struct(VERIFY_READ, target_sd, target_addr, 1))
2557         return -TARGET_EFAULT;
2558     if (target_to_host_ipc_perm(&(host_sd->shm_perm), target_addr))
2559         return -TARGET_EFAULT;
2560     __get_user(host_sd->shm_segsz, &target_sd->shm_segsz);
2561     __get_user(host_sd->shm_atime, &target_sd->shm_atime);
2562     __get_user(host_sd->shm_dtime, &target_sd->shm_dtime);
2563     __get_user(host_sd->shm_ctime, &target_sd->shm_ctime);
2564     __get_user(host_sd->shm_cpid, &target_sd->shm_cpid);
2565     __get_user(host_sd->shm_lpid, &target_sd->shm_lpid);
2566     __get_user(host_sd->shm_nattch, &target_sd->shm_nattch);
2567     unlock_user_struct(target_sd, target_addr, 0);
2568     return 0;
2569 }
2570 
2571 static inline abi_long host_to_target_shmid_ds(abi_ulong target_addr,
2572                                                struct shmid_ds *host_sd)
2573 {
2574     struct target_shmid_ds *target_sd;
2575 
2576     if (!lock_user_struct(VERIFY_WRITE, target_sd, target_addr, 0))
2577         return -TARGET_EFAULT;
2578     if (host_to_target_ipc_perm(target_addr, &(host_sd->shm_perm)))
2579         return -TARGET_EFAULT;
2580     __put_user(host_sd->shm_segsz, &target_sd->shm_segsz);
2581     __put_user(host_sd->shm_atime, &target_sd->shm_atime);
2582     __put_user(host_sd->shm_dtime, &target_sd->shm_dtime);
2583     __put_user(host_sd->shm_ctime, &target_sd->shm_ctime);
2584     __put_user(host_sd->shm_cpid, &target_sd->shm_cpid);
2585     __put_user(host_sd->shm_lpid, &target_sd->shm_lpid);
2586     __put_user(host_sd->shm_nattch, &target_sd->shm_nattch);
2587     unlock_user_struct(target_sd, target_addr, 1);
2588     return 0;
2589 }
2590 
2591 struct  target_shminfo {
2592     abi_ulong shmmax;
2593     abi_ulong shmmin;
2594     abi_ulong shmmni;
2595     abi_ulong shmseg;
2596     abi_ulong shmall;
2597 };
2598 
2599 static inline abi_long host_to_target_shminfo(abi_ulong target_addr,
2600                                               struct shminfo *host_shminfo)
2601 {
2602     struct target_shminfo *target_shminfo;
2603     if (!lock_user_struct(VERIFY_WRITE, target_shminfo, target_addr, 0))
2604         return -TARGET_EFAULT;
2605     __put_user(host_shminfo->shmmax, &target_shminfo->shmmax);
2606     __put_user(host_shminfo->shmmin, &target_shminfo->shmmin);
2607     __put_user(host_shminfo->shmmni, &target_shminfo->shmmni);
2608     __put_user(host_shminfo->shmseg, &target_shminfo->shmseg);
2609     __put_user(host_shminfo->shmall, &target_shminfo->shmall);
2610     unlock_user_struct(target_shminfo, target_addr, 1);
2611     return 0;
2612 }
2613 
2614 struct target_shm_info {
2615     int used_ids;
2616     abi_ulong shm_tot;
2617     abi_ulong shm_rss;
2618     abi_ulong shm_swp;
2619     abi_ulong swap_attempts;
2620     abi_ulong swap_successes;
2621 };
2622 
2623 static inline abi_long host_to_target_shm_info(abi_ulong target_addr,
2624                                                struct shm_info *host_shm_info)
2625 {
2626     struct target_shm_info *target_shm_info;
2627     if (!lock_user_struct(VERIFY_WRITE, target_shm_info, target_addr, 0))
2628         return -TARGET_EFAULT;
2629     __put_user(host_shm_info->used_ids, &target_shm_info->used_ids);
2630     __put_user(host_shm_info->shm_tot, &target_shm_info->shm_tot);
2631     __put_user(host_shm_info->shm_rss, &target_shm_info->shm_rss);
2632     __put_user(host_shm_info->shm_swp, &target_shm_info->shm_swp);
2633     __put_user(host_shm_info->swap_attempts, &target_shm_info->swap_attempts);
2634     __put_user(host_shm_info->swap_successes, &target_shm_info->swap_successes);
2635     unlock_user_struct(target_shm_info, target_addr, 1);
2636     return 0;
2637 }
2638 
2639 static inline abi_long do_shmctl(int shmid, int cmd, abi_long buf)
2640 {
2641     struct shmid_ds dsarg;
2642     struct shminfo shminfo;
2643     struct shm_info shm_info;
2644     abi_long ret = -TARGET_EINVAL;
2645 
2646     cmd &= 0xff;
2647 
2648     switch(cmd) {
2649     case IPC_STAT:
2650     case IPC_SET:
2651     case SHM_STAT:
2652         if (target_to_host_shmid_ds(&dsarg, buf))
2653             return -TARGET_EFAULT;
2654         ret = get_errno(shmctl(shmid, cmd, &dsarg));
2655         if (host_to_target_shmid_ds(buf, &dsarg))
2656             return -TARGET_EFAULT;
2657         break;
2658     case IPC_INFO:
2659         ret = get_errno(shmctl(shmid, cmd, (struct shmid_ds *)&shminfo));
2660         if (host_to_target_shminfo(buf, &shminfo))
2661             return -TARGET_EFAULT;
2662         break;
2663     case SHM_INFO:
2664         ret = get_errno(shmctl(shmid, cmd, (struct shmid_ds *)&shm_info));
2665         if (host_to_target_shm_info(buf, &shm_info))
2666             return -TARGET_EFAULT;
2667         break;
2668     case IPC_RMID:
2669     case SHM_LOCK:
2670     case SHM_UNLOCK:
2671         ret = get_errno(shmctl(shmid, cmd, NULL));
2672         break;
2673     }
2674 
2675     return ret;
2676 }
2677 
2678 static inline abi_ulong do_shmat(int shmid, abi_ulong shmaddr, int shmflg)
2679 {
2680     abi_long raddr;
2681     void *host_raddr;
2682     struct shmid_ds shm_info;
2683     int i,ret;
2684 
2685     /* find out the length of the shared memory segment */
2686     ret = get_errno(shmctl(shmid, IPC_STAT, &shm_info));
2687     if (is_error(ret)) {
2688         /* can't get length, bail out */
2689         return ret;
2690     }
2691 
2692     mmap_lock();
2693 
2694     if (shmaddr)
2695         host_raddr = shmat(shmid, (void *)g2h(shmaddr), shmflg);
2696     else {
2697         abi_ulong mmap_start;
2698 
2699         mmap_start = mmap_find_vma(0, shm_info.shm_segsz);
2700 
2701         if (mmap_start == -1) {
2702             errno = ENOMEM;
2703             host_raddr = (void *)-1;
2704         } else
2705             host_raddr = shmat(shmid, g2h(mmap_start), shmflg | SHM_REMAP);
2706     }
2707 
2708     if (host_raddr == (void *)-1) {
2709         mmap_unlock();
2710         return get_errno((long)host_raddr);
2711     }
2712     raddr=h2g((unsigned long)host_raddr);
2713 
2714     page_set_flags(raddr, raddr + shm_info.shm_segsz,
2715                    PAGE_VALID | PAGE_READ |
2716                    ((shmflg & SHM_RDONLY)? 0 : PAGE_WRITE));
2717 
2718     for (i = 0; i < N_SHM_REGIONS; i++) {
2719         if (shm_regions[i].start == 0) {
2720             shm_regions[i].start = raddr;
2721             shm_regions[i].size = shm_info.shm_segsz;
2722             break;
2723         }
2724     }
2725 
2726     mmap_unlock();
2727     return raddr;
2728 
2729 }
2730 
2731 static inline abi_long do_shmdt(abi_ulong shmaddr)
2732 {
2733     int i;
2734 
2735     for (i = 0; i < N_SHM_REGIONS; ++i) {
2736         if (shm_regions[i].start == shmaddr) {
2737             shm_regions[i].start = 0;
2738             page_set_flags(shmaddr, shm_regions[i].size, 0);
2739             break;
2740         }
2741     }
2742 
2743     return get_errno(shmdt(g2h(shmaddr)));
2744 }
2745 
2746 #ifdef TARGET_NR_ipc
2747 /* ??? This only works with linear mappings.  */
2748 /* do_ipc() must return target values and target errnos. */
2749 static abi_long do_ipc(unsigned int call, int first,
2750                        int second, int third,
2751                        abi_long ptr, abi_long fifth)
2752 {
2753     int version;
2754     abi_long ret = 0;
2755 
2756     version = call >> 16;
2757     call &= 0xffff;
2758 
2759     switch (call) {
2760     case IPCOP_semop:
2761         ret = do_semop(first, ptr, second);
2762         break;
2763 
2764     case IPCOP_semget:
2765         ret = get_errno(semget(first, second, third));
2766         break;
2767 
2768     case IPCOP_semctl:
2769         ret = do_semctl(first, second, third, (union target_semun)(abi_ulong) ptr);
2770         break;
2771 
2772     case IPCOP_msgget:
2773         ret = get_errno(msgget(first, second));
2774         break;
2775 
2776     case IPCOP_msgsnd:
2777         ret = do_msgsnd(first, ptr, second, third);
2778         break;
2779 
2780     case IPCOP_msgctl:
2781         ret = do_msgctl(first, second, ptr);
2782         break;
2783 
2784     case IPCOP_msgrcv:
2785         switch (version) {
2786         case 0:
2787             {
2788                 struct target_ipc_kludge {
2789                     abi_long msgp;
2790                     abi_long msgtyp;
2791                 } *tmp;
2792 
2793                 if (!lock_user_struct(VERIFY_READ, tmp, ptr, 1)) {
2794                     ret = -TARGET_EFAULT;
2795                     break;
2796                 }
2797 
2798                 ret = do_msgrcv(first, tmp->msgp, second, tmp->msgtyp, third);
2799 
2800                 unlock_user_struct(tmp, ptr, 0);
2801                 break;
2802             }
2803         default:
2804             ret = do_msgrcv(first, ptr, second, fifth, third);
2805         }
2806         break;
2807 
2808     case IPCOP_shmat:
2809         switch (version) {
2810         default:
2811         {
2812             abi_ulong raddr;
2813             raddr = do_shmat(first, ptr, second);
2814             if (is_error(raddr))
2815                 return get_errno(raddr);
2816             if (put_user_ual(raddr, third))
2817                 return -TARGET_EFAULT;
2818             break;
2819         }
2820         case 1:
2821             ret = -TARGET_EINVAL;
2822             break;
2823         }
2824 	break;
2825     case IPCOP_shmdt:
2826         ret = do_shmdt(ptr);
2827 	break;
2828 
2829     case IPCOP_shmget:
2830 	/* IPC_* flag values are the same on all linux platforms */
2831 	ret = get_errno(shmget(first, second, third));
2832 	break;
2833 
2834 	/* IPC_* and SHM_* command values are the same on all linux platforms */
2835     case IPCOP_shmctl:
2836         ret = do_shmctl(first, second, third);
2837         break;
2838     default:
2839 	gemu_log("Unsupported ipc call: %d (version %d)\n", call, version);
2840 	ret = -TARGET_ENOSYS;
2841 	break;
2842     }
2843     return ret;
2844 }
2845 #endif
2846 
2847 /* kernel structure types definitions */
2848 #define IFNAMSIZ        16
2849 
2850 #define STRUCT(name, ...) STRUCT_ ## name,
2851 #define STRUCT_SPECIAL(name) STRUCT_ ## name,
2852 enum {
2853 #include "syscall_types.h"
2854 };
2855 #undef STRUCT
2856 #undef STRUCT_SPECIAL
2857 
2858 #define STRUCT(name, ...) static const argtype struct_ ## name ## _def[] = {  __VA_ARGS__, TYPE_NULL };
2859 #define STRUCT_SPECIAL(name)
2860 #include "syscall_types.h"
2861 #undef STRUCT
2862 #undef STRUCT_SPECIAL
2863 
2864 typedef struct IOCTLEntry {
2865     unsigned int target_cmd;
2866     unsigned int host_cmd;
2867     const char *name;
2868     int access;
2869     const argtype arg_type[5];
2870 } IOCTLEntry;
2871 
2872 #define IOC_R 0x0001
2873 #define IOC_W 0x0002
2874 #define IOC_RW (IOC_R | IOC_W)
2875 
2876 #define MAX_STRUCT_SIZE 4096
2877 
2878 static IOCTLEntry ioctl_entries[] = {
2879 #define IOCTL(cmd, access, ...) \
2880     { TARGET_ ## cmd, cmd, #cmd, access, {  __VA_ARGS__ } },
2881 #include "ioctls.h"
2882     { 0, 0, },
2883 };
2884 
2885 /* ??? Implement proper locking for ioctls.  */
2886 /* do_ioctl() Must return target values and target errnos. */
2887 static abi_long do_ioctl(int fd, abi_long cmd, abi_long arg)
2888 {
2889     const IOCTLEntry *ie;
2890     const argtype *arg_type;
2891     abi_long ret;
2892     uint8_t buf_temp[MAX_STRUCT_SIZE];
2893     int target_size;
2894     void *argptr;
2895 
2896     ie = ioctl_entries;
2897     for(;;) {
2898         if (ie->target_cmd == 0) {
2899             gemu_log("Unsupported ioctl: cmd=0x%04lx\n", (long)cmd);
2900             return -TARGET_ENOSYS;
2901         }
2902         if (ie->target_cmd == cmd)
2903             break;
2904         ie++;
2905     }
2906     arg_type = ie->arg_type;
2907 #if defined(DEBUG)
2908     gemu_log("ioctl: cmd=0x%04lx (%s)\n", (long)cmd, ie->name);
2909 #endif
2910     switch(arg_type[0]) {
2911     case TYPE_NULL:
2912         /* no argument */
2913         ret = get_errno(ioctl(fd, ie->host_cmd));
2914         break;
2915     case TYPE_PTRVOID:
2916     case TYPE_INT:
2917         /* int argment */
2918         ret = get_errno(ioctl(fd, ie->host_cmd, arg));
2919         break;
2920     case TYPE_PTR:
2921         arg_type++;
2922         target_size = thunk_type_size(arg_type, 0);
2923         switch(ie->access) {
2924         case IOC_R:
2925             ret = get_errno(ioctl(fd, ie->host_cmd, buf_temp));
2926             if (!is_error(ret)) {
2927                 argptr = lock_user(VERIFY_WRITE, arg, target_size, 0);
2928                 if (!argptr)
2929                     return -TARGET_EFAULT;
2930                 thunk_convert(argptr, buf_temp, arg_type, THUNK_TARGET);
2931                 unlock_user(argptr, arg, target_size);
2932             }
2933             break;
2934         case IOC_W:
2935             argptr = lock_user(VERIFY_READ, arg, target_size, 1);
2936             if (!argptr)
2937                 return -TARGET_EFAULT;
2938             thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST);
2939             unlock_user(argptr, arg, 0);
2940             ret = get_errno(ioctl(fd, ie->host_cmd, buf_temp));
2941             break;
2942         default:
2943         case IOC_RW:
2944             argptr = lock_user(VERIFY_READ, arg, target_size, 1);
2945             if (!argptr)
2946                 return -TARGET_EFAULT;
2947             thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST);
2948             unlock_user(argptr, arg, 0);
2949             ret = get_errno(ioctl(fd, ie->host_cmd, buf_temp));
2950             if (!is_error(ret)) {
2951                 argptr = lock_user(VERIFY_WRITE, arg, target_size, 0);
2952                 if (!argptr)
2953                     return -TARGET_EFAULT;
2954                 thunk_convert(argptr, buf_temp, arg_type, THUNK_TARGET);
2955                 unlock_user(argptr, arg, target_size);
2956             }
2957             break;
2958         }
2959         break;
2960     default:
2961         gemu_log("Unsupported ioctl type: cmd=0x%04lx type=%d\n",
2962                  (long)cmd, arg_type[0]);
2963         ret = -TARGET_ENOSYS;
2964         break;
2965     }
2966     return ret;
2967 }
2968 
2969 static const bitmask_transtbl iflag_tbl[] = {
2970         { TARGET_IGNBRK, TARGET_IGNBRK, IGNBRK, IGNBRK },
2971         { TARGET_BRKINT, TARGET_BRKINT, BRKINT, BRKINT },
2972         { TARGET_IGNPAR, TARGET_IGNPAR, IGNPAR, IGNPAR },
2973         { TARGET_PARMRK, TARGET_PARMRK, PARMRK, PARMRK },
2974         { TARGET_INPCK, TARGET_INPCK, INPCK, INPCK },
2975         { TARGET_ISTRIP, TARGET_ISTRIP, ISTRIP, ISTRIP },
2976         { TARGET_INLCR, TARGET_INLCR, INLCR, INLCR },
2977         { TARGET_IGNCR, TARGET_IGNCR, IGNCR, IGNCR },
2978         { TARGET_ICRNL, TARGET_ICRNL, ICRNL, ICRNL },
2979         { TARGET_IUCLC, TARGET_IUCLC, IUCLC, IUCLC },
2980         { TARGET_IXON, TARGET_IXON, IXON, IXON },
2981         { TARGET_IXANY, TARGET_IXANY, IXANY, IXANY },
2982         { TARGET_IXOFF, TARGET_IXOFF, IXOFF, IXOFF },
2983         { TARGET_IMAXBEL, TARGET_IMAXBEL, IMAXBEL, IMAXBEL },
2984         { 0, 0, 0, 0 }
2985 };
2986 
2987 static const bitmask_transtbl oflag_tbl[] = {
2988 	{ TARGET_OPOST, TARGET_OPOST, OPOST, OPOST },
2989 	{ TARGET_OLCUC, TARGET_OLCUC, OLCUC, OLCUC },
2990 	{ TARGET_ONLCR, TARGET_ONLCR, ONLCR, ONLCR },
2991 	{ TARGET_OCRNL, TARGET_OCRNL, OCRNL, OCRNL },
2992 	{ TARGET_ONOCR, TARGET_ONOCR, ONOCR, ONOCR },
2993 	{ TARGET_ONLRET, TARGET_ONLRET, ONLRET, ONLRET },
2994 	{ TARGET_OFILL, TARGET_OFILL, OFILL, OFILL },
2995 	{ TARGET_OFDEL, TARGET_OFDEL, OFDEL, OFDEL },
2996 	{ TARGET_NLDLY, TARGET_NL0, NLDLY, NL0 },
2997 	{ TARGET_NLDLY, TARGET_NL1, NLDLY, NL1 },
2998 	{ TARGET_CRDLY, TARGET_CR0, CRDLY, CR0 },
2999 	{ TARGET_CRDLY, TARGET_CR1, CRDLY, CR1 },
3000 	{ TARGET_CRDLY, TARGET_CR2, CRDLY, CR2 },
3001 	{ TARGET_CRDLY, TARGET_CR3, CRDLY, CR3 },
3002 	{ TARGET_TABDLY, TARGET_TAB0, TABDLY, TAB0 },
3003 	{ TARGET_TABDLY, TARGET_TAB1, TABDLY, TAB1 },
3004 	{ TARGET_TABDLY, TARGET_TAB2, TABDLY, TAB2 },
3005 	{ TARGET_TABDLY, TARGET_TAB3, TABDLY, TAB3 },
3006 	{ TARGET_BSDLY, TARGET_BS0, BSDLY, BS0 },
3007 	{ TARGET_BSDLY, TARGET_BS1, BSDLY, BS1 },
3008 	{ TARGET_VTDLY, TARGET_VT0, VTDLY, VT0 },
3009 	{ TARGET_VTDLY, TARGET_VT1, VTDLY, VT1 },
3010 	{ TARGET_FFDLY, TARGET_FF0, FFDLY, FF0 },
3011 	{ TARGET_FFDLY, TARGET_FF1, FFDLY, FF1 },
3012 	{ 0, 0, 0, 0 }
3013 };
3014 
3015 static const bitmask_transtbl cflag_tbl[] = {
3016 	{ TARGET_CBAUD, TARGET_B0, CBAUD, B0 },
3017 	{ TARGET_CBAUD, TARGET_B50, CBAUD, B50 },
3018 	{ TARGET_CBAUD, TARGET_B75, CBAUD, B75 },
3019 	{ TARGET_CBAUD, TARGET_B110, CBAUD, B110 },
3020 	{ TARGET_CBAUD, TARGET_B134, CBAUD, B134 },
3021 	{ TARGET_CBAUD, TARGET_B150, CBAUD, B150 },
3022 	{ TARGET_CBAUD, TARGET_B200, CBAUD, B200 },
3023 	{ TARGET_CBAUD, TARGET_B300, CBAUD, B300 },
3024 	{ TARGET_CBAUD, TARGET_B600, CBAUD, B600 },
3025 	{ TARGET_CBAUD, TARGET_B1200, CBAUD, B1200 },
3026 	{ TARGET_CBAUD, TARGET_B1800, CBAUD, B1800 },
3027 	{ TARGET_CBAUD, TARGET_B2400, CBAUD, B2400 },
3028 	{ TARGET_CBAUD, TARGET_B4800, CBAUD, B4800 },
3029 	{ TARGET_CBAUD, TARGET_B9600, CBAUD, B9600 },
3030 	{ TARGET_CBAUD, TARGET_B19200, CBAUD, B19200 },
3031 	{ TARGET_CBAUD, TARGET_B38400, CBAUD, B38400 },
3032 	{ TARGET_CBAUD, TARGET_B57600, CBAUD, B57600 },
3033 	{ TARGET_CBAUD, TARGET_B115200, CBAUD, B115200 },
3034 	{ TARGET_CBAUD, TARGET_B230400, CBAUD, B230400 },
3035 	{ TARGET_CBAUD, TARGET_B460800, CBAUD, B460800 },
3036 	{ TARGET_CSIZE, TARGET_CS5, CSIZE, CS5 },
3037 	{ TARGET_CSIZE, TARGET_CS6, CSIZE, CS6 },
3038 	{ TARGET_CSIZE, TARGET_CS7, CSIZE, CS7 },
3039 	{ TARGET_CSIZE, TARGET_CS8, CSIZE, CS8 },
3040 	{ TARGET_CSTOPB, TARGET_CSTOPB, CSTOPB, CSTOPB },
3041 	{ TARGET_CREAD, TARGET_CREAD, CREAD, CREAD },
3042 	{ TARGET_PARENB, TARGET_PARENB, PARENB, PARENB },
3043 	{ TARGET_PARODD, TARGET_PARODD, PARODD, PARODD },
3044 	{ TARGET_HUPCL, TARGET_HUPCL, HUPCL, HUPCL },
3045 	{ TARGET_CLOCAL, TARGET_CLOCAL, CLOCAL, CLOCAL },
3046 	{ TARGET_CRTSCTS, TARGET_CRTSCTS, CRTSCTS, CRTSCTS },
3047 	{ 0, 0, 0, 0 }
3048 };
3049 
3050 static const bitmask_transtbl lflag_tbl[] = {
3051 	{ TARGET_ISIG, TARGET_ISIG, ISIG, ISIG },
3052 	{ TARGET_ICANON, TARGET_ICANON, ICANON, ICANON },
3053 	{ TARGET_XCASE, TARGET_XCASE, XCASE, XCASE },
3054 	{ TARGET_ECHO, TARGET_ECHO, ECHO, ECHO },
3055 	{ TARGET_ECHOE, TARGET_ECHOE, ECHOE, ECHOE },
3056 	{ TARGET_ECHOK, TARGET_ECHOK, ECHOK, ECHOK },
3057 	{ TARGET_ECHONL, TARGET_ECHONL, ECHONL, ECHONL },
3058 	{ TARGET_NOFLSH, TARGET_NOFLSH, NOFLSH, NOFLSH },
3059 	{ TARGET_TOSTOP, TARGET_TOSTOP, TOSTOP, TOSTOP },
3060 	{ TARGET_ECHOCTL, TARGET_ECHOCTL, ECHOCTL, ECHOCTL },
3061 	{ TARGET_ECHOPRT, TARGET_ECHOPRT, ECHOPRT, ECHOPRT },
3062 	{ TARGET_ECHOKE, TARGET_ECHOKE, ECHOKE, ECHOKE },
3063 	{ TARGET_FLUSHO, TARGET_FLUSHO, FLUSHO, FLUSHO },
3064 	{ TARGET_PENDIN, TARGET_PENDIN, PENDIN, PENDIN },
3065 	{ TARGET_IEXTEN, TARGET_IEXTEN, IEXTEN, IEXTEN },
3066 	{ 0, 0, 0, 0 }
3067 };
3068 
3069 static void target_to_host_termios (void *dst, const void *src)
3070 {
3071     struct host_termios *host = dst;
3072     const struct target_termios *target = src;
3073 
3074     host->c_iflag =
3075         target_to_host_bitmask(tswap32(target->c_iflag), iflag_tbl);
3076     host->c_oflag =
3077         target_to_host_bitmask(tswap32(target->c_oflag), oflag_tbl);
3078     host->c_cflag =
3079         target_to_host_bitmask(tswap32(target->c_cflag), cflag_tbl);
3080     host->c_lflag =
3081         target_to_host_bitmask(tswap32(target->c_lflag), lflag_tbl);
3082     host->c_line = target->c_line;
3083 
3084     memset(host->c_cc, 0, sizeof(host->c_cc));
3085     host->c_cc[VINTR] = target->c_cc[TARGET_VINTR];
3086     host->c_cc[VQUIT] = target->c_cc[TARGET_VQUIT];
3087     host->c_cc[VERASE] = target->c_cc[TARGET_VERASE];
3088     host->c_cc[VKILL] = target->c_cc[TARGET_VKILL];
3089     host->c_cc[VEOF] = target->c_cc[TARGET_VEOF];
3090     host->c_cc[VTIME] = target->c_cc[TARGET_VTIME];
3091     host->c_cc[VMIN] = target->c_cc[TARGET_VMIN];
3092     host->c_cc[VSWTC] = target->c_cc[TARGET_VSWTC];
3093     host->c_cc[VSTART] = target->c_cc[TARGET_VSTART];
3094     host->c_cc[VSTOP] = target->c_cc[TARGET_VSTOP];
3095     host->c_cc[VSUSP] = target->c_cc[TARGET_VSUSP];
3096     host->c_cc[VEOL] = target->c_cc[TARGET_VEOL];
3097     host->c_cc[VREPRINT] = target->c_cc[TARGET_VREPRINT];
3098     host->c_cc[VDISCARD] = target->c_cc[TARGET_VDISCARD];
3099     host->c_cc[VWERASE] = target->c_cc[TARGET_VWERASE];
3100     host->c_cc[VLNEXT] = target->c_cc[TARGET_VLNEXT];
3101     host->c_cc[VEOL2] = target->c_cc[TARGET_VEOL2];
3102 }
3103 
3104 static void host_to_target_termios (void *dst, const void *src)
3105 {
3106     struct target_termios *target = dst;
3107     const struct host_termios *host = src;
3108 
3109     target->c_iflag =
3110         tswap32(host_to_target_bitmask(host->c_iflag, iflag_tbl));
3111     target->c_oflag =
3112         tswap32(host_to_target_bitmask(host->c_oflag, oflag_tbl));
3113     target->c_cflag =
3114         tswap32(host_to_target_bitmask(host->c_cflag, cflag_tbl));
3115     target->c_lflag =
3116         tswap32(host_to_target_bitmask(host->c_lflag, lflag_tbl));
3117     target->c_line = host->c_line;
3118 
3119     memset(target->c_cc, 0, sizeof(target->c_cc));
3120     target->c_cc[TARGET_VINTR] = host->c_cc[VINTR];
3121     target->c_cc[TARGET_VQUIT] = host->c_cc[VQUIT];
3122     target->c_cc[TARGET_VERASE] = host->c_cc[VERASE];
3123     target->c_cc[TARGET_VKILL] = host->c_cc[VKILL];
3124     target->c_cc[TARGET_VEOF] = host->c_cc[VEOF];
3125     target->c_cc[TARGET_VTIME] = host->c_cc[VTIME];
3126     target->c_cc[TARGET_VMIN] = host->c_cc[VMIN];
3127     target->c_cc[TARGET_VSWTC] = host->c_cc[VSWTC];
3128     target->c_cc[TARGET_VSTART] = host->c_cc[VSTART];
3129     target->c_cc[TARGET_VSTOP] = host->c_cc[VSTOP];
3130     target->c_cc[TARGET_VSUSP] = host->c_cc[VSUSP];
3131     target->c_cc[TARGET_VEOL] = host->c_cc[VEOL];
3132     target->c_cc[TARGET_VREPRINT] = host->c_cc[VREPRINT];
3133     target->c_cc[TARGET_VDISCARD] = host->c_cc[VDISCARD];
3134     target->c_cc[TARGET_VWERASE] = host->c_cc[VWERASE];
3135     target->c_cc[TARGET_VLNEXT] = host->c_cc[VLNEXT];
3136     target->c_cc[TARGET_VEOL2] = host->c_cc[VEOL2];
3137 }
3138 
3139 static const StructEntry struct_termios_def = {
3140     .convert = { host_to_target_termios, target_to_host_termios },
3141     .size = { sizeof(struct target_termios), sizeof(struct host_termios) },
3142     .align = { __alignof__(struct target_termios), __alignof__(struct host_termios) },
3143 };
3144 
3145 static bitmask_transtbl mmap_flags_tbl[] = {
3146 	{ TARGET_MAP_SHARED, TARGET_MAP_SHARED, MAP_SHARED, MAP_SHARED },
3147 	{ TARGET_MAP_PRIVATE, TARGET_MAP_PRIVATE, MAP_PRIVATE, MAP_PRIVATE },
3148 	{ TARGET_MAP_FIXED, TARGET_MAP_FIXED, MAP_FIXED, MAP_FIXED },
3149 	{ TARGET_MAP_ANONYMOUS, TARGET_MAP_ANONYMOUS, MAP_ANONYMOUS, MAP_ANONYMOUS },
3150 	{ TARGET_MAP_GROWSDOWN, TARGET_MAP_GROWSDOWN, MAP_GROWSDOWN, MAP_GROWSDOWN },
3151 	{ TARGET_MAP_DENYWRITE, TARGET_MAP_DENYWRITE, MAP_DENYWRITE, MAP_DENYWRITE },
3152 	{ TARGET_MAP_EXECUTABLE, TARGET_MAP_EXECUTABLE, MAP_EXECUTABLE, MAP_EXECUTABLE },
3153 	{ TARGET_MAP_LOCKED, TARGET_MAP_LOCKED, MAP_LOCKED, MAP_LOCKED },
3154 	{ 0, 0, 0, 0 }
3155 };
3156 
3157 #if defined(TARGET_I386)
3158 
3159 /* NOTE: there is really one LDT for all the threads */
3160 static uint8_t *ldt_table;
3161 
3162 static abi_long read_ldt(abi_ulong ptr, unsigned long bytecount)
3163 {
3164     int size;
3165     void *p;
3166 
3167     if (!ldt_table)
3168         return 0;
3169     size = TARGET_LDT_ENTRIES * TARGET_LDT_ENTRY_SIZE;
3170     if (size > bytecount)
3171         size = bytecount;
3172     p = lock_user(VERIFY_WRITE, ptr, size, 0);
3173     if (!p)
3174         return -TARGET_EFAULT;
3175     /* ??? Should this by byteswapped?  */
3176     memcpy(p, ldt_table, size);
3177     unlock_user(p, ptr, size);
3178     return size;
3179 }
3180 
3181 /* XXX: add locking support */
3182 static abi_long write_ldt(CPUX86State *env,
3183                           abi_ulong ptr, unsigned long bytecount, int oldmode)
3184 {
3185     struct target_modify_ldt_ldt_s ldt_info;
3186     struct target_modify_ldt_ldt_s *target_ldt_info;
3187     int seg_32bit, contents, read_exec_only, limit_in_pages;
3188     int seg_not_present, useable, lm;
3189     uint32_t *lp, entry_1, entry_2;
3190 
3191     if (bytecount != sizeof(ldt_info))
3192         return -TARGET_EINVAL;
3193     if (!lock_user_struct(VERIFY_READ, target_ldt_info, ptr, 1))
3194         return -TARGET_EFAULT;
3195     ldt_info.entry_number = tswap32(target_ldt_info->entry_number);
3196     ldt_info.base_addr = tswapl(target_ldt_info->base_addr);
3197     ldt_info.limit = tswap32(target_ldt_info->limit);
3198     ldt_info.flags = tswap32(target_ldt_info->flags);
3199     unlock_user_struct(target_ldt_info, ptr, 0);
3200 
3201     if (ldt_info.entry_number >= TARGET_LDT_ENTRIES)
3202         return -TARGET_EINVAL;
3203     seg_32bit = ldt_info.flags & 1;
3204     contents = (ldt_info.flags >> 1) & 3;
3205     read_exec_only = (ldt_info.flags >> 3) & 1;
3206     limit_in_pages = (ldt_info.flags >> 4) & 1;
3207     seg_not_present = (ldt_info.flags >> 5) & 1;
3208     useable = (ldt_info.flags >> 6) & 1;
3209 #ifdef TARGET_ABI32
3210     lm = 0;
3211 #else
3212     lm = (ldt_info.flags >> 7) & 1;
3213 #endif
3214     if (contents == 3) {
3215         if (oldmode)
3216             return -TARGET_EINVAL;
3217         if (seg_not_present == 0)
3218             return -TARGET_EINVAL;
3219     }
3220     /* allocate the LDT */
3221     if (!ldt_table) {
3222         env->ldt.base = target_mmap(0,
3223                                     TARGET_LDT_ENTRIES * TARGET_LDT_ENTRY_SIZE,
3224                                     PROT_READ|PROT_WRITE,
3225                                     MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
3226         if (env->ldt.base == -1)
3227             return -TARGET_ENOMEM;
3228         memset(g2h(env->ldt.base), 0,
3229                TARGET_LDT_ENTRIES * TARGET_LDT_ENTRY_SIZE);
3230         env->ldt.limit = 0xffff;
3231         ldt_table = g2h(env->ldt.base);
3232     }
3233 
3234     /* NOTE: same code as Linux kernel */
3235     /* Allow LDTs to be cleared by the user. */
3236     if (ldt_info.base_addr == 0 && ldt_info.limit == 0) {
3237         if (oldmode ||
3238             (contents == 0		&&
3239              read_exec_only == 1	&&
3240              seg_32bit == 0		&&
3241              limit_in_pages == 0	&&
3242              seg_not_present == 1	&&
3243              useable == 0 )) {
3244             entry_1 = 0;
3245             entry_2 = 0;
3246             goto install;
3247         }
3248     }
3249 
3250     entry_1 = ((ldt_info.base_addr & 0x0000ffff) << 16) |
3251         (ldt_info.limit & 0x0ffff);
3252     entry_2 = (ldt_info.base_addr & 0xff000000) |
3253         ((ldt_info.base_addr & 0x00ff0000) >> 16) |
3254         (ldt_info.limit & 0xf0000) |
3255         ((read_exec_only ^ 1) << 9) |
3256         (contents << 10) |
3257         ((seg_not_present ^ 1) << 15) |
3258         (seg_32bit << 22) |
3259         (limit_in_pages << 23) |
3260         (lm << 21) |
3261         0x7000;
3262     if (!oldmode)
3263         entry_2 |= (useable << 20);
3264 
3265     /* Install the new entry ...  */
3266 install:
3267     lp = (uint32_t *)(ldt_table + (ldt_info.entry_number << 3));
3268     lp[0] = tswap32(entry_1);
3269     lp[1] = tswap32(entry_2);
3270     return 0;
3271 }
3272 
3273 /* specific and weird i386 syscalls */
3274 static abi_long do_modify_ldt(CPUX86State *env, int func, abi_ulong ptr,
3275                               unsigned long bytecount)
3276 {
3277     abi_long ret;
3278 
3279     switch (func) {
3280     case 0:
3281         ret = read_ldt(ptr, bytecount);
3282         break;
3283     case 1:
3284         ret = write_ldt(env, ptr, bytecount, 1);
3285         break;
3286     case 0x11:
3287         ret = write_ldt(env, ptr, bytecount, 0);
3288         break;
3289     default:
3290         ret = -TARGET_ENOSYS;
3291         break;
3292     }
3293     return ret;
3294 }
3295 
3296 #if defined(TARGET_I386) && defined(TARGET_ABI32)
3297 static abi_long do_set_thread_area(CPUX86State *env, abi_ulong ptr)
3298 {
3299     uint64_t *gdt_table = g2h(env->gdt.base);
3300     struct target_modify_ldt_ldt_s ldt_info;
3301     struct target_modify_ldt_ldt_s *target_ldt_info;
3302     int seg_32bit, contents, read_exec_only, limit_in_pages;
3303     int seg_not_present, useable, lm;
3304     uint32_t *lp, entry_1, entry_2;
3305     int i;
3306 
3307     lock_user_struct(VERIFY_WRITE, target_ldt_info, ptr, 1);
3308     if (!target_ldt_info)
3309         return -TARGET_EFAULT;
3310     ldt_info.entry_number = tswap32(target_ldt_info->entry_number);
3311     ldt_info.base_addr = tswapl(target_ldt_info->base_addr);
3312     ldt_info.limit = tswap32(target_ldt_info->limit);
3313     ldt_info.flags = tswap32(target_ldt_info->flags);
3314     if (ldt_info.entry_number == -1) {
3315         for (i=TARGET_GDT_ENTRY_TLS_MIN; i<=TARGET_GDT_ENTRY_TLS_MAX; i++) {
3316             if (gdt_table[i] == 0) {
3317                 ldt_info.entry_number = i;
3318                 target_ldt_info->entry_number = tswap32(i);
3319                 break;
3320             }
3321         }
3322     }
3323     unlock_user_struct(target_ldt_info, ptr, 1);
3324 
3325     if (ldt_info.entry_number < TARGET_GDT_ENTRY_TLS_MIN ||
3326         ldt_info.entry_number > TARGET_GDT_ENTRY_TLS_MAX)
3327            return -TARGET_EINVAL;
3328     seg_32bit = ldt_info.flags & 1;
3329     contents = (ldt_info.flags >> 1) & 3;
3330     read_exec_only = (ldt_info.flags >> 3) & 1;
3331     limit_in_pages = (ldt_info.flags >> 4) & 1;
3332     seg_not_present = (ldt_info.flags >> 5) & 1;
3333     useable = (ldt_info.flags >> 6) & 1;
3334 #ifdef TARGET_ABI32
3335     lm = 0;
3336 #else
3337     lm = (ldt_info.flags >> 7) & 1;
3338 #endif
3339 
3340     if (contents == 3) {
3341         if (seg_not_present == 0)
3342             return -TARGET_EINVAL;
3343     }
3344 
3345     /* NOTE: same code as Linux kernel */
3346     /* Allow LDTs to be cleared by the user. */
3347     if (ldt_info.base_addr == 0 && ldt_info.limit == 0) {
3348         if ((contents == 0             &&
3349              read_exec_only == 1       &&
3350              seg_32bit == 0            &&
3351              limit_in_pages == 0       &&
3352              seg_not_present == 1      &&
3353              useable == 0 )) {
3354             entry_1 = 0;
3355             entry_2 = 0;
3356             goto install;
3357         }
3358     }
3359 
3360     entry_1 = ((ldt_info.base_addr & 0x0000ffff) << 16) |
3361         (ldt_info.limit & 0x0ffff);
3362     entry_2 = (ldt_info.base_addr & 0xff000000) |
3363         ((ldt_info.base_addr & 0x00ff0000) >> 16) |
3364         (ldt_info.limit & 0xf0000) |
3365         ((read_exec_only ^ 1) << 9) |
3366         (contents << 10) |
3367         ((seg_not_present ^ 1) << 15) |
3368         (seg_32bit << 22) |
3369         (limit_in_pages << 23) |
3370         (useable << 20) |
3371         (lm << 21) |
3372         0x7000;
3373 
3374     /* Install the new entry ...  */
3375 install:
3376     lp = (uint32_t *)(gdt_table + ldt_info.entry_number);
3377     lp[0] = tswap32(entry_1);
3378     lp[1] = tswap32(entry_2);
3379     return 0;
3380 }
3381 
3382 static abi_long do_get_thread_area(CPUX86State *env, abi_ulong ptr)
3383 {
3384     struct target_modify_ldt_ldt_s *target_ldt_info;
3385     uint64_t *gdt_table = g2h(env->gdt.base);
3386     uint32_t base_addr, limit, flags;
3387     int seg_32bit, contents, read_exec_only, limit_in_pages, idx;
3388     int seg_not_present, useable, lm;
3389     uint32_t *lp, entry_1, entry_2;
3390 
3391     lock_user_struct(VERIFY_WRITE, target_ldt_info, ptr, 1);
3392     if (!target_ldt_info)
3393         return -TARGET_EFAULT;
3394     idx = tswap32(target_ldt_info->entry_number);
3395     if (idx < TARGET_GDT_ENTRY_TLS_MIN ||
3396         idx > TARGET_GDT_ENTRY_TLS_MAX) {
3397         unlock_user_struct(target_ldt_info, ptr, 1);
3398         return -TARGET_EINVAL;
3399     }
3400     lp = (uint32_t *)(gdt_table + idx);
3401     entry_1 = tswap32(lp[0]);
3402     entry_2 = tswap32(lp[1]);
3403 
3404     read_exec_only = ((entry_2 >> 9) & 1) ^ 1;
3405     contents = (entry_2 >> 10) & 3;
3406     seg_not_present = ((entry_2 >> 15) & 1) ^ 1;
3407     seg_32bit = (entry_2 >> 22) & 1;
3408     limit_in_pages = (entry_2 >> 23) & 1;
3409     useable = (entry_2 >> 20) & 1;
3410 #ifdef TARGET_ABI32
3411     lm = 0;
3412 #else
3413     lm = (entry_2 >> 21) & 1;
3414 #endif
3415     flags = (seg_32bit << 0) | (contents << 1) |
3416         (read_exec_only << 3) | (limit_in_pages << 4) |
3417         (seg_not_present << 5) | (useable << 6) | (lm << 7);
3418     limit = (entry_1 & 0xffff) | (entry_2  & 0xf0000);
3419     base_addr = (entry_1 >> 16) |
3420         (entry_2 & 0xff000000) |
3421         ((entry_2 & 0xff) << 16);
3422     target_ldt_info->base_addr = tswapl(base_addr);
3423     target_ldt_info->limit = tswap32(limit);
3424     target_ldt_info->flags = tswap32(flags);
3425     unlock_user_struct(target_ldt_info, ptr, 1);
3426     return 0;
3427 }
3428 #endif /* TARGET_I386 && TARGET_ABI32 */
3429 
3430 #ifndef TARGET_ABI32
3431 static abi_long do_arch_prctl(CPUX86State *env, int code, abi_ulong addr)
3432 {
3433     abi_long ret;
3434     abi_ulong val;
3435     int idx;
3436 
3437     switch(code) {
3438     case TARGET_ARCH_SET_GS:
3439     case TARGET_ARCH_SET_FS:
3440         if (code == TARGET_ARCH_SET_GS)
3441             idx = R_GS;
3442         else
3443             idx = R_FS;
3444         cpu_x86_load_seg(env, idx, 0);
3445         env->segs[idx].base = addr;
3446         break;
3447     case TARGET_ARCH_GET_GS:
3448     case TARGET_ARCH_GET_FS:
3449         if (code == TARGET_ARCH_GET_GS)
3450             idx = R_GS;
3451         else
3452             idx = R_FS;
3453         val = env->segs[idx].base;
3454         if (put_user(val, addr, abi_ulong))
3455             return -TARGET_EFAULT;
3456         break;
3457     default:
3458         ret = -TARGET_EINVAL;
3459         break;
3460     }
3461     return 0;
3462 }
3463 #endif
3464 
3465 #endif /* defined(TARGET_I386) */
3466 
3467 #if defined(CONFIG_USE_NPTL)
3468 
3469 #define NEW_STACK_SIZE PTHREAD_STACK_MIN
3470 
3471 static pthread_mutex_t clone_lock = PTHREAD_MUTEX_INITIALIZER;
3472 typedef struct {
3473     CPUState *env;
3474     pthread_mutex_t mutex;
3475     pthread_cond_t cond;
3476     pthread_t thread;
3477     uint32_t tid;
3478     abi_ulong child_tidptr;
3479     abi_ulong parent_tidptr;
3480     sigset_t sigmask;
3481 } new_thread_info;
3482 
3483 static void *clone_func(void *arg)
3484 {
3485     new_thread_info *info = arg;
3486     CPUState *env;
3487     TaskState *ts;
3488 
3489     env = info->env;
3490     thread_env = env;
3491     ts = (TaskState *)thread_env->opaque;
3492     info->tid = gettid();
3493     env->host_tid = info->tid;
3494     task_settid(ts);
3495     if (info->child_tidptr)
3496         put_user_u32(info->tid, info->child_tidptr);
3497     if (info->parent_tidptr)
3498         put_user_u32(info->tid, info->parent_tidptr);
3499     /* Enable signals.  */
3500     sigprocmask(SIG_SETMASK, &info->sigmask, NULL);
3501     /* Signal to the parent that we're ready.  */
3502     pthread_mutex_lock(&info->mutex);
3503     pthread_cond_broadcast(&info->cond);
3504     pthread_mutex_unlock(&info->mutex);
3505     /* Wait until the parent has finshed initializing the tls state.  */
3506     pthread_mutex_lock(&clone_lock);
3507     pthread_mutex_unlock(&clone_lock);
3508     cpu_loop(env);
3509     /* never exits */
3510     return NULL;
3511 }
3512 #else
3513 /* this stack is the equivalent of the kernel stack associated with a
3514    thread/process */
3515 #define NEW_STACK_SIZE 8192
3516 
3517 static int clone_func(void *arg)
3518 {
3519     CPUState *env = arg;
3520     cpu_loop(env);
3521     /* never exits */
3522     return 0;
3523 }
3524 #endif
3525 
3526 /* do_fork() Must return host values and target errnos (unlike most
3527    do_*() functions). */
3528 static int do_fork(CPUState *env, unsigned int flags, abi_ulong newsp,
3529                    abi_ulong parent_tidptr, target_ulong newtls,
3530                    abi_ulong child_tidptr)
3531 {
3532     int ret;
3533     TaskState *ts;
3534     uint8_t *new_stack;
3535     CPUState *new_env;
3536 #if defined(CONFIG_USE_NPTL)
3537     unsigned int nptl_flags;
3538     sigset_t sigmask;
3539 #endif
3540 
3541     /* Emulate vfork() with fork() */
3542     if (flags & CLONE_VFORK)
3543         flags &= ~(CLONE_VFORK | CLONE_VM);
3544 
3545     if (flags & CLONE_VM) {
3546         TaskState *parent_ts = (TaskState *)env->opaque;
3547 #if defined(CONFIG_USE_NPTL)
3548         new_thread_info info;
3549         pthread_attr_t attr;
3550 #endif
3551         ts = qemu_mallocz(sizeof(TaskState) + NEW_STACK_SIZE);
3552         init_task_state(ts);
3553         new_stack = ts->stack;
3554         /* we create a new CPU instance. */
3555         new_env = cpu_copy(env);
3556         /* Init regs that differ from the parent.  */
3557         cpu_clone_regs(new_env, newsp);
3558         new_env->opaque = ts;
3559         ts->bprm = parent_ts->bprm;
3560         ts->info = parent_ts->info;
3561 #if defined(CONFIG_USE_NPTL)
3562         nptl_flags = flags;
3563         flags &= ~CLONE_NPTL_FLAGS2;
3564 
3565         if (nptl_flags & CLONE_CHILD_CLEARTID) {
3566             ts->child_tidptr = child_tidptr;
3567         }
3568 
3569         if (nptl_flags & CLONE_SETTLS)
3570             cpu_set_tls (new_env, newtls);
3571 
3572         /* Grab a mutex so that thread setup appears atomic.  */
3573         pthread_mutex_lock(&clone_lock);
3574 
3575         memset(&info, 0, sizeof(info));
3576         pthread_mutex_init(&info.mutex, NULL);
3577         pthread_mutex_lock(&info.mutex);
3578         pthread_cond_init(&info.cond, NULL);
3579         info.env = new_env;
3580         if (nptl_flags & CLONE_CHILD_SETTID)
3581             info.child_tidptr = child_tidptr;
3582         if (nptl_flags & CLONE_PARENT_SETTID)
3583             info.parent_tidptr = parent_tidptr;
3584 
3585         ret = pthread_attr_init(&attr);
3586         ret = pthread_attr_setstack(&attr, new_stack, NEW_STACK_SIZE);
3587         /* It is not safe to deliver signals until the child has finished
3588            initializing, so temporarily block all signals.  */
3589         sigfillset(&sigmask);
3590         sigprocmask(SIG_BLOCK, &sigmask, &info.sigmask);
3591 
3592         ret = pthread_create(&info.thread, &attr, clone_func, &info);
3593         /* TODO: Free new CPU state if thread creation failed.  */
3594 
3595         sigprocmask(SIG_SETMASK, &info.sigmask, NULL);
3596         pthread_attr_destroy(&attr);
3597         if (ret == 0) {
3598             /* Wait for the child to initialize.  */
3599             pthread_cond_wait(&info.cond, &info.mutex);
3600             ret = info.tid;
3601             if (flags & CLONE_PARENT_SETTID)
3602                 put_user_u32(ret, parent_tidptr);
3603         } else {
3604             ret = -1;
3605         }
3606         pthread_mutex_unlock(&info.mutex);
3607         pthread_cond_destroy(&info.cond);
3608         pthread_mutex_destroy(&info.mutex);
3609         pthread_mutex_unlock(&clone_lock);
3610 #else
3611         if (flags & CLONE_NPTL_FLAGS2)
3612             return -EINVAL;
3613         /* This is probably going to die very quickly, but do it anyway.  */
3614 #ifdef __ia64__
3615         ret = __clone2(clone_func, new_stack + NEW_STACK_SIZE, flags, new_env);
3616 #else
3617 	ret = clone(clone_func, new_stack + NEW_STACK_SIZE, flags, new_env);
3618 #endif
3619 #endif
3620     } else {
3621         /* if no CLONE_VM, we consider it is a fork */
3622         if ((flags & ~(CSIGNAL | CLONE_NPTL_FLAGS2)) != 0)
3623             return -EINVAL;
3624         fork_start();
3625         ret = fork();
3626         if (ret == 0) {
3627             /* Child Process.  */
3628             cpu_clone_regs(env, newsp);
3629             fork_end(1);
3630 #if defined(CONFIG_USE_NPTL)
3631             /* There is a race condition here.  The parent process could
3632                theoretically read the TID in the child process before the child
3633                tid is set.  This would require using either ptrace
3634                (not implemented) or having *_tidptr to point at a shared memory
3635                mapping.  We can't repeat the spinlock hack used above because
3636                the child process gets its own copy of the lock.  */
3637             if (flags & CLONE_CHILD_SETTID)
3638                 put_user_u32(gettid(), child_tidptr);
3639             if (flags & CLONE_PARENT_SETTID)
3640                 put_user_u32(gettid(), parent_tidptr);
3641             ts = (TaskState *)env->opaque;
3642             if (flags & CLONE_SETTLS)
3643                 cpu_set_tls (env, newtls);
3644             if (flags & CLONE_CHILD_CLEARTID)
3645                 ts->child_tidptr = child_tidptr;
3646 #endif
3647         } else {
3648             fork_end(0);
3649         }
3650     }
3651     return ret;
3652 }
3653 
3654 /* warning : doesn't handle linux specific flags... */
3655 static int target_to_host_fcntl_cmd(int cmd)
3656 {
3657     switch(cmd) {
3658 	case TARGET_F_DUPFD:
3659 	case TARGET_F_GETFD:
3660 	case TARGET_F_SETFD:
3661 	case TARGET_F_GETFL:
3662 	case TARGET_F_SETFL:
3663             return cmd;
3664         case TARGET_F_GETLK:
3665 	    return F_GETLK;
3666 	case TARGET_F_SETLK:
3667 	    return F_SETLK;
3668 	case TARGET_F_SETLKW:
3669 	    return F_SETLKW;
3670 	case TARGET_F_GETOWN:
3671 	    return F_GETOWN;
3672 	case TARGET_F_SETOWN:
3673 	    return F_SETOWN;
3674 	case TARGET_F_GETSIG:
3675 	    return F_GETSIG;
3676 	case TARGET_F_SETSIG:
3677 	    return F_SETSIG;
3678 #if TARGET_ABI_BITS == 32
3679         case TARGET_F_GETLK64:
3680 	    return F_GETLK64;
3681 	case TARGET_F_SETLK64:
3682 	    return F_SETLK64;
3683 	case TARGET_F_SETLKW64:
3684 	    return F_SETLKW64;
3685 #endif
3686         case TARGET_F_SETLEASE:
3687             return F_SETLEASE;
3688         case TARGET_F_GETLEASE:
3689             return F_GETLEASE;
3690 #ifdef F_DUPFD_CLOEXEC
3691         case TARGET_F_DUPFD_CLOEXEC:
3692             return F_DUPFD_CLOEXEC;
3693 #endif
3694         case TARGET_F_NOTIFY:
3695             return F_NOTIFY;
3696 	default:
3697             return -TARGET_EINVAL;
3698     }
3699     return -TARGET_EINVAL;
3700 }
3701 
3702 static abi_long do_fcntl(int fd, int cmd, abi_ulong arg)
3703 {
3704     struct flock fl;
3705     struct target_flock *target_fl;
3706     struct flock64 fl64;
3707     struct target_flock64 *target_fl64;
3708     abi_long ret;
3709     int host_cmd = target_to_host_fcntl_cmd(cmd);
3710 
3711     if (host_cmd == -TARGET_EINVAL)
3712 	    return host_cmd;
3713 
3714     switch(cmd) {
3715     case TARGET_F_GETLK:
3716         if (!lock_user_struct(VERIFY_READ, target_fl, arg, 1))
3717             return -TARGET_EFAULT;
3718         fl.l_type = tswap16(target_fl->l_type);
3719         fl.l_whence = tswap16(target_fl->l_whence);
3720         fl.l_start = tswapl(target_fl->l_start);
3721         fl.l_len = tswapl(target_fl->l_len);
3722         fl.l_pid = tswap32(target_fl->l_pid);
3723         unlock_user_struct(target_fl, arg, 0);
3724         ret = get_errno(fcntl(fd, host_cmd, &fl));
3725         if (ret == 0) {
3726             if (!lock_user_struct(VERIFY_WRITE, target_fl, arg, 0))
3727                 return -TARGET_EFAULT;
3728             target_fl->l_type = tswap16(fl.l_type);
3729             target_fl->l_whence = tswap16(fl.l_whence);
3730             target_fl->l_start = tswapl(fl.l_start);
3731             target_fl->l_len = tswapl(fl.l_len);
3732             target_fl->l_pid = tswap32(fl.l_pid);
3733             unlock_user_struct(target_fl, arg, 1);
3734         }
3735         break;
3736 
3737     case TARGET_F_SETLK:
3738     case TARGET_F_SETLKW:
3739         if (!lock_user_struct(VERIFY_READ, target_fl, arg, 1))
3740             return -TARGET_EFAULT;
3741         fl.l_type = tswap16(target_fl->l_type);
3742         fl.l_whence = tswap16(target_fl->l_whence);
3743         fl.l_start = tswapl(target_fl->l_start);
3744         fl.l_len = tswapl(target_fl->l_len);
3745         fl.l_pid = tswap32(target_fl->l_pid);
3746         unlock_user_struct(target_fl, arg, 0);
3747         ret = get_errno(fcntl(fd, host_cmd, &fl));
3748         break;
3749 
3750     case TARGET_F_GETLK64:
3751         if (!lock_user_struct(VERIFY_READ, target_fl64, arg, 1))
3752             return -TARGET_EFAULT;
3753         fl64.l_type = tswap16(target_fl64->l_type) >> 1;
3754         fl64.l_whence = tswap16(target_fl64->l_whence);
3755         fl64.l_start = tswapl(target_fl64->l_start);
3756         fl64.l_len = tswapl(target_fl64->l_len);
3757         fl64.l_pid = tswap32(target_fl64->l_pid);
3758         unlock_user_struct(target_fl64, arg, 0);
3759         ret = get_errno(fcntl(fd, host_cmd, &fl64));
3760         if (ret == 0) {
3761             if (!lock_user_struct(VERIFY_WRITE, target_fl64, arg, 0))
3762                 return -TARGET_EFAULT;
3763             target_fl64->l_type = tswap16(fl64.l_type) >> 1;
3764             target_fl64->l_whence = tswap16(fl64.l_whence);
3765             target_fl64->l_start = tswapl(fl64.l_start);
3766             target_fl64->l_len = tswapl(fl64.l_len);
3767             target_fl64->l_pid = tswap32(fl64.l_pid);
3768             unlock_user_struct(target_fl64, arg, 1);
3769         }
3770         break;
3771     case TARGET_F_SETLK64:
3772     case TARGET_F_SETLKW64:
3773         if (!lock_user_struct(VERIFY_READ, target_fl64, arg, 1))
3774             return -TARGET_EFAULT;
3775         fl64.l_type = tswap16(target_fl64->l_type) >> 1;
3776         fl64.l_whence = tswap16(target_fl64->l_whence);
3777         fl64.l_start = tswapl(target_fl64->l_start);
3778         fl64.l_len = tswapl(target_fl64->l_len);
3779         fl64.l_pid = tswap32(target_fl64->l_pid);
3780         unlock_user_struct(target_fl64, arg, 0);
3781         ret = get_errno(fcntl(fd, host_cmd, &fl64));
3782         break;
3783 
3784     case TARGET_F_GETFL:
3785         ret = get_errno(fcntl(fd, host_cmd, arg));
3786         if (ret >= 0) {
3787             ret = host_to_target_bitmask(ret, fcntl_flags_tbl);
3788         }
3789         break;
3790 
3791     case TARGET_F_SETFL:
3792         ret = get_errno(fcntl(fd, host_cmd, target_to_host_bitmask(arg, fcntl_flags_tbl)));
3793         break;
3794 
3795     case TARGET_F_SETOWN:
3796     case TARGET_F_GETOWN:
3797     case TARGET_F_SETSIG:
3798     case TARGET_F_GETSIG:
3799     case TARGET_F_SETLEASE:
3800     case TARGET_F_GETLEASE:
3801         ret = get_errno(fcntl(fd, host_cmd, arg));
3802         break;
3803 
3804     default:
3805         ret = get_errno(fcntl(fd, cmd, arg));
3806         break;
3807     }
3808     return ret;
3809 }
3810 
3811 #ifdef USE_UID16
3812 
3813 static inline int high2lowuid(int uid)
3814 {
3815     if (uid > 65535)
3816         return 65534;
3817     else
3818         return uid;
3819 }
3820 
3821 static inline int high2lowgid(int gid)
3822 {
3823     if (gid > 65535)
3824         return 65534;
3825     else
3826         return gid;
3827 }
3828 
3829 static inline int low2highuid(int uid)
3830 {
3831     if ((int16_t)uid == -1)
3832         return -1;
3833     else
3834         return uid;
3835 }
3836 
3837 static inline int low2highgid(int gid)
3838 {
3839     if ((int16_t)gid == -1)
3840         return -1;
3841     else
3842         return gid;
3843 }
3844 
3845 #endif /* USE_UID16 */
3846 
3847 void syscall_init(void)
3848 {
3849     IOCTLEntry *ie;
3850     const argtype *arg_type;
3851     int size;
3852     int i;
3853 
3854 #define STRUCT(name, ...) thunk_register_struct(STRUCT_ ## name, #name, struct_ ## name ## _def);
3855 #define STRUCT_SPECIAL(name) thunk_register_struct_direct(STRUCT_ ## name, #name, &struct_ ## name ## _def);
3856 #include "syscall_types.h"
3857 #undef STRUCT
3858 #undef STRUCT_SPECIAL
3859 
3860     /* we patch the ioctl size if necessary. We rely on the fact that
3861        no ioctl has all the bits at '1' in the size field */
3862     ie = ioctl_entries;
3863     while (ie->target_cmd != 0) {
3864         if (((ie->target_cmd >> TARGET_IOC_SIZESHIFT) & TARGET_IOC_SIZEMASK) ==
3865             TARGET_IOC_SIZEMASK) {
3866             arg_type = ie->arg_type;
3867             if (arg_type[0] != TYPE_PTR) {
3868                 fprintf(stderr, "cannot patch size for ioctl 0x%x\n",
3869                         ie->target_cmd);
3870                 exit(1);
3871             }
3872             arg_type++;
3873             size = thunk_type_size(arg_type, 0);
3874             ie->target_cmd = (ie->target_cmd &
3875                               ~(TARGET_IOC_SIZEMASK << TARGET_IOC_SIZESHIFT)) |
3876                 (size << TARGET_IOC_SIZESHIFT);
3877         }
3878 
3879         /* Build target_to_host_errno_table[] table from
3880          * host_to_target_errno_table[]. */
3881         for (i=0; i < ERRNO_TABLE_SIZE; i++)
3882                 target_to_host_errno_table[host_to_target_errno_table[i]] = i;
3883 
3884         /* automatic consistency check if same arch */
3885 #if (defined(__i386__) && defined(TARGET_I386) && defined(TARGET_ABI32)) || \
3886     (defined(__x86_64__) && defined(TARGET_X86_64))
3887         if (unlikely(ie->target_cmd != ie->host_cmd)) {
3888             fprintf(stderr, "ERROR: ioctl(%s): target=0x%x host=0x%x\n",
3889                     ie->name, ie->target_cmd, ie->host_cmd);
3890         }
3891 #endif
3892         ie++;
3893     }
3894 }
3895 
3896 #if TARGET_ABI_BITS == 32
3897 static inline uint64_t target_offset64(uint32_t word0, uint32_t word1)
3898 {
3899 #ifdef TARGET_WORDS_BIGENDIAN
3900     return ((uint64_t)word0 << 32) | word1;
3901 #else
3902     return ((uint64_t)word1 << 32) | word0;
3903 #endif
3904 }
3905 #else /* TARGET_ABI_BITS == 32 */
3906 static inline uint64_t target_offset64(uint64_t word0, uint64_t word1)
3907 {
3908     return word0;
3909 }
3910 #endif /* TARGET_ABI_BITS != 32 */
3911 
3912 #ifdef TARGET_NR_truncate64
3913 static inline abi_long target_truncate64(void *cpu_env, const char *arg1,
3914                                          abi_long arg2,
3915                                          abi_long arg3,
3916                                          abi_long arg4)
3917 {
3918 #ifdef TARGET_ARM
3919     if (((CPUARMState *)cpu_env)->eabi)
3920       {
3921         arg2 = arg3;
3922         arg3 = arg4;
3923       }
3924 #endif
3925     return get_errno(truncate64(arg1, target_offset64(arg2, arg3)));
3926 }
3927 #endif
3928 
3929 #ifdef TARGET_NR_ftruncate64
3930 static inline abi_long target_ftruncate64(void *cpu_env, abi_long arg1,
3931                                           abi_long arg2,
3932                                           abi_long arg3,
3933                                           abi_long arg4)
3934 {
3935 #ifdef TARGET_ARM
3936     if (((CPUARMState *)cpu_env)->eabi)
3937       {
3938         arg2 = arg3;
3939         arg3 = arg4;
3940       }
3941 #endif
3942     return get_errno(ftruncate64(arg1, target_offset64(arg2, arg3)));
3943 }
3944 #endif
3945 
3946 static inline abi_long target_to_host_timespec(struct timespec *host_ts,
3947                                                abi_ulong target_addr)
3948 {
3949     struct target_timespec *target_ts;
3950 
3951     if (!lock_user_struct(VERIFY_READ, target_ts, target_addr, 1))
3952         return -TARGET_EFAULT;
3953     host_ts->tv_sec = tswapl(target_ts->tv_sec);
3954     host_ts->tv_nsec = tswapl(target_ts->tv_nsec);
3955     unlock_user_struct(target_ts, target_addr, 0);
3956     return 0;
3957 }
3958 
3959 static inline abi_long host_to_target_timespec(abi_ulong target_addr,
3960                                                struct timespec *host_ts)
3961 {
3962     struct target_timespec *target_ts;
3963 
3964     if (!lock_user_struct(VERIFY_WRITE, target_ts, target_addr, 0))
3965         return -TARGET_EFAULT;
3966     target_ts->tv_sec = tswapl(host_ts->tv_sec);
3967     target_ts->tv_nsec = tswapl(host_ts->tv_nsec);
3968     unlock_user_struct(target_ts, target_addr, 1);
3969     return 0;
3970 }
3971 
3972 #if defined(TARGET_NR_stat64) || defined(TARGET_NR_newfstatat)
3973 static inline abi_long host_to_target_stat64(void *cpu_env,
3974                                              abi_ulong target_addr,
3975                                              struct stat *host_st)
3976 {
3977 #ifdef TARGET_ARM
3978     if (((CPUARMState *)cpu_env)->eabi) {
3979         struct target_eabi_stat64 *target_st;
3980 
3981         if (!lock_user_struct(VERIFY_WRITE, target_st, target_addr, 0))
3982             return -TARGET_EFAULT;
3983         memset(target_st, 0, sizeof(struct target_eabi_stat64));
3984         __put_user(host_st->st_dev, &target_st->st_dev);
3985         __put_user(host_st->st_ino, &target_st->st_ino);
3986 #ifdef TARGET_STAT64_HAS_BROKEN_ST_INO
3987         __put_user(host_st->st_ino, &target_st->__st_ino);
3988 #endif
3989         __put_user(host_st->st_mode, &target_st->st_mode);
3990         __put_user(host_st->st_nlink, &target_st->st_nlink);
3991         __put_user(host_st->st_uid, &target_st->st_uid);
3992         __put_user(host_st->st_gid, &target_st->st_gid);
3993         __put_user(host_st->st_rdev, &target_st->st_rdev);
3994         __put_user(host_st->st_size, &target_st->st_size);
3995         __put_user(host_st->st_blksize, &target_st->st_blksize);
3996         __put_user(host_st->st_blocks, &target_st->st_blocks);
3997         __put_user(host_st->st_atime, &target_st->target_st_atime);
3998         __put_user(host_st->st_mtime, &target_st->target_st_mtime);
3999         __put_user(host_st->st_ctime, &target_st->target_st_ctime);
4000         unlock_user_struct(target_st, target_addr, 1);
4001     } else
4002 #endif
4003     {
4004 #if TARGET_LONG_BITS == 64
4005         struct target_stat *target_st;
4006 #else
4007         struct target_stat64 *target_st;
4008 #endif
4009 
4010         if (!lock_user_struct(VERIFY_WRITE, target_st, target_addr, 0))
4011             return -TARGET_EFAULT;
4012         memset(target_st, 0, sizeof(*target_st));
4013         __put_user(host_st->st_dev, &target_st->st_dev);
4014         __put_user(host_st->st_ino, &target_st->st_ino);
4015 #ifdef TARGET_STAT64_HAS_BROKEN_ST_INO
4016         __put_user(host_st->st_ino, &target_st->__st_ino);
4017 #endif
4018         __put_user(host_st->st_mode, &target_st->st_mode);
4019         __put_user(host_st->st_nlink, &target_st->st_nlink);
4020         __put_user(host_st->st_uid, &target_st->st_uid);
4021         __put_user(host_st->st_gid, &target_st->st_gid);
4022         __put_user(host_st->st_rdev, &target_st->st_rdev);
4023         /* XXX: better use of kernel struct */
4024         __put_user(host_st->st_size, &target_st->st_size);
4025         __put_user(host_st->st_blksize, &target_st->st_blksize);
4026         __put_user(host_st->st_blocks, &target_st->st_blocks);
4027         __put_user(host_st->st_atime, &target_st->target_st_atime);
4028         __put_user(host_st->st_mtime, &target_st->target_st_mtime);
4029         __put_user(host_st->st_ctime, &target_st->target_st_ctime);
4030         unlock_user_struct(target_st, target_addr, 1);
4031     }
4032 
4033     return 0;
4034 }
4035 #endif
4036 
4037 #if defined(CONFIG_USE_NPTL)
4038 /* ??? Using host futex calls even when target atomic operations
4039    are not really atomic probably breaks things.  However implementing
4040    futexes locally would make futexes shared between multiple processes
4041    tricky.  However they're probably useless because guest atomic
4042    operations won't work either.  */
4043 static int do_futex(target_ulong uaddr, int op, int val, target_ulong timeout,
4044                     target_ulong uaddr2, int val3)
4045 {
4046     struct timespec ts, *pts;
4047     int base_op;
4048 
4049     /* ??? We assume FUTEX_* constants are the same on both host
4050        and target.  */
4051 #ifdef FUTEX_CMD_MASK
4052     base_op = op & FUTEX_CMD_MASK;
4053 #else
4054     base_op = op;
4055 #endif
4056     switch (base_op) {
4057     case FUTEX_WAIT:
4058         if (timeout) {
4059             pts = &ts;
4060             target_to_host_timespec(pts, timeout);
4061         } else {
4062             pts = NULL;
4063         }
4064         return get_errno(sys_futex(g2h(uaddr), op, tswap32(val),
4065                          pts, NULL, 0));
4066     case FUTEX_WAKE:
4067         return get_errno(sys_futex(g2h(uaddr), op, val, NULL, NULL, 0));
4068     case FUTEX_FD:
4069         return get_errno(sys_futex(g2h(uaddr), op, val, NULL, NULL, 0));
4070     case FUTEX_REQUEUE:
4071     case FUTEX_CMP_REQUEUE:
4072     case FUTEX_WAKE_OP:
4073         /* For FUTEX_REQUEUE, FUTEX_CMP_REQUEUE, and FUTEX_WAKE_OP, the
4074            TIMEOUT parameter is interpreted as a uint32_t by the kernel.
4075            But the prototype takes a `struct timespec *'; insert casts
4076            to satisfy the compiler.  We do not need to tswap TIMEOUT
4077            since it's not compared to guest memory.  */
4078         pts = (struct timespec *)(uintptr_t) timeout;
4079         return get_errno(sys_futex(g2h(uaddr), op, val, pts,
4080                                    g2h(uaddr2),
4081                                    (base_op == FUTEX_CMP_REQUEUE
4082                                     ? tswap32(val3)
4083                                     : val3)));
4084     default:
4085         return -TARGET_ENOSYS;
4086     }
4087 }
4088 #endif
4089 
4090 /* Map host to target signal numbers for the wait family of syscalls.
4091    Assume all other status bits are the same.  */
4092 static int host_to_target_waitstatus(int status)
4093 {
4094     if (WIFSIGNALED(status)) {
4095         return host_to_target_signal(WTERMSIG(status)) | (status & ~0x7f);
4096     }
4097     if (WIFSTOPPED(status)) {
4098         return (host_to_target_signal(WSTOPSIG(status)) << 8)
4099                | (status & 0xff);
4100     }
4101     return status;
4102 }
4103 
4104 int get_osversion(void)
4105 {
4106     static int osversion;
4107     struct new_utsname buf;
4108     const char *s;
4109     int i, n, tmp;
4110     if (osversion)
4111         return osversion;
4112     if (qemu_uname_release && *qemu_uname_release) {
4113         s = qemu_uname_release;
4114     } else {
4115         if (sys_uname(&buf))
4116             return 0;
4117         s = buf.release;
4118     }
4119     tmp = 0;
4120     for (i = 0; i < 3; i++) {
4121         n = 0;
4122         while (*s >= '0' && *s <= '9') {
4123             n *= 10;
4124             n += *s - '0';
4125             s++;
4126         }
4127         tmp = (tmp << 8) + n;
4128         if (*s == '.')
4129             s++;
4130     }
4131     osversion = tmp;
4132     return osversion;
4133 }
4134 
4135 /* do_syscall() should always have a single exit point at the end so
4136    that actions, such as logging of syscall results, can be performed.
4137    All errnos that do_syscall() returns must be -TARGET_<errcode>. */
4138 abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
4139                     abi_long arg2, abi_long arg3, abi_long arg4,
4140                     abi_long arg5, abi_long arg6)
4141 {
4142     abi_long ret;
4143     struct stat st;
4144     struct statfs stfs;
4145     void *p;
4146 
4147 #ifdef DEBUG
4148     gemu_log("syscall %d", num);
4149 #endif
4150     if(do_strace)
4151         print_syscall(num, arg1, arg2, arg3, arg4, arg5, arg6);
4152 
4153     switch(num) {
4154     case TARGET_NR_exit:
4155 #ifdef CONFIG_USE_NPTL
4156       /* In old applications this may be used to implement _exit(2).
4157          However in threaded applictions it is used for thread termination,
4158          and _exit_group is used for application termination.
4159          Do thread termination if we have more then one thread.  */
4160       /* FIXME: This probably breaks if a signal arrives.  We should probably
4161          be disabling signals.  */
4162       if (first_cpu->next_cpu) {
4163           TaskState *ts;
4164           CPUState **lastp;
4165           CPUState *p;
4166 
4167           cpu_list_lock();
4168           lastp = &first_cpu;
4169           p = first_cpu;
4170           while (p && p != (CPUState *)cpu_env) {
4171               lastp = &p->next_cpu;
4172               p = p->next_cpu;
4173           }
4174           /* If we didn't find the CPU for this thread then something is
4175              horribly wrong.  */
4176           if (!p)
4177               abort();
4178           /* Remove the CPU from the list.  */
4179           *lastp = p->next_cpu;
4180           cpu_list_unlock();
4181           ts = ((CPUState *)cpu_env)->opaque;
4182           if (ts->child_tidptr) {
4183               put_user_u32(0, ts->child_tidptr);
4184               sys_futex(g2h(ts->child_tidptr), FUTEX_WAKE, INT_MAX,
4185                         NULL, NULL, 0);
4186           }
4187           /* TODO: Free CPU state.  */
4188           pthread_exit(NULL);
4189       }
4190 #endif
4191 #ifdef TARGET_GPROF
4192         _mcleanup();
4193 #endif
4194         gdb_exit(cpu_env, arg1);
4195         _exit(arg1);
4196         ret = 0; /* avoid warning */
4197         break;
4198     case TARGET_NR_read:
4199         if (arg3 == 0)
4200             ret = 0;
4201         else {
4202             if (!(p = lock_user(VERIFY_WRITE, arg2, arg3, 0)))
4203                 goto efault;
4204             ret = get_errno(read(arg1, p, arg3));
4205             unlock_user(p, arg2, ret);
4206         }
4207         break;
4208     case TARGET_NR_write:
4209         if (!(p = lock_user(VERIFY_READ, arg2, arg3, 1)))
4210             goto efault;
4211         ret = get_errno(write(arg1, p, arg3));
4212         unlock_user(p, arg2, 0);
4213         break;
4214     case TARGET_NR_open:
4215         if (!(p = lock_user_string(arg1)))
4216             goto efault;
4217         ret = get_errno(open(path(p),
4218                              target_to_host_bitmask(arg2, fcntl_flags_tbl),
4219                              arg3));
4220         unlock_user(p, arg1, 0);
4221         break;
4222 #if defined(TARGET_NR_openat) && defined(__NR_openat)
4223     case TARGET_NR_openat:
4224         if (!(p = lock_user_string(arg2)))
4225             goto efault;
4226         ret = get_errno(sys_openat(arg1,
4227                                    path(p),
4228                                    target_to_host_bitmask(arg3, fcntl_flags_tbl),
4229                                    arg4));
4230         unlock_user(p, arg2, 0);
4231         break;
4232 #endif
4233     case TARGET_NR_close:
4234         ret = get_errno(close(arg1));
4235         break;
4236     case TARGET_NR_brk:
4237         ret = do_brk(arg1);
4238         break;
4239     case TARGET_NR_fork:
4240         ret = get_errno(do_fork(cpu_env, SIGCHLD, 0, 0, 0, 0));
4241         break;
4242 #ifdef TARGET_NR_waitpid
4243     case TARGET_NR_waitpid:
4244         {
4245             int status;
4246             ret = get_errno(waitpid(arg1, &status, arg3));
4247             if (!is_error(ret) && arg2
4248                 && put_user_s32(host_to_target_waitstatus(status), arg2))
4249                 goto efault;
4250         }
4251         break;
4252 #endif
4253 #ifdef TARGET_NR_waitid
4254     case TARGET_NR_waitid:
4255         {
4256             siginfo_t info;
4257             info.si_pid = 0;
4258             ret = get_errno(waitid(arg1, arg2, &info, arg4));
4259             if (!is_error(ret) && arg3 && info.si_pid != 0) {
4260                 if (!(p = lock_user(VERIFY_WRITE, arg3, sizeof(target_siginfo_t), 0)))
4261                     goto efault;
4262                 host_to_target_siginfo(p, &info);
4263                 unlock_user(p, arg3, sizeof(target_siginfo_t));
4264             }
4265         }
4266         break;
4267 #endif
4268 #ifdef TARGET_NR_creat /* not on alpha */
4269     case TARGET_NR_creat:
4270         if (!(p = lock_user_string(arg1)))
4271             goto efault;
4272         ret = get_errno(creat(p, arg2));
4273         unlock_user(p, arg1, 0);
4274         break;
4275 #endif
4276     case TARGET_NR_link:
4277         {
4278             void * p2;
4279             p = lock_user_string(arg1);
4280             p2 = lock_user_string(arg2);
4281             if (!p || !p2)
4282                 ret = -TARGET_EFAULT;
4283             else
4284                 ret = get_errno(link(p, p2));
4285             unlock_user(p2, arg2, 0);
4286             unlock_user(p, arg1, 0);
4287         }
4288         break;
4289 #if defined(TARGET_NR_linkat) && defined(__NR_linkat)
4290     case TARGET_NR_linkat:
4291         {
4292             void * p2 = NULL;
4293             if (!arg2 || !arg4)
4294                 goto efault;
4295             p  = lock_user_string(arg2);
4296             p2 = lock_user_string(arg4);
4297             if (!p || !p2)
4298                 ret = -TARGET_EFAULT;
4299             else
4300                 ret = get_errno(sys_linkat(arg1, p, arg3, p2, arg5));
4301             unlock_user(p, arg2, 0);
4302             unlock_user(p2, arg4, 0);
4303         }
4304         break;
4305 #endif
4306     case TARGET_NR_unlink:
4307         if (!(p = lock_user_string(arg1)))
4308             goto efault;
4309         ret = get_errno(unlink(p));
4310         unlock_user(p, arg1, 0);
4311         break;
4312 #if defined(TARGET_NR_unlinkat) && defined(__NR_unlinkat)
4313     case TARGET_NR_unlinkat:
4314         if (!(p = lock_user_string(arg2)))
4315             goto efault;
4316         ret = get_errno(sys_unlinkat(arg1, p, arg3));
4317         unlock_user(p, arg2, 0);
4318         break;
4319 #endif
4320     case TARGET_NR_execve:
4321         {
4322             char **argp, **envp;
4323             int argc, envc;
4324             abi_ulong gp;
4325             abi_ulong guest_argp;
4326             abi_ulong guest_envp;
4327             abi_ulong addr;
4328             char **q;
4329 
4330             argc = 0;
4331             guest_argp = arg2;
4332             for (gp = guest_argp; gp; gp += sizeof(abi_ulong)) {
4333                 if (get_user_ual(addr, gp))
4334                     goto efault;
4335                 if (!addr)
4336                     break;
4337                 argc++;
4338             }
4339             envc = 0;
4340             guest_envp = arg3;
4341             for (gp = guest_envp; gp; gp += sizeof(abi_ulong)) {
4342                 if (get_user_ual(addr, gp))
4343                     goto efault;
4344                 if (!addr)
4345                     break;
4346                 envc++;
4347             }
4348 
4349             argp = alloca((argc + 1) * sizeof(void *));
4350             envp = alloca((envc + 1) * sizeof(void *));
4351 
4352             for (gp = guest_argp, q = argp; gp;
4353                   gp += sizeof(abi_ulong), q++) {
4354                 if (get_user_ual(addr, gp))
4355                     goto execve_efault;
4356                 if (!addr)
4357                     break;
4358                 if (!(*q = lock_user_string(addr)))
4359                     goto execve_efault;
4360             }
4361             *q = NULL;
4362 
4363             for (gp = guest_envp, q = envp; gp;
4364                   gp += sizeof(abi_ulong), q++) {
4365                 if (get_user_ual(addr, gp))
4366                     goto execve_efault;
4367                 if (!addr)
4368                     break;
4369                 if (!(*q = lock_user_string(addr)))
4370                     goto execve_efault;
4371             }
4372             *q = NULL;
4373 
4374             if (!(p = lock_user_string(arg1)))
4375                 goto execve_efault;
4376             ret = get_errno(execve(p, argp, envp));
4377             unlock_user(p, arg1, 0);
4378 
4379             goto execve_end;
4380 
4381         execve_efault:
4382             ret = -TARGET_EFAULT;
4383 
4384         execve_end:
4385             for (gp = guest_argp, q = argp; *q;
4386                   gp += sizeof(abi_ulong), q++) {
4387                 if (get_user_ual(addr, gp)
4388                     || !addr)
4389                     break;
4390                 unlock_user(*q, addr, 0);
4391             }
4392             for (gp = guest_envp, q = envp; *q;
4393                   gp += sizeof(abi_ulong), q++) {
4394                 if (get_user_ual(addr, gp)
4395                     || !addr)
4396                     break;
4397                 unlock_user(*q, addr, 0);
4398             }
4399         }
4400         break;
4401     case TARGET_NR_chdir:
4402         if (!(p = lock_user_string(arg1)))
4403             goto efault;
4404         ret = get_errno(chdir(p));
4405         unlock_user(p, arg1, 0);
4406         break;
4407 #ifdef TARGET_NR_time
4408     case TARGET_NR_time:
4409         {
4410             time_t host_time;
4411             ret = get_errno(time(&host_time));
4412             if (!is_error(ret)
4413                 && arg1
4414                 && put_user_sal(host_time, arg1))
4415                 goto efault;
4416         }
4417         break;
4418 #endif
4419     case TARGET_NR_mknod:
4420         if (!(p = lock_user_string(arg1)))
4421             goto efault;
4422         ret = get_errno(mknod(p, arg2, arg3));
4423         unlock_user(p, arg1, 0);
4424         break;
4425 #if defined(TARGET_NR_mknodat) && defined(__NR_mknodat)
4426     case TARGET_NR_mknodat:
4427         if (!(p = lock_user_string(arg2)))
4428             goto efault;
4429         ret = get_errno(sys_mknodat(arg1, p, arg3, arg4));
4430         unlock_user(p, arg2, 0);
4431         break;
4432 #endif
4433     case TARGET_NR_chmod:
4434         if (!(p = lock_user_string(arg1)))
4435             goto efault;
4436         ret = get_errno(chmod(p, arg2));
4437         unlock_user(p, arg1, 0);
4438         break;
4439 #ifdef TARGET_NR_break
4440     case TARGET_NR_break:
4441         goto unimplemented;
4442 #endif
4443 #ifdef TARGET_NR_oldstat
4444     case TARGET_NR_oldstat:
4445         goto unimplemented;
4446 #endif
4447     case TARGET_NR_lseek:
4448         ret = get_errno(lseek(arg1, arg2, arg3));
4449         break;
4450 #ifdef TARGET_NR_getxpid
4451     case TARGET_NR_getxpid:
4452 #else
4453     case TARGET_NR_getpid:
4454 #endif
4455         ret = get_errno(getpid());
4456         break;
4457     case TARGET_NR_mount:
4458 		{
4459 			/* need to look at the data field */
4460 			void *p2, *p3;
4461 			p = lock_user_string(arg1);
4462 			p2 = lock_user_string(arg2);
4463 			p3 = lock_user_string(arg3);
4464                         if (!p || !p2 || !p3)
4465                             ret = -TARGET_EFAULT;
4466                         else
4467                             /* FIXME - arg5 should be locked, but it isn't clear how to
4468                              * do that since it's not guaranteed to be a NULL-terminated
4469                              * string.
4470                              */
4471                             ret = get_errno(mount(p, p2, p3, (unsigned long)arg4, g2h(arg5)));
4472                         unlock_user(p, arg1, 0);
4473                         unlock_user(p2, arg2, 0);
4474                         unlock_user(p3, arg3, 0);
4475 			break;
4476 		}
4477 #ifdef TARGET_NR_umount
4478     case TARGET_NR_umount:
4479         if (!(p = lock_user_string(arg1)))
4480             goto efault;
4481         ret = get_errno(umount(p));
4482         unlock_user(p, arg1, 0);
4483         break;
4484 #endif
4485 #ifdef TARGET_NR_stime /* not on alpha */
4486     case TARGET_NR_stime:
4487         {
4488             time_t host_time;
4489             if (get_user_sal(host_time, arg1))
4490                 goto efault;
4491             ret = get_errno(stime(&host_time));
4492         }
4493         break;
4494 #endif
4495     case TARGET_NR_ptrace:
4496         goto unimplemented;
4497 #ifdef TARGET_NR_alarm /* not on alpha */
4498     case TARGET_NR_alarm:
4499         ret = alarm(arg1);
4500         break;
4501 #endif
4502 #ifdef TARGET_NR_oldfstat
4503     case TARGET_NR_oldfstat:
4504         goto unimplemented;
4505 #endif
4506 #ifdef TARGET_NR_pause /* not on alpha */
4507     case TARGET_NR_pause:
4508         ret = get_errno(pause());
4509         break;
4510 #endif
4511 #ifdef TARGET_NR_utime
4512     case TARGET_NR_utime:
4513         {
4514             struct utimbuf tbuf, *host_tbuf;
4515             struct target_utimbuf *target_tbuf;
4516             if (arg2) {
4517                 if (!lock_user_struct(VERIFY_READ, target_tbuf, arg2, 1))
4518                     goto efault;
4519                 tbuf.actime = tswapl(target_tbuf->actime);
4520                 tbuf.modtime = tswapl(target_tbuf->modtime);
4521                 unlock_user_struct(target_tbuf, arg2, 0);
4522                 host_tbuf = &tbuf;
4523             } else {
4524                 host_tbuf = NULL;
4525             }
4526             if (!(p = lock_user_string(arg1)))
4527                 goto efault;
4528             ret = get_errno(utime(p, host_tbuf));
4529             unlock_user(p, arg1, 0);
4530         }
4531         break;
4532 #endif
4533     case TARGET_NR_utimes:
4534         {
4535             struct timeval *tvp, tv[2];
4536             if (arg2) {
4537                 if (copy_from_user_timeval(&tv[0], arg2)
4538                     || copy_from_user_timeval(&tv[1],
4539                                               arg2 + sizeof(struct target_timeval)))
4540                     goto efault;
4541                 tvp = tv;
4542             } else {
4543                 tvp = NULL;
4544             }
4545             if (!(p = lock_user_string(arg1)))
4546                 goto efault;
4547             ret = get_errno(utimes(p, tvp));
4548             unlock_user(p, arg1, 0);
4549         }
4550         break;
4551 #if defined(TARGET_NR_futimesat) && defined(__NR_futimesat)
4552     case TARGET_NR_futimesat:
4553         {
4554             struct timeval *tvp, tv[2];
4555             if (arg3) {
4556                 if (copy_from_user_timeval(&tv[0], arg3)
4557                     || copy_from_user_timeval(&tv[1],
4558                                               arg3 + sizeof(struct target_timeval)))
4559                     goto efault;
4560                 tvp = tv;
4561             } else {
4562                 tvp = NULL;
4563             }
4564             if (!(p = lock_user_string(arg2)))
4565                 goto efault;
4566             ret = get_errno(sys_futimesat(arg1, path(p), tvp));
4567             unlock_user(p, arg2, 0);
4568         }
4569         break;
4570 #endif
4571 #ifdef TARGET_NR_stty
4572     case TARGET_NR_stty:
4573         goto unimplemented;
4574 #endif
4575 #ifdef TARGET_NR_gtty
4576     case TARGET_NR_gtty:
4577         goto unimplemented;
4578 #endif
4579     case TARGET_NR_access:
4580         if (!(p = lock_user_string(arg1)))
4581             goto efault;
4582         ret = get_errno(access(path(p), arg2));
4583         unlock_user(p, arg1, 0);
4584         break;
4585 #if defined(TARGET_NR_faccessat) && defined(__NR_faccessat)
4586     case TARGET_NR_faccessat:
4587         if (!(p = lock_user_string(arg2)))
4588             goto efault;
4589         ret = get_errno(sys_faccessat(arg1, p, arg3));
4590         unlock_user(p, arg2, 0);
4591         break;
4592 #endif
4593 #ifdef TARGET_NR_nice /* not on alpha */
4594     case TARGET_NR_nice:
4595         ret = get_errno(nice(arg1));
4596         break;
4597 #endif
4598 #ifdef TARGET_NR_ftime
4599     case TARGET_NR_ftime:
4600         goto unimplemented;
4601 #endif
4602     case TARGET_NR_sync:
4603         sync();
4604         ret = 0;
4605         break;
4606     case TARGET_NR_kill:
4607         ret = get_errno(kill(arg1, target_to_host_signal(arg2)));
4608         break;
4609     case TARGET_NR_rename:
4610         {
4611             void *p2;
4612             p = lock_user_string(arg1);
4613             p2 = lock_user_string(arg2);
4614             if (!p || !p2)
4615                 ret = -TARGET_EFAULT;
4616             else
4617                 ret = get_errno(rename(p, p2));
4618             unlock_user(p2, arg2, 0);
4619             unlock_user(p, arg1, 0);
4620         }
4621         break;
4622 #if defined(TARGET_NR_renameat) && defined(__NR_renameat)
4623     case TARGET_NR_renameat:
4624         {
4625             void *p2;
4626             p  = lock_user_string(arg2);
4627             p2 = lock_user_string(arg4);
4628             if (!p || !p2)
4629                 ret = -TARGET_EFAULT;
4630             else
4631                 ret = get_errno(sys_renameat(arg1, p, arg3, p2));
4632             unlock_user(p2, arg4, 0);
4633             unlock_user(p, arg2, 0);
4634         }
4635         break;
4636 #endif
4637     case TARGET_NR_mkdir:
4638         if (!(p = lock_user_string(arg1)))
4639             goto efault;
4640         ret = get_errno(mkdir(p, arg2));
4641         unlock_user(p, arg1, 0);
4642         break;
4643 #if defined(TARGET_NR_mkdirat) && defined(__NR_mkdirat)
4644     case TARGET_NR_mkdirat:
4645         if (!(p = lock_user_string(arg2)))
4646             goto efault;
4647         ret = get_errno(sys_mkdirat(arg1, p, arg3));
4648         unlock_user(p, arg2, 0);
4649         break;
4650 #endif
4651     case TARGET_NR_rmdir:
4652         if (!(p = lock_user_string(arg1)))
4653             goto efault;
4654         ret = get_errno(rmdir(p));
4655         unlock_user(p, arg1, 0);
4656         break;
4657     case TARGET_NR_dup:
4658         ret = get_errno(dup(arg1));
4659         break;
4660     case TARGET_NR_pipe:
4661         ret = do_pipe(cpu_env, arg1, 0);
4662         break;
4663 #ifdef TARGET_NR_pipe2
4664     case TARGET_NR_pipe2:
4665         ret = do_pipe(cpu_env, arg1, arg2);
4666         break;
4667 #endif
4668     case TARGET_NR_times:
4669         {
4670             struct target_tms *tmsp;
4671             struct tms tms;
4672             ret = get_errno(times(&tms));
4673             if (arg1) {
4674                 tmsp = lock_user(VERIFY_WRITE, arg1, sizeof(struct target_tms), 0);
4675                 if (!tmsp)
4676                     goto efault;
4677                 tmsp->tms_utime = tswapl(host_to_target_clock_t(tms.tms_utime));
4678                 tmsp->tms_stime = tswapl(host_to_target_clock_t(tms.tms_stime));
4679                 tmsp->tms_cutime = tswapl(host_to_target_clock_t(tms.tms_cutime));
4680                 tmsp->tms_cstime = tswapl(host_to_target_clock_t(tms.tms_cstime));
4681             }
4682             if (!is_error(ret))
4683                 ret = host_to_target_clock_t(ret);
4684         }
4685         break;
4686 #ifdef TARGET_NR_prof
4687     case TARGET_NR_prof:
4688         goto unimplemented;
4689 #endif
4690 #ifdef TARGET_NR_signal
4691     case TARGET_NR_signal:
4692         goto unimplemented;
4693 #endif
4694     case TARGET_NR_acct:
4695         if (arg1 == 0) {
4696             ret = get_errno(acct(NULL));
4697         } else {
4698             if (!(p = lock_user_string(arg1)))
4699                 goto efault;
4700             ret = get_errno(acct(path(p)));
4701             unlock_user(p, arg1, 0);
4702         }
4703         break;
4704 #ifdef TARGET_NR_umount2 /* not on alpha */
4705     case TARGET_NR_umount2:
4706         if (!(p = lock_user_string(arg1)))
4707             goto efault;
4708         ret = get_errno(umount2(p, arg2));
4709         unlock_user(p, arg1, 0);
4710         break;
4711 #endif
4712 #ifdef TARGET_NR_lock
4713     case TARGET_NR_lock:
4714         goto unimplemented;
4715 #endif
4716     case TARGET_NR_ioctl:
4717         ret = do_ioctl(arg1, arg2, arg3);
4718         break;
4719     case TARGET_NR_fcntl:
4720         ret = do_fcntl(arg1, arg2, arg3);
4721         break;
4722 #ifdef TARGET_NR_mpx
4723     case TARGET_NR_mpx:
4724         goto unimplemented;
4725 #endif
4726     case TARGET_NR_setpgid:
4727         ret = get_errno(setpgid(arg1, arg2));
4728         break;
4729 #ifdef TARGET_NR_ulimit
4730     case TARGET_NR_ulimit:
4731         goto unimplemented;
4732 #endif
4733 #ifdef TARGET_NR_oldolduname
4734     case TARGET_NR_oldolduname:
4735         goto unimplemented;
4736 #endif
4737     case TARGET_NR_umask:
4738         ret = get_errno(umask(arg1));
4739         break;
4740     case TARGET_NR_chroot:
4741         if (!(p = lock_user_string(arg1)))
4742             goto efault;
4743         ret = get_errno(chroot(p));
4744         unlock_user(p, arg1, 0);
4745         break;
4746     case TARGET_NR_ustat:
4747         goto unimplemented;
4748     case TARGET_NR_dup2:
4749         ret = get_errno(dup2(arg1, arg2));
4750         break;
4751 #if defined(CONFIG_DUP3) && defined(TARGET_NR_dup3)
4752     case TARGET_NR_dup3:
4753         ret = get_errno(dup3(arg1, arg2, arg3));
4754         break;
4755 #endif
4756 #ifdef TARGET_NR_getppid /* not on alpha */
4757     case TARGET_NR_getppid:
4758         ret = get_errno(getppid());
4759         break;
4760 #endif
4761     case TARGET_NR_getpgrp:
4762         ret = get_errno(getpgrp());
4763         break;
4764     case TARGET_NR_setsid:
4765         ret = get_errno(setsid());
4766         break;
4767 #ifdef TARGET_NR_sigaction
4768     case TARGET_NR_sigaction:
4769         {
4770 #if !defined(TARGET_MIPS)
4771             struct target_old_sigaction *old_act;
4772             struct target_sigaction act, oact, *pact;
4773             if (arg2) {
4774                 if (!lock_user_struct(VERIFY_READ, old_act, arg2, 1))
4775                     goto efault;
4776                 act._sa_handler = old_act->_sa_handler;
4777                 target_siginitset(&act.sa_mask, old_act->sa_mask);
4778                 act.sa_flags = old_act->sa_flags;
4779                 act.sa_restorer = old_act->sa_restorer;
4780                 unlock_user_struct(old_act, arg2, 0);
4781                 pact = &act;
4782             } else {
4783                 pact = NULL;
4784             }
4785             ret = get_errno(do_sigaction(arg1, pact, &oact));
4786             if (!is_error(ret) && arg3) {
4787                 if (!lock_user_struct(VERIFY_WRITE, old_act, arg3, 0))
4788                     goto efault;
4789                 old_act->_sa_handler = oact._sa_handler;
4790                 old_act->sa_mask = oact.sa_mask.sig[0];
4791                 old_act->sa_flags = oact.sa_flags;
4792                 old_act->sa_restorer = oact.sa_restorer;
4793                 unlock_user_struct(old_act, arg3, 1);
4794             }
4795 #else
4796 	    struct target_sigaction act, oact, *pact, *old_act;
4797 
4798 	    if (arg2) {
4799                 if (!lock_user_struct(VERIFY_READ, old_act, arg2, 1))
4800                     goto efault;
4801 		act._sa_handler = old_act->_sa_handler;
4802 		target_siginitset(&act.sa_mask, old_act->sa_mask.sig[0]);
4803 		act.sa_flags = old_act->sa_flags;
4804 		unlock_user_struct(old_act, arg2, 0);
4805 		pact = &act;
4806 	    } else {
4807 		pact = NULL;
4808 	    }
4809 
4810 	    ret = get_errno(do_sigaction(arg1, pact, &oact));
4811 
4812 	    if (!is_error(ret) && arg3) {
4813                 if (!lock_user_struct(VERIFY_WRITE, old_act, arg3, 0))
4814                     goto efault;
4815 		old_act->_sa_handler = oact._sa_handler;
4816 		old_act->sa_flags = oact.sa_flags;
4817 		old_act->sa_mask.sig[0] = oact.sa_mask.sig[0];
4818 		old_act->sa_mask.sig[1] = 0;
4819 		old_act->sa_mask.sig[2] = 0;
4820 		old_act->sa_mask.sig[3] = 0;
4821 		unlock_user_struct(old_act, arg3, 1);
4822 	    }
4823 #endif
4824         }
4825         break;
4826 #endif
4827     case TARGET_NR_rt_sigaction:
4828         {
4829             struct target_sigaction *act;
4830             struct target_sigaction *oact;
4831 
4832             if (arg2) {
4833                 if (!lock_user_struct(VERIFY_READ, act, arg2, 1))
4834                     goto efault;
4835             } else
4836                 act = NULL;
4837             if (arg3) {
4838                 if (!lock_user_struct(VERIFY_WRITE, oact, arg3, 0)) {
4839                     ret = -TARGET_EFAULT;
4840                     goto rt_sigaction_fail;
4841                 }
4842             } else
4843                 oact = NULL;
4844             ret = get_errno(do_sigaction(arg1, act, oact));
4845 	rt_sigaction_fail:
4846             if (act)
4847                 unlock_user_struct(act, arg2, 0);
4848             if (oact)
4849                 unlock_user_struct(oact, arg3, 1);
4850         }
4851         break;
4852 #ifdef TARGET_NR_sgetmask /* not on alpha */
4853     case TARGET_NR_sgetmask:
4854         {
4855             sigset_t cur_set;
4856             abi_ulong target_set;
4857             sigprocmask(0, NULL, &cur_set);
4858             host_to_target_old_sigset(&target_set, &cur_set);
4859             ret = target_set;
4860         }
4861         break;
4862 #endif
4863 #ifdef TARGET_NR_ssetmask /* not on alpha */
4864     case TARGET_NR_ssetmask:
4865         {
4866             sigset_t set, oset, cur_set;
4867             abi_ulong target_set = arg1;
4868             sigprocmask(0, NULL, &cur_set);
4869             target_to_host_old_sigset(&set, &target_set);
4870             sigorset(&set, &set, &cur_set);
4871             sigprocmask(SIG_SETMASK, &set, &oset);
4872             host_to_target_old_sigset(&target_set, &oset);
4873             ret = target_set;
4874         }
4875         break;
4876 #endif
4877 #ifdef TARGET_NR_sigprocmask
4878     case TARGET_NR_sigprocmask:
4879         {
4880             int how = arg1;
4881             sigset_t set, oldset, *set_ptr;
4882 
4883             if (arg2) {
4884                 switch(how) {
4885                 case TARGET_SIG_BLOCK:
4886                     how = SIG_BLOCK;
4887                     break;
4888                 case TARGET_SIG_UNBLOCK:
4889                     how = SIG_UNBLOCK;
4890                     break;
4891                 case TARGET_SIG_SETMASK:
4892                     how = SIG_SETMASK;
4893                     break;
4894                 default:
4895                     ret = -TARGET_EINVAL;
4896                     goto fail;
4897                 }
4898                 if (!(p = lock_user(VERIFY_READ, arg2, sizeof(target_sigset_t), 1)))
4899                     goto efault;
4900                 target_to_host_old_sigset(&set, p);
4901                 unlock_user(p, arg2, 0);
4902                 set_ptr = &set;
4903             } else {
4904                 how = 0;
4905                 set_ptr = NULL;
4906             }
4907             ret = get_errno(sigprocmask(arg1, set_ptr, &oldset));
4908             if (!is_error(ret) && arg3) {
4909                 if (!(p = lock_user(VERIFY_WRITE, arg3, sizeof(target_sigset_t), 0)))
4910                     goto efault;
4911                 host_to_target_old_sigset(p, &oldset);
4912                 unlock_user(p, arg3, sizeof(target_sigset_t));
4913             }
4914         }
4915         break;
4916 #endif
4917     case TARGET_NR_rt_sigprocmask:
4918         {
4919             int how = arg1;
4920             sigset_t set, oldset, *set_ptr;
4921 
4922             if (arg2) {
4923                 switch(how) {
4924                 case TARGET_SIG_BLOCK:
4925                     how = SIG_BLOCK;
4926                     break;
4927                 case TARGET_SIG_UNBLOCK:
4928                     how = SIG_UNBLOCK;
4929                     break;
4930                 case TARGET_SIG_SETMASK:
4931                     how = SIG_SETMASK;
4932                     break;
4933                 default:
4934                     ret = -TARGET_EINVAL;
4935                     goto fail;
4936                 }
4937                 if (!(p = lock_user(VERIFY_READ, arg2, sizeof(target_sigset_t), 1)))
4938                     goto efault;
4939                 target_to_host_sigset(&set, p);
4940                 unlock_user(p, arg2, 0);
4941                 set_ptr = &set;
4942             } else {
4943                 how = 0;
4944                 set_ptr = NULL;
4945             }
4946             ret = get_errno(sigprocmask(how, set_ptr, &oldset));
4947             if (!is_error(ret) && arg3) {
4948                 if (!(p = lock_user(VERIFY_WRITE, arg3, sizeof(target_sigset_t), 0)))
4949                     goto efault;
4950                 host_to_target_sigset(p, &oldset);
4951                 unlock_user(p, arg3, sizeof(target_sigset_t));
4952             }
4953         }
4954         break;
4955 #ifdef TARGET_NR_sigpending
4956     case TARGET_NR_sigpending:
4957         {
4958             sigset_t set;
4959             ret = get_errno(sigpending(&set));
4960             if (!is_error(ret)) {
4961                 if (!(p = lock_user(VERIFY_WRITE, arg1, sizeof(target_sigset_t), 0)))
4962                     goto efault;
4963                 host_to_target_old_sigset(p, &set);
4964                 unlock_user(p, arg1, sizeof(target_sigset_t));
4965             }
4966         }
4967         break;
4968 #endif
4969     case TARGET_NR_rt_sigpending:
4970         {
4971             sigset_t set;
4972             ret = get_errno(sigpending(&set));
4973             if (!is_error(ret)) {
4974                 if (!(p = lock_user(VERIFY_WRITE, arg1, sizeof(target_sigset_t), 0)))
4975                     goto efault;
4976                 host_to_target_sigset(p, &set);
4977                 unlock_user(p, arg1, sizeof(target_sigset_t));
4978             }
4979         }
4980         break;
4981 #ifdef TARGET_NR_sigsuspend
4982     case TARGET_NR_sigsuspend:
4983         {
4984             sigset_t set;
4985             if (!(p = lock_user(VERIFY_READ, arg1, sizeof(target_sigset_t), 1)))
4986                 goto efault;
4987             target_to_host_old_sigset(&set, p);
4988             unlock_user(p, arg1, 0);
4989             ret = get_errno(sigsuspend(&set));
4990         }
4991         break;
4992 #endif
4993     case TARGET_NR_rt_sigsuspend:
4994         {
4995             sigset_t set;
4996             if (!(p = lock_user(VERIFY_READ, arg1, sizeof(target_sigset_t), 1)))
4997                 goto efault;
4998             target_to_host_sigset(&set, p);
4999             unlock_user(p, arg1, 0);
5000             ret = get_errno(sigsuspend(&set));
5001         }
5002         break;
5003     case TARGET_NR_rt_sigtimedwait:
5004         {
5005             sigset_t set;
5006             struct timespec uts, *puts;
5007             siginfo_t uinfo;
5008 
5009             if (!(p = lock_user(VERIFY_READ, arg1, sizeof(target_sigset_t), 1)))
5010                 goto efault;
5011             target_to_host_sigset(&set, p);
5012             unlock_user(p, arg1, 0);
5013             if (arg3) {
5014                 puts = &uts;
5015                 target_to_host_timespec(puts, arg3);
5016             } else {
5017                 puts = NULL;
5018             }
5019             ret = get_errno(sigtimedwait(&set, &uinfo, puts));
5020             if (!is_error(ret) && arg2) {
5021                 if (!(p = lock_user(VERIFY_WRITE, arg2, sizeof(target_siginfo_t), 0)))
5022                     goto efault;
5023                 host_to_target_siginfo(p, &uinfo);
5024                 unlock_user(p, arg2, sizeof(target_siginfo_t));
5025             }
5026         }
5027         break;
5028     case TARGET_NR_rt_sigqueueinfo:
5029         {
5030             siginfo_t uinfo;
5031             if (!(p = lock_user(VERIFY_READ, arg3, sizeof(target_sigset_t), 1)))
5032                 goto efault;
5033             target_to_host_siginfo(&uinfo, p);
5034             unlock_user(p, arg1, 0);
5035             ret = get_errno(sys_rt_sigqueueinfo(arg1, arg2, &uinfo));
5036         }
5037         break;
5038 #ifdef TARGET_NR_sigreturn
5039     case TARGET_NR_sigreturn:
5040         /* NOTE: ret is eax, so not transcoding must be done */
5041         ret = do_sigreturn(cpu_env);
5042         break;
5043 #endif
5044     case TARGET_NR_rt_sigreturn:
5045         /* NOTE: ret is eax, so not transcoding must be done */
5046         ret = do_rt_sigreturn(cpu_env);
5047         break;
5048     case TARGET_NR_sethostname:
5049         if (!(p = lock_user_string(arg1)))
5050             goto efault;
5051         ret = get_errno(sethostname(p, arg2));
5052         unlock_user(p, arg1, 0);
5053         break;
5054     case TARGET_NR_setrlimit:
5055         {
5056             /* XXX: convert resource ? */
5057             int resource = arg1;
5058             struct target_rlimit *target_rlim;
5059             struct rlimit rlim;
5060             if (!lock_user_struct(VERIFY_READ, target_rlim, arg2, 1))
5061                 goto efault;
5062             rlim.rlim_cur = tswapl(target_rlim->rlim_cur);
5063             rlim.rlim_max = tswapl(target_rlim->rlim_max);
5064             unlock_user_struct(target_rlim, arg2, 0);
5065             ret = get_errno(setrlimit(resource, &rlim));
5066         }
5067         break;
5068     case TARGET_NR_getrlimit:
5069         {
5070             /* XXX: convert resource ? */
5071             int resource = arg1;
5072             struct target_rlimit *target_rlim;
5073             struct rlimit rlim;
5074 
5075             ret = get_errno(getrlimit(resource, &rlim));
5076             if (!is_error(ret)) {
5077                 if (!lock_user_struct(VERIFY_WRITE, target_rlim, arg2, 0))
5078                     goto efault;
5079                 target_rlim->rlim_cur = tswapl(rlim.rlim_cur);
5080                 target_rlim->rlim_max = tswapl(rlim.rlim_max);
5081                 unlock_user_struct(target_rlim, arg2, 1);
5082             }
5083         }
5084         break;
5085     case TARGET_NR_getrusage:
5086         {
5087             struct rusage rusage;
5088             ret = get_errno(getrusage(arg1, &rusage));
5089             if (!is_error(ret)) {
5090                 host_to_target_rusage(arg2, &rusage);
5091             }
5092         }
5093         break;
5094     case TARGET_NR_gettimeofday:
5095         {
5096             struct timeval tv;
5097             ret = get_errno(gettimeofday(&tv, NULL));
5098             if (!is_error(ret)) {
5099                 if (copy_to_user_timeval(arg1, &tv))
5100                     goto efault;
5101             }
5102         }
5103         break;
5104     case TARGET_NR_settimeofday:
5105         {
5106             struct timeval tv;
5107             if (copy_from_user_timeval(&tv, arg1))
5108                 goto efault;
5109             ret = get_errno(settimeofday(&tv, NULL));
5110         }
5111         break;
5112 #ifdef TARGET_NR_select
5113     case TARGET_NR_select:
5114         {
5115             struct target_sel_arg_struct *sel;
5116             abi_ulong inp, outp, exp, tvp;
5117             long nsel;
5118 
5119             if (!lock_user_struct(VERIFY_READ, sel, arg1, 1))
5120                 goto efault;
5121             nsel = tswapl(sel->n);
5122             inp = tswapl(sel->inp);
5123             outp = tswapl(sel->outp);
5124             exp = tswapl(sel->exp);
5125             tvp = tswapl(sel->tvp);
5126             unlock_user_struct(sel, arg1, 0);
5127             ret = do_select(nsel, inp, outp, exp, tvp);
5128         }
5129         break;
5130 #endif
5131     case TARGET_NR_symlink:
5132         {
5133             void *p2;
5134             p = lock_user_string(arg1);
5135             p2 = lock_user_string(arg2);
5136             if (!p || !p2)
5137                 ret = -TARGET_EFAULT;
5138             else
5139                 ret = get_errno(symlink(p, p2));
5140             unlock_user(p2, arg2, 0);
5141             unlock_user(p, arg1, 0);
5142         }
5143         break;
5144 #if defined(TARGET_NR_symlinkat) && defined(__NR_symlinkat)
5145     case TARGET_NR_symlinkat:
5146         {
5147             void *p2;
5148             p  = lock_user_string(arg1);
5149             p2 = lock_user_string(arg3);
5150             if (!p || !p2)
5151                 ret = -TARGET_EFAULT;
5152             else
5153                 ret = get_errno(sys_symlinkat(p, arg2, p2));
5154             unlock_user(p2, arg3, 0);
5155             unlock_user(p, arg1, 0);
5156         }
5157         break;
5158 #endif
5159 #ifdef TARGET_NR_oldlstat
5160     case TARGET_NR_oldlstat:
5161         goto unimplemented;
5162 #endif
5163     case TARGET_NR_readlink:
5164         {
5165             void *p2, *temp;
5166             p = lock_user_string(arg1);
5167             p2 = lock_user(VERIFY_WRITE, arg2, arg3, 0);
5168             if (!p || !p2)
5169                 ret = -TARGET_EFAULT;
5170             else {
5171                 if (strncmp((const char *)p, "/proc/self/exe", 14) == 0) {
5172                     char real[PATH_MAX];
5173                     temp = realpath(exec_path,real);
5174                     ret = (temp==NULL) ? get_errno(-1) : strlen(real) ;
5175                     snprintf((char *)p2, arg3, "%s", real);
5176                     }
5177                 else
5178                     ret = get_errno(readlink(path(p), p2, arg3));
5179             }
5180             unlock_user(p2, arg2, ret);
5181             unlock_user(p, arg1, 0);
5182         }
5183         break;
5184 #if defined(TARGET_NR_readlinkat) && defined(__NR_readlinkat)
5185     case TARGET_NR_readlinkat:
5186         {
5187             void *p2;
5188             p  = lock_user_string(arg2);
5189             p2 = lock_user(VERIFY_WRITE, arg3, arg4, 0);
5190             if (!p || !p2)
5191         	ret = -TARGET_EFAULT;
5192             else
5193                 ret = get_errno(sys_readlinkat(arg1, path(p), p2, arg4));
5194             unlock_user(p2, arg3, ret);
5195             unlock_user(p, arg2, 0);
5196         }
5197         break;
5198 #endif
5199 #ifdef TARGET_NR_uselib
5200     case TARGET_NR_uselib:
5201         goto unimplemented;
5202 #endif
5203 #ifdef TARGET_NR_swapon
5204     case TARGET_NR_swapon:
5205         if (!(p = lock_user_string(arg1)))
5206             goto efault;
5207         ret = get_errno(swapon(p, arg2));
5208         unlock_user(p, arg1, 0);
5209         break;
5210 #endif
5211     case TARGET_NR_reboot:
5212         goto unimplemented;
5213 #ifdef TARGET_NR_readdir
5214     case TARGET_NR_readdir:
5215         goto unimplemented;
5216 #endif
5217 #ifdef TARGET_NR_mmap
5218     case TARGET_NR_mmap:
5219 #if (defined(TARGET_I386) && defined(TARGET_ABI32)) || defined(TARGET_ARM) || defined(TARGET_M68K) || defined(TARGET_CRIS) || defined(TARGET_MICROBLAZE)
5220         {
5221             abi_ulong *v;
5222             abi_ulong v1, v2, v3, v4, v5, v6;
5223             if (!(v = lock_user(VERIFY_READ, arg1, 6 * sizeof(abi_ulong), 1)))
5224                 goto efault;
5225             v1 = tswapl(v[0]);
5226             v2 = tswapl(v[1]);
5227             v3 = tswapl(v[2]);
5228             v4 = tswapl(v[3]);
5229             v5 = tswapl(v[4]);
5230             v6 = tswapl(v[5]);
5231             unlock_user(v, arg1, 0);
5232             ret = get_errno(target_mmap(v1, v2, v3,
5233                                         target_to_host_bitmask(v4, mmap_flags_tbl),
5234                                         v5, v6));
5235         }
5236 #else
5237         ret = get_errno(target_mmap(arg1, arg2, arg3,
5238                                     target_to_host_bitmask(arg4, mmap_flags_tbl),
5239                                     arg5,
5240                                     arg6));
5241 #endif
5242         break;
5243 #endif
5244 #ifdef TARGET_NR_mmap2
5245     case TARGET_NR_mmap2:
5246 #ifndef MMAP_SHIFT
5247 #define MMAP_SHIFT 12
5248 #endif
5249         ret = get_errno(target_mmap(arg1, arg2, arg3,
5250                                     target_to_host_bitmask(arg4, mmap_flags_tbl),
5251                                     arg5,
5252                                     arg6 << MMAP_SHIFT));
5253         break;
5254 #endif
5255     case TARGET_NR_munmap:
5256         ret = get_errno(target_munmap(arg1, arg2));
5257         break;
5258     case TARGET_NR_mprotect:
5259         ret = get_errno(target_mprotect(arg1, arg2, arg3));
5260         break;
5261 #ifdef TARGET_NR_mremap
5262     case TARGET_NR_mremap:
5263         ret = get_errno(target_mremap(arg1, arg2, arg3, arg4, arg5));
5264         break;
5265 #endif
5266         /* ??? msync/mlock/munlock are broken for softmmu.  */
5267 #ifdef TARGET_NR_msync
5268     case TARGET_NR_msync:
5269         ret = get_errno(msync(g2h(arg1), arg2, arg3));
5270         break;
5271 #endif
5272 #ifdef TARGET_NR_mlock
5273     case TARGET_NR_mlock:
5274         ret = get_errno(mlock(g2h(arg1), arg2));
5275         break;
5276 #endif
5277 #ifdef TARGET_NR_munlock
5278     case TARGET_NR_munlock:
5279         ret = get_errno(munlock(g2h(arg1), arg2));
5280         break;
5281 #endif
5282 #ifdef TARGET_NR_mlockall
5283     case TARGET_NR_mlockall:
5284         ret = get_errno(mlockall(arg1));
5285         break;
5286 #endif
5287 #ifdef TARGET_NR_munlockall
5288     case TARGET_NR_munlockall:
5289         ret = get_errno(munlockall());
5290         break;
5291 #endif
5292     case TARGET_NR_truncate:
5293         if (!(p = lock_user_string(arg1)))
5294             goto efault;
5295         ret = get_errno(truncate(p, arg2));
5296         unlock_user(p, arg1, 0);
5297         break;
5298     case TARGET_NR_ftruncate:
5299         ret = get_errno(ftruncate(arg1, arg2));
5300         break;
5301     case TARGET_NR_fchmod:
5302         ret = get_errno(fchmod(arg1, arg2));
5303         break;
5304 #if defined(TARGET_NR_fchmodat) && defined(__NR_fchmodat)
5305     case TARGET_NR_fchmodat:
5306         if (!(p = lock_user_string(arg2)))
5307             goto efault;
5308         ret = get_errno(sys_fchmodat(arg1, p, arg3));
5309         unlock_user(p, arg2, 0);
5310         break;
5311 #endif
5312     case TARGET_NR_getpriority:
5313         /* libc does special remapping of the return value of
5314          * sys_getpriority() so it's just easiest to call
5315          * sys_getpriority() directly rather than through libc. */
5316         ret = get_errno(sys_getpriority(arg1, arg2));
5317         break;
5318     case TARGET_NR_setpriority:
5319         ret = get_errno(setpriority(arg1, arg2, arg3));
5320         break;
5321 #ifdef TARGET_NR_profil
5322     case TARGET_NR_profil:
5323         goto unimplemented;
5324 #endif
5325     case TARGET_NR_statfs:
5326         if (!(p = lock_user_string(arg1)))
5327             goto efault;
5328         ret = get_errno(statfs(path(p), &stfs));
5329         unlock_user(p, arg1, 0);
5330     convert_statfs:
5331         if (!is_error(ret)) {
5332             struct target_statfs *target_stfs;
5333 
5334             if (!lock_user_struct(VERIFY_WRITE, target_stfs, arg2, 0))
5335                 goto efault;
5336             __put_user(stfs.f_type, &target_stfs->f_type);
5337             __put_user(stfs.f_bsize, &target_stfs->f_bsize);
5338             __put_user(stfs.f_blocks, &target_stfs->f_blocks);
5339             __put_user(stfs.f_bfree, &target_stfs->f_bfree);
5340             __put_user(stfs.f_bavail, &target_stfs->f_bavail);
5341             __put_user(stfs.f_files, &target_stfs->f_files);
5342             __put_user(stfs.f_ffree, &target_stfs->f_ffree);
5343             __put_user(stfs.f_fsid.__val[0], &target_stfs->f_fsid.val[0]);
5344             __put_user(stfs.f_fsid.__val[1], &target_stfs->f_fsid.val[1]);
5345             __put_user(stfs.f_namelen, &target_stfs->f_namelen);
5346             unlock_user_struct(target_stfs, arg2, 1);
5347         }
5348         break;
5349     case TARGET_NR_fstatfs:
5350         ret = get_errno(fstatfs(arg1, &stfs));
5351         goto convert_statfs;
5352 #ifdef TARGET_NR_statfs64
5353     case TARGET_NR_statfs64:
5354         if (!(p = lock_user_string(arg1)))
5355             goto efault;
5356         ret = get_errno(statfs(path(p), &stfs));
5357         unlock_user(p, arg1, 0);
5358     convert_statfs64:
5359         if (!is_error(ret)) {
5360             struct target_statfs64 *target_stfs;
5361 
5362             if (!lock_user_struct(VERIFY_WRITE, target_stfs, arg3, 0))
5363                 goto efault;
5364             __put_user(stfs.f_type, &target_stfs->f_type);
5365             __put_user(stfs.f_bsize, &target_stfs->f_bsize);
5366             __put_user(stfs.f_blocks, &target_stfs->f_blocks);
5367             __put_user(stfs.f_bfree, &target_stfs->f_bfree);
5368             __put_user(stfs.f_bavail, &target_stfs->f_bavail);
5369             __put_user(stfs.f_files, &target_stfs->f_files);
5370             __put_user(stfs.f_ffree, &target_stfs->f_ffree);
5371             __put_user(stfs.f_fsid.__val[0], &target_stfs->f_fsid.val[0]);
5372             __put_user(stfs.f_fsid.__val[1], &target_stfs->f_fsid.val[1]);
5373             __put_user(stfs.f_namelen, &target_stfs->f_namelen);
5374             unlock_user_struct(target_stfs, arg3, 1);
5375         }
5376         break;
5377     case TARGET_NR_fstatfs64:
5378         ret = get_errno(fstatfs(arg1, &stfs));
5379         goto convert_statfs64;
5380 #endif
5381 #ifdef TARGET_NR_ioperm
5382     case TARGET_NR_ioperm:
5383         goto unimplemented;
5384 #endif
5385 #ifdef TARGET_NR_socketcall
5386     case TARGET_NR_socketcall:
5387         ret = do_socketcall(arg1, arg2);
5388         break;
5389 #endif
5390 #ifdef TARGET_NR_accept
5391     case TARGET_NR_accept:
5392         ret = do_accept(arg1, arg2, arg3);
5393         break;
5394 #endif
5395 #ifdef TARGET_NR_bind
5396     case TARGET_NR_bind:
5397         ret = do_bind(arg1, arg2, arg3);
5398         break;
5399 #endif
5400 #ifdef TARGET_NR_connect
5401     case TARGET_NR_connect:
5402         ret = do_connect(arg1, arg2, arg3);
5403         break;
5404 #endif
5405 #ifdef TARGET_NR_getpeername
5406     case TARGET_NR_getpeername:
5407         ret = do_getpeername(arg1, arg2, arg3);
5408         break;
5409 #endif
5410 #ifdef TARGET_NR_getsockname
5411     case TARGET_NR_getsockname:
5412         ret = do_getsockname(arg1, arg2, arg3);
5413         break;
5414 #endif
5415 #ifdef TARGET_NR_getsockopt
5416     case TARGET_NR_getsockopt:
5417         ret = do_getsockopt(arg1, arg2, arg3, arg4, arg5);
5418         break;
5419 #endif
5420 #ifdef TARGET_NR_listen
5421     case TARGET_NR_listen:
5422         ret = get_errno(listen(arg1, arg2));
5423         break;
5424 #endif
5425 #ifdef TARGET_NR_recv
5426     case TARGET_NR_recv:
5427         ret = do_recvfrom(arg1, arg2, arg3, arg4, 0, 0);
5428         break;
5429 #endif
5430 #ifdef TARGET_NR_recvfrom
5431     case TARGET_NR_recvfrom:
5432         ret = do_recvfrom(arg1, arg2, arg3, arg4, arg5, arg6);
5433         break;
5434 #endif
5435 #ifdef TARGET_NR_recvmsg
5436     case TARGET_NR_recvmsg:
5437         ret = do_sendrecvmsg(arg1, arg2, arg3, 0);
5438         break;
5439 #endif
5440 #ifdef TARGET_NR_send
5441     case TARGET_NR_send:
5442         ret = do_sendto(arg1, arg2, arg3, arg4, 0, 0);
5443         break;
5444 #endif
5445 #ifdef TARGET_NR_sendmsg
5446     case TARGET_NR_sendmsg:
5447         ret = do_sendrecvmsg(arg1, arg2, arg3, 1);
5448         break;
5449 #endif
5450 #ifdef TARGET_NR_sendto
5451     case TARGET_NR_sendto:
5452         ret = do_sendto(arg1, arg2, arg3, arg4, arg5, arg6);
5453         break;
5454 #endif
5455 #ifdef TARGET_NR_shutdown
5456     case TARGET_NR_shutdown:
5457         ret = get_errno(shutdown(arg1, arg2));
5458         break;
5459 #endif
5460 #ifdef TARGET_NR_socket
5461     case TARGET_NR_socket:
5462         ret = do_socket(arg1, arg2, arg3);
5463         break;
5464 #endif
5465 #ifdef TARGET_NR_socketpair
5466     case TARGET_NR_socketpair:
5467         ret = do_socketpair(arg1, arg2, arg3, arg4);
5468         break;
5469 #endif
5470 #ifdef TARGET_NR_setsockopt
5471     case TARGET_NR_setsockopt:
5472         ret = do_setsockopt(arg1, arg2, arg3, arg4, (socklen_t) arg5);
5473         break;
5474 #endif
5475 
5476     case TARGET_NR_syslog:
5477         if (!(p = lock_user_string(arg2)))
5478             goto efault;
5479         ret = get_errno(sys_syslog((int)arg1, p, (int)arg3));
5480         unlock_user(p, arg2, 0);
5481         break;
5482 
5483     case TARGET_NR_setitimer:
5484         {
5485             struct itimerval value, ovalue, *pvalue;
5486 
5487             if (arg2) {
5488                 pvalue = &value;
5489                 if (copy_from_user_timeval(&pvalue->it_interval, arg2)
5490                     || copy_from_user_timeval(&pvalue->it_value,
5491                                               arg2 + sizeof(struct target_timeval)))
5492                     goto efault;
5493             } else {
5494                 pvalue = NULL;
5495             }
5496             ret = get_errno(setitimer(arg1, pvalue, &ovalue));
5497             if (!is_error(ret) && arg3) {
5498                 if (copy_to_user_timeval(arg3,
5499                                          &ovalue.it_interval)
5500                     || copy_to_user_timeval(arg3 + sizeof(struct target_timeval),
5501                                             &ovalue.it_value))
5502                     goto efault;
5503             }
5504         }
5505         break;
5506     case TARGET_NR_getitimer:
5507         {
5508             struct itimerval value;
5509 
5510             ret = get_errno(getitimer(arg1, &value));
5511             if (!is_error(ret) && arg2) {
5512                 if (copy_to_user_timeval(arg2,
5513                                          &value.it_interval)
5514                     || copy_to_user_timeval(arg2 + sizeof(struct target_timeval),
5515                                             &value.it_value))
5516                     goto efault;
5517             }
5518         }
5519         break;
5520     case TARGET_NR_stat:
5521         if (!(p = lock_user_string(arg1)))
5522             goto efault;
5523         ret = get_errno(stat(path(p), &st));
5524         unlock_user(p, arg1, 0);
5525         goto do_stat;
5526     case TARGET_NR_lstat:
5527         if (!(p = lock_user_string(arg1)))
5528             goto efault;
5529         ret = get_errno(lstat(path(p), &st));
5530         unlock_user(p, arg1, 0);
5531         goto do_stat;
5532     case TARGET_NR_fstat:
5533         {
5534             ret = get_errno(fstat(arg1, &st));
5535         do_stat:
5536             if (!is_error(ret)) {
5537                 struct target_stat *target_st;
5538 
5539                 if (!lock_user_struct(VERIFY_WRITE, target_st, arg2, 0))
5540                     goto efault;
5541                 memset(target_st, 0, sizeof(*target_st));
5542                 __put_user(st.st_dev, &target_st->st_dev);
5543                 __put_user(st.st_ino, &target_st->st_ino);
5544                 __put_user(st.st_mode, &target_st->st_mode);
5545                 __put_user(st.st_uid, &target_st->st_uid);
5546                 __put_user(st.st_gid, &target_st->st_gid);
5547                 __put_user(st.st_nlink, &target_st->st_nlink);
5548                 __put_user(st.st_rdev, &target_st->st_rdev);
5549                 __put_user(st.st_size, &target_st->st_size);
5550                 __put_user(st.st_blksize, &target_st->st_blksize);
5551                 __put_user(st.st_blocks, &target_st->st_blocks);
5552                 __put_user(st.st_atime, &target_st->target_st_atime);
5553                 __put_user(st.st_mtime, &target_st->target_st_mtime);
5554                 __put_user(st.st_ctime, &target_st->target_st_ctime);
5555                 unlock_user_struct(target_st, arg2, 1);
5556             }
5557         }
5558         break;
5559 #ifdef TARGET_NR_olduname
5560     case TARGET_NR_olduname:
5561         goto unimplemented;
5562 #endif
5563 #ifdef TARGET_NR_iopl
5564     case TARGET_NR_iopl:
5565         goto unimplemented;
5566 #endif
5567     case TARGET_NR_vhangup:
5568         ret = get_errno(vhangup());
5569         break;
5570 #ifdef TARGET_NR_idle
5571     case TARGET_NR_idle:
5572         goto unimplemented;
5573 #endif
5574 #ifdef TARGET_NR_syscall
5575     case TARGET_NR_syscall:
5576     	ret = do_syscall(cpu_env,arg1 & 0xffff,arg2,arg3,arg4,arg5,arg6,0);
5577     	break;
5578 #endif
5579     case TARGET_NR_wait4:
5580         {
5581             int status;
5582             abi_long status_ptr = arg2;
5583             struct rusage rusage, *rusage_ptr;
5584             abi_ulong target_rusage = arg4;
5585             if (target_rusage)
5586                 rusage_ptr = &rusage;
5587             else
5588                 rusage_ptr = NULL;
5589             ret = get_errno(wait4(arg1, &status, arg3, rusage_ptr));
5590             if (!is_error(ret)) {
5591                 if (status_ptr) {
5592                     status = host_to_target_waitstatus(status);
5593                     if (put_user_s32(status, status_ptr))
5594                         goto efault;
5595                 }
5596                 if (target_rusage)
5597                     host_to_target_rusage(target_rusage, &rusage);
5598             }
5599         }
5600         break;
5601 #ifdef TARGET_NR_swapoff
5602     case TARGET_NR_swapoff:
5603         if (!(p = lock_user_string(arg1)))
5604             goto efault;
5605         ret = get_errno(swapoff(p));
5606         unlock_user(p, arg1, 0);
5607         break;
5608 #endif
5609     case TARGET_NR_sysinfo:
5610         {
5611             struct target_sysinfo *target_value;
5612             struct sysinfo value;
5613             ret = get_errno(sysinfo(&value));
5614             if (!is_error(ret) && arg1)
5615             {
5616                 if (!lock_user_struct(VERIFY_WRITE, target_value, arg1, 0))
5617                     goto efault;
5618                 __put_user(value.uptime, &target_value->uptime);
5619                 __put_user(value.loads[0], &target_value->loads[0]);
5620                 __put_user(value.loads[1], &target_value->loads[1]);
5621                 __put_user(value.loads[2], &target_value->loads[2]);
5622                 __put_user(value.totalram, &target_value->totalram);
5623                 __put_user(value.freeram, &target_value->freeram);
5624                 __put_user(value.sharedram, &target_value->sharedram);
5625                 __put_user(value.bufferram, &target_value->bufferram);
5626                 __put_user(value.totalswap, &target_value->totalswap);
5627                 __put_user(value.freeswap, &target_value->freeswap);
5628                 __put_user(value.procs, &target_value->procs);
5629                 __put_user(value.totalhigh, &target_value->totalhigh);
5630                 __put_user(value.freehigh, &target_value->freehigh);
5631                 __put_user(value.mem_unit, &target_value->mem_unit);
5632                 unlock_user_struct(target_value, arg1, 1);
5633             }
5634         }
5635         break;
5636 #ifdef TARGET_NR_ipc
5637     case TARGET_NR_ipc:
5638 	ret = do_ipc(arg1, arg2, arg3, arg4, arg5, arg6);
5639 	break;
5640 #endif
5641 #ifdef TARGET_NR_semget
5642     case TARGET_NR_semget:
5643         ret = get_errno(semget(arg1, arg2, arg3));
5644         break;
5645 #endif
5646 #ifdef TARGET_NR_semop
5647     case TARGET_NR_semop:
5648         ret = get_errno(do_semop(arg1, arg2, arg3));
5649         break;
5650 #endif
5651 #ifdef TARGET_NR_semctl
5652     case TARGET_NR_semctl:
5653         ret = do_semctl(arg1, arg2, arg3, (union target_semun)(abi_ulong)arg4);
5654         break;
5655 #endif
5656 #ifdef TARGET_NR_msgctl
5657     case TARGET_NR_msgctl:
5658         ret = do_msgctl(arg1, arg2, arg3);
5659         break;
5660 #endif
5661 #ifdef TARGET_NR_msgget
5662     case TARGET_NR_msgget:
5663         ret = get_errno(msgget(arg1, arg2));
5664         break;
5665 #endif
5666 #ifdef TARGET_NR_msgrcv
5667     case TARGET_NR_msgrcv:
5668         ret = do_msgrcv(arg1, arg2, arg3, arg4, arg5);
5669         break;
5670 #endif
5671 #ifdef TARGET_NR_msgsnd
5672     case TARGET_NR_msgsnd:
5673         ret = do_msgsnd(arg1, arg2, arg3, arg4);
5674         break;
5675 #endif
5676 #ifdef TARGET_NR_shmget
5677     case TARGET_NR_shmget:
5678         ret = get_errno(shmget(arg1, arg2, arg3));
5679         break;
5680 #endif
5681 #ifdef TARGET_NR_shmctl
5682     case TARGET_NR_shmctl:
5683         ret = do_shmctl(arg1, arg2, arg3);
5684         break;
5685 #endif
5686 #ifdef TARGET_NR_shmat
5687     case TARGET_NR_shmat:
5688         ret = do_shmat(arg1, arg2, arg3);
5689         break;
5690 #endif
5691 #ifdef TARGET_NR_shmdt
5692     case TARGET_NR_shmdt:
5693         ret = do_shmdt(arg1);
5694         break;
5695 #endif
5696     case TARGET_NR_fsync:
5697         ret = get_errno(fsync(arg1));
5698         break;
5699     case TARGET_NR_clone:
5700 #if defined(TARGET_SH4)
5701         ret = get_errno(do_fork(cpu_env, arg1, arg2, arg3, arg5, arg4));
5702 #elif defined(TARGET_CRIS)
5703         ret = get_errno(do_fork(cpu_env, arg2, arg1, arg3, arg4, arg5));
5704 #else
5705         ret = get_errno(do_fork(cpu_env, arg1, arg2, arg3, arg4, arg5));
5706 #endif
5707         break;
5708 #ifdef __NR_exit_group
5709         /* new thread calls */
5710     case TARGET_NR_exit_group:
5711 #ifdef TARGET_GPROF
5712         _mcleanup();
5713 #endif
5714         gdb_exit(cpu_env, arg1);
5715         ret = get_errno(exit_group(arg1));
5716         break;
5717 #endif
5718     case TARGET_NR_setdomainname:
5719         if (!(p = lock_user_string(arg1)))
5720             goto efault;
5721         ret = get_errno(setdomainname(p, arg2));
5722         unlock_user(p, arg1, 0);
5723         break;
5724     case TARGET_NR_uname:
5725         /* no need to transcode because we use the linux syscall */
5726         {
5727             struct new_utsname * buf;
5728 
5729             if (!lock_user_struct(VERIFY_WRITE, buf, arg1, 0))
5730                 goto efault;
5731             ret = get_errno(sys_uname(buf));
5732             if (!is_error(ret)) {
5733                 /* Overrite the native machine name with whatever is being
5734                    emulated. */
5735                 strcpy (buf->machine, UNAME_MACHINE);
5736                 /* Allow the user to override the reported release.  */
5737                 if (qemu_uname_release && *qemu_uname_release)
5738                   strcpy (buf->release, qemu_uname_release);
5739             }
5740             unlock_user_struct(buf, arg1, 1);
5741         }
5742         break;
5743 #ifdef TARGET_I386
5744     case TARGET_NR_modify_ldt:
5745         ret = do_modify_ldt(cpu_env, arg1, arg2, arg3);
5746         break;
5747 #if !defined(TARGET_X86_64)
5748     case TARGET_NR_vm86old:
5749         goto unimplemented;
5750     case TARGET_NR_vm86:
5751         ret = do_vm86(cpu_env, arg1, arg2);
5752         break;
5753 #endif
5754 #endif
5755     case TARGET_NR_adjtimex:
5756         goto unimplemented;
5757 #ifdef TARGET_NR_create_module
5758     case TARGET_NR_create_module:
5759 #endif
5760     case TARGET_NR_init_module:
5761     case TARGET_NR_delete_module:
5762 #ifdef TARGET_NR_get_kernel_syms
5763     case TARGET_NR_get_kernel_syms:
5764 #endif
5765         goto unimplemented;
5766     case TARGET_NR_quotactl:
5767         goto unimplemented;
5768     case TARGET_NR_getpgid:
5769         ret = get_errno(getpgid(arg1));
5770         break;
5771     case TARGET_NR_fchdir:
5772         ret = get_errno(fchdir(arg1));
5773         break;
5774 #ifdef TARGET_NR_bdflush /* not on x86_64 */
5775     case TARGET_NR_bdflush:
5776         goto unimplemented;
5777 #endif
5778 #ifdef TARGET_NR_sysfs
5779     case TARGET_NR_sysfs:
5780         goto unimplemented;
5781 #endif
5782     case TARGET_NR_personality:
5783         ret = get_errno(personality(arg1));
5784         break;
5785 #ifdef TARGET_NR_afs_syscall
5786     case TARGET_NR_afs_syscall:
5787         goto unimplemented;
5788 #endif
5789 #ifdef TARGET_NR__llseek /* Not on alpha */
5790     case TARGET_NR__llseek:
5791         {
5792 #if defined (__x86_64__)
5793             ret = get_errno(lseek(arg1, ((uint64_t )arg2 << 32) | arg3, arg5));
5794             if (put_user_s64(ret, arg4))
5795                 goto efault;
5796 #else
5797             int64_t res;
5798             ret = get_errno(_llseek(arg1, arg2, arg3, &res, arg5));
5799             if (put_user_s64(res, arg4))
5800                 goto efault;
5801 #endif
5802         }
5803         break;
5804 #endif
5805     case TARGET_NR_getdents:
5806 #if TARGET_ABI_BITS == 32 && HOST_LONG_BITS == 64
5807         {
5808             struct target_dirent *target_dirp;
5809             struct linux_dirent *dirp;
5810             abi_long count = arg3;
5811 
5812 	    dirp = malloc(count);
5813 	    if (!dirp) {
5814                 ret = -TARGET_ENOMEM;
5815                 goto fail;
5816             }
5817 
5818             ret = get_errno(sys_getdents(arg1, dirp, count));
5819             if (!is_error(ret)) {
5820                 struct linux_dirent *de;
5821 		struct target_dirent *tde;
5822                 int len = ret;
5823                 int reclen, treclen;
5824 		int count1, tnamelen;
5825 
5826 		count1 = 0;
5827                 de = dirp;
5828                 if (!(target_dirp = lock_user(VERIFY_WRITE, arg2, count, 0)))
5829                     goto efault;
5830 		tde = target_dirp;
5831                 while (len > 0) {
5832                     reclen = de->d_reclen;
5833 		    treclen = reclen - (2 * (sizeof(long) - sizeof(abi_long)));
5834                     tde->d_reclen = tswap16(treclen);
5835                     tde->d_ino = tswapl(de->d_ino);
5836                     tde->d_off = tswapl(de->d_off);
5837 		    tnamelen = treclen - (2 * sizeof(abi_long) + 2);
5838 		    if (tnamelen > 256)
5839                         tnamelen = 256;
5840                     /* XXX: may not be correct */
5841                     pstrcpy(tde->d_name, tnamelen, de->d_name);
5842                     de = (struct linux_dirent *)((char *)de + reclen);
5843                     len -= reclen;
5844                     tde = (struct target_dirent *)((char *)tde + treclen);
5845 		    count1 += treclen;
5846                 }
5847 		ret = count1;
5848                 unlock_user(target_dirp, arg2, ret);
5849             }
5850 	    free(dirp);
5851         }
5852 #else
5853         {
5854             struct linux_dirent *dirp;
5855             abi_long count = arg3;
5856 
5857             if (!(dirp = lock_user(VERIFY_WRITE, arg2, count, 0)))
5858                 goto efault;
5859             ret = get_errno(sys_getdents(arg1, dirp, count));
5860             if (!is_error(ret)) {
5861                 struct linux_dirent *de;
5862                 int len = ret;
5863                 int reclen;
5864                 de = dirp;
5865                 while (len > 0) {
5866                     reclen = de->d_reclen;
5867                     if (reclen > len)
5868                         break;
5869                     de->d_reclen = tswap16(reclen);
5870                     tswapls(&de->d_ino);
5871                     tswapls(&de->d_off);
5872                     de = (struct linux_dirent *)((char *)de + reclen);
5873                     len -= reclen;
5874                 }
5875             }
5876             unlock_user(dirp, arg2, ret);
5877         }
5878 #endif
5879         break;
5880 #if defined(TARGET_NR_getdents64) && defined(__NR_getdents64)
5881     case TARGET_NR_getdents64:
5882         {
5883             struct linux_dirent64 *dirp;
5884             abi_long count = arg3;
5885             if (!(dirp = lock_user(VERIFY_WRITE, arg2, count, 0)))
5886                 goto efault;
5887             ret = get_errno(sys_getdents64(arg1, dirp, count));
5888             if (!is_error(ret)) {
5889                 struct linux_dirent64 *de;
5890                 int len = ret;
5891                 int reclen;
5892                 de = dirp;
5893                 while (len > 0) {
5894                     reclen = de->d_reclen;
5895                     if (reclen > len)
5896                         break;
5897                     de->d_reclen = tswap16(reclen);
5898                     tswap64s((uint64_t *)&de->d_ino);
5899                     tswap64s((uint64_t *)&de->d_off);
5900                     de = (struct linux_dirent64 *)((char *)de + reclen);
5901                     len -= reclen;
5902                 }
5903             }
5904             unlock_user(dirp, arg2, ret);
5905         }
5906         break;
5907 #endif /* TARGET_NR_getdents64 */
5908 #ifdef TARGET_NR__newselect
5909     case TARGET_NR__newselect:
5910         ret = do_select(arg1, arg2, arg3, arg4, arg5);
5911         break;
5912 #endif
5913 #ifdef TARGET_NR_poll
5914     case TARGET_NR_poll:
5915         {
5916             struct target_pollfd *target_pfd;
5917             unsigned int nfds = arg2;
5918             int timeout = arg3;
5919             struct pollfd *pfd;
5920             unsigned int i;
5921 
5922             target_pfd = lock_user(VERIFY_WRITE, arg1, sizeof(struct target_pollfd) * nfds, 1);
5923             if (!target_pfd)
5924                 goto efault;
5925             pfd = alloca(sizeof(struct pollfd) * nfds);
5926             for(i = 0; i < nfds; i++) {
5927                 pfd[i].fd = tswap32(target_pfd[i].fd);
5928                 pfd[i].events = tswap16(target_pfd[i].events);
5929             }
5930             ret = get_errno(poll(pfd, nfds, timeout));
5931             if (!is_error(ret)) {
5932                 for(i = 0; i < nfds; i++) {
5933                     target_pfd[i].revents = tswap16(pfd[i].revents);
5934                 }
5935                 ret += nfds * (sizeof(struct target_pollfd)
5936                                - sizeof(struct pollfd));
5937             }
5938             unlock_user(target_pfd, arg1, ret);
5939         }
5940         break;
5941 #endif
5942     case TARGET_NR_flock:
5943         /* NOTE: the flock constant seems to be the same for every
5944            Linux platform */
5945         ret = get_errno(flock(arg1, arg2));
5946         break;
5947     case TARGET_NR_readv:
5948         {
5949             int count = arg3;
5950             struct iovec *vec;
5951 
5952             vec = alloca(count * sizeof(struct iovec));
5953             if (lock_iovec(VERIFY_WRITE, vec, arg2, count, 0) < 0)
5954                 goto efault;
5955             ret = get_errno(readv(arg1, vec, count));
5956             unlock_iovec(vec, arg2, count, 1);
5957         }
5958         break;
5959     case TARGET_NR_writev:
5960         {
5961             int count = arg3;
5962             struct iovec *vec;
5963 
5964             vec = alloca(count * sizeof(struct iovec));
5965             if (lock_iovec(VERIFY_READ, vec, arg2, count, 1) < 0)
5966                 goto efault;
5967             ret = get_errno(writev(arg1, vec, count));
5968             unlock_iovec(vec, arg2, count, 0);
5969         }
5970         break;
5971     case TARGET_NR_getsid:
5972         ret = get_errno(getsid(arg1));
5973         break;
5974 #if defined(TARGET_NR_fdatasync) /* Not on alpha (osf_datasync ?) */
5975     case TARGET_NR_fdatasync:
5976         ret = get_errno(fdatasync(arg1));
5977         break;
5978 #endif
5979     case TARGET_NR__sysctl:
5980         /* We don't implement this, but ENOTDIR is always a safe
5981            return value. */
5982         ret = -TARGET_ENOTDIR;
5983         break;
5984     case TARGET_NR_sched_setparam:
5985         {
5986             struct sched_param *target_schp;
5987             struct sched_param schp;
5988 
5989             if (!lock_user_struct(VERIFY_READ, target_schp, arg2, 1))
5990                 goto efault;
5991             schp.sched_priority = tswap32(target_schp->sched_priority);
5992             unlock_user_struct(target_schp, arg2, 0);
5993             ret = get_errno(sched_setparam(arg1, &schp));
5994         }
5995         break;
5996     case TARGET_NR_sched_getparam:
5997         {
5998             struct sched_param *target_schp;
5999             struct sched_param schp;
6000             ret = get_errno(sched_getparam(arg1, &schp));
6001             if (!is_error(ret)) {
6002                 if (!lock_user_struct(VERIFY_WRITE, target_schp, arg2, 0))
6003                     goto efault;
6004                 target_schp->sched_priority = tswap32(schp.sched_priority);
6005                 unlock_user_struct(target_schp, arg2, 1);
6006             }
6007         }
6008         break;
6009     case TARGET_NR_sched_setscheduler:
6010         {
6011             struct sched_param *target_schp;
6012             struct sched_param schp;
6013             if (!lock_user_struct(VERIFY_READ, target_schp, arg3, 1))
6014                 goto efault;
6015             schp.sched_priority = tswap32(target_schp->sched_priority);
6016             unlock_user_struct(target_schp, arg3, 0);
6017             ret = get_errno(sched_setscheduler(arg1, arg2, &schp));
6018         }
6019         break;
6020     case TARGET_NR_sched_getscheduler:
6021         ret = get_errno(sched_getscheduler(arg1));
6022         break;
6023     case TARGET_NR_sched_yield:
6024         ret = get_errno(sched_yield());
6025         break;
6026     case TARGET_NR_sched_get_priority_max:
6027         ret = get_errno(sched_get_priority_max(arg1));
6028         break;
6029     case TARGET_NR_sched_get_priority_min:
6030         ret = get_errno(sched_get_priority_min(arg1));
6031         break;
6032     case TARGET_NR_sched_rr_get_interval:
6033         {
6034             struct timespec ts;
6035             ret = get_errno(sched_rr_get_interval(arg1, &ts));
6036             if (!is_error(ret)) {
6037                 host_to_target_timespec(arg2, &ts);
6038             }
6039         }
6040         break;
6041     case TARGET_NR_nanosleep:
6042         {
6043             struct timespec req, rem;
6044             target_to_host_timespec(&req, arg1);
6045             ret = get_errno(nanosleep(&req, &rem));
6046             if (is_error(ret) && arg2) {
6047                 host_to_target_timespec(arg2, &rem);
6048             }
6049         }
6050         break;
6051 #ifdef TARGET_NR_query_module
6052     case TARGET_NR_query_module:
6053         goto unimplemented;
6054 #endif
6055 #ifdef TARGET_NR_nfsservctl
6056     case TARGET_NR_nfsservctl:
6057         goto unimplemented;
6058 #endif
6059     case TARGET_NR_prctl:
6060         switch (arg1)
6061             {
6062             case PR_GET_PDEATHSIG:
6063                 {
6064                     int deathsig;
6065                     ret = get_errno(prctl(arg1, &deathsig, arg3, arg4, arg5));
6066                     if (!is_error(ret) && arg2
6067                         && put_user_ual(deathsig, arg2))
6068                         goto efault;
6069                 }
6070                 break;
6071             default:
6072                 ret = get_errno(prctl(arg1, arg2, arg3, arg4, arg5));
6073                 break;
6074             }
6075         break;
6076 #ifdef TARGET_NR_arch_prctl
6077     case TARGET_NR_arch_prctl:
6078 #if defined(TARGET_I386) && !defined(TARGET_ABI32)
6079         ret = do_arch_prctl(cpu_env, arg1, arg2);
6080         break;
6081 #else
6082         goto unimplemented;
6083 #endif
6084 #endif
6085 #ifdef TARGET_NR_pread
6086     case TARGET_NR_pread:
6087 #ifdef TARGET_ARM
6088         if (((CPUARMState *)cpu_env)->eabi)
6089             arg4 = arg5;
6090 #endif
6091         if (!(p = lock_user(VERIFY_WRITE, arg2, arg3, 0)))
6092             goto efault;
6093         ret = get_errno(pread(arg1, p, arg3, arg4));
6094         unlock_user(p, arg2, ret);
6095         break;
6096     case TARGET_NR_pwrite:
6097 #ifdef TARGET_ARM
6098         if (((CPUARMState *)cpu_env)->eabi)
6099             arg4 = arg5;
6100 #endif
6101         if (!(p = lock_user(VERIFY_READ, arg2, arg3, 1)))
6102             goto efault;
6103         ret = get_errno(pwrite(arg1, p, arg3, arg4));
6104         unlock_user(p, arg2, 0);
6105         break;
6106 #endif
6107 #ifdef TARGET_NR_pread64
6108     case TARGET_NR_pread64:
6109         if (!(p = lock_user(VERIFY_WRITE, arg2, arg3, 0)))
6110             goto efault;
6111         ret = get_errno(pread64(arg1, p, arg3, target_offset64(arg4, arg5)));
6112         unlock_user(p, arg2, ret);
6113         break;
6114     case TARGET_NR_pwrite64:
6115         if (!(p = lock_user(VERIFY_READ, arg2, arg3, 1)))
6116             goto efault;
6117         ret = get_errno(pwrite64(arg1, p, arg3, target_offset64(arg4, arg5)));
6118         unlock_user(p, arg2, 0);
6119         break;
6120 #endif
6121     case TARGET_NR_getcwd:
6122         if (!(p = lock_user(VERIFY_WRITE, arg1, arg2, 0)))
6123             goto efault;
6124         ret = get_errno(sys_getcwd1(p, arg2));
6125         unlock_user(p, arg1, ret);
6126         break;
6127     case TARGET_NR_capget:
6128         goto unimplemented;
6129     case TARGET_NR_capset:
6130         goto unimplemented;
6131     case TARGET_NR_sigaltstack:
6132 #if defined(TARGET_I386) || defined(TARGET_ARM) || defined(TARGET_MIPS) || \
6133     defined(TARGET_SPARC) || defined(TARGET_PPC) || defined(TARGET_ALPHA) || \
6134     defined(TARGET_M68K)
6135         ret = do_sigaltstack(arg1, arg2, get_sp_from_cpustate((CPUState *)cpu_env));
6136         break;
6137 #else
6138         goto unimplemented;
6139 #endif
6140     case TARGET_NR_sendfile:
6141         goto unimplemented;
6142 #ifdef TARGET_NR_getpmsg
6143     case TARGET_NR_getpmsg:
6144         goto unimplemented;
6145 #endif
6146 #ifdef TARGET_NR_putpmsg
6147     case TARGET_NR_putpmsg:
6148         goto unimplemented;
6149 #endif
6150 #ifdef TARGET_NR_vfork
6151     case TARGET_NR_vfork:
6152         ret = get_errno(do_fork(cpu_env, CLONE_VFORK | CLONE_VM | SIGCHLD,
6153                         0, 0, 0, 0));
6154         break;
6155 #endif
6156 #ifdef TARGET_NR_ugetrlimit
6157     case TARGET_NR_ugetrlimit:
6158     {
6159 	struct rlimit rlim;
6160 	ret = get_errno(getrlimit(arg1, &rlim));
6161 	if (!is_error(ret)) {
6162 	    struct target_rlimit *target_rlim;
6163             if (!lock_user_struct(VERIFY_WRITE, target_rlim, arg2, 0))
6164                 goto efault;
6165 	    target_rlim->rlim_cur = tswapl(rlim.rlim_cur);
6166 	    target_rlim->rlim_max = tswapl(rlim.rlim_max);
6167             unlock_user_struct(target_rlim, arg2, 1);
6168 	}
6169 	break;
6170     }
6171 #endif
6172 #ifdef TARGET_NR_truncate64
6173     case TARGET_NR_truncate64:
6174         if (!(p = lock_user_string(arg1)))
6175             goto efault;
6176 	ret = target_truncate64(cpu_env, p, arg2, arg3, arg4);
6177         unlock_user(p, arg1, 0);
6178 	break;
6179 #endif
6180 #ifdef TARGET_NR_ftruncate64
6181     case TARGET_NR_ftruncate64:
6182 	ret = target_ftruncate64(cpu_env, arg1, arg2, arg3, arg4);
6183 	break;
6184 #endif
6185 #ifdef TARGET_NR_stat64
6186     case TARGET_NR_stat64:
6187         if (!(p = lock_user_string(arg1)))
6188             goto efault;
6189         ret = get_errno(stat(path(p), &st));
6190         unlock_user(p, arg1, 0);
6191         if (!is_error(ret))
6192             ret = host_to_target_stat64(cpu_env, arg2, &st);
6193         break;
6194 #endif
6195 #ifdef TARGET_NR_lstat64
6196     case TARGET_NR_lstat64:
6197         if (!(p = lock_user_string(arg1)))
6198             goto efault;
6199         ret = get_errno(lstat(path(p), &st));
6200         unlock_user(p, arg1, 0);
6201         if (!is_error(ret))
6202             ret = host_to_target_stat64(cpu_env, arg2, &st);
6203         break;
6204 #endif
6205 #ifdef TARGET_NR_fstat64
6206     case TARGET_NR_fstat64:
6207         ret = get_errno(fstat(arg1, &st));
6208         if (!is_error(ret))
6209             ret = host_to_target_stat64(cpu_env, arg2, &st);
6210         break;
6211 #endif
6212 #if (defined(TARGET_NR_fstatat64) || defined(TARGET_NR_newfstatat)) && \
6213         (defined(__NR_fstatat64) || defined(__NR_newfstatat))
6214 #ifdef TARGET_NR_fstatat64
6215     case TARGET_NR_fstatat64:
6216 #endif
6217 #ifdef TARGET_NR_newfstatat
6218     case TARGET_NR_newfstatat:
6219 #endif
6220         if (!(p = lock_user_string(arg2)))
6221             goto efault;
6222 #ifdef __NR_fstatat64
6223         ret = get_errno(sys_fstatat64(arg1, path(p), &st, arg4));
6224 #else
6225         ret = get_errno(sys_newfstatat(arg1, path(p), &st, arg4));
6226 #endif
6227         if (!is_error(ret))
6228             ret = host_to_target_stat64(cpu_env, arg3, &st);
6229         break;
6230 #endif
6231 #ifdef USE_UID16
6232     case TARGET_NR_lchown:
6233         if (!(p = lock_user_string(arg1)))
6234             goto efault;
6235         ret = get_errno(lchown(p, low2highuid(arg2), low2highgid(arg3)));
6236         unlock_user(p, arg1, 0);
6237         break;
6238     case TARGET_NR_getuid:
6239         ret = get_errno(high2lowuid(getuid()));
6240         break;
6241     case TARGET_NR_getgid:
6242         ret = get_errno(high2lowgid(getgid()));
6243         break;
6244     case TARGET_NR_geteuid:
6245         ret = get_errno(high2lowuid(geteuid()));
6246         break;
6247     case TARGET_NR_getegid:
6248         ret = get_errno(high2lowgid(getegid()));
6249         break;
6250     case TARGET_NR_setreuid:
6251         ret = get_errno(setreuid(low2highuid(arg1), low2highuid(arg2)));
6252         break;
6253     case TARGET_NR_setregid:
6254         ret = get_errno(setregid(low2highgid(arg1), low2highgid(arg2)));
6255         break;
6256     case TARGET_NR_getgroups:
6257         {
6258             int gidsetsize = arg1;
6259             uint16_t *target_grouplist;
6260             gid_t *grouplist;
6261             int i;
6262 
6263             grouplist = alloca(gidsetsize * sizeof(gid_t));
6264             ret = get_errno(getgroups(gidsetsize, grouplist));
6265             if (gidsetsize == 0)
6266                 break;
6267             if (!is_error(ret)) {
6268                 target_grouplist = lock_user(VERIFY_WRITE, arg2, gidsetsize * 2, 0);
6269                 if (!target_grouplist)
6270                     goto efault;
6271                 for(i = 0;i < ret; i++)
6272                     target_grouplist[i] = tswap16(grouplist[i]);
6273                 unlock_user(target_grouplist, arg2, gidsetsize * 2);
6274             }
6275         }
6276         break;
6277     case TARGET_NR_setgroups:
6278         {
6279             int gidsetsize = arg1;
6280             uint16_t *target_grouplist;
6281             gid_t *grouplist;
6282             int i;
6283 
6284             grouplist = alloca(gidsetsize * sizeof(gid_t));
6285             target_grouplist = lock_user(VERIFY_READ, arg2, gidsetsize * 2, 1);
6286             if (!target_grouplist) {
6287                 ret = -TARGET_EFAULT;
6288                 goto fail;
6289             }
6290             for(i = 0;i < gidsetsize; i++)
6291                 grouplist[i] = tswap16(target_grouplist[i]);
6292             unlock_user(target_grouplist, arg2, 0);
6293             ret = get_errno(setgroups(gidsetsize, grouplist));
6294         }
6295         break;
6296     case TARGET_NR_fchown:
6297         ret = get_errno(fchown(arg1, low2highuid(arg2), low2highgid(arg3)));
6298         break;
6299 #if defined(TARGET_NR_fchownat) && defined(__NR_fchownat)
6300     case TARGET_NR_fchownat:
6301         if (!(p = lock_user_string(arg2)))
6302             goto efault;
6303         ret = get_errno(sys_fchownat(arg1, p, low2highuid(arg3), low2highgid(arg4), arg5));
6304         unlock_user(p, arg2, 0);
6305         break;
6306 #endif
6307 #ifdef TARGET_NR_setresuid
6308     case TARGET_NR_setresuid:
6309         ret = get_errno(setresuid(low2highuid(arg1),
6310                                   low2highuid(arg2),
6311                                   low2highuid(arg3)));
6312         break;
6313 #endif
6314 #ifdef TARGET_NR_getresuid
6315     case TARGET_NR_getresuid:
6316         {
6317             uid_t ruid, euid, suid;
6318             ret = get_errno(getresuid(&ruid, &euid, &suid));
6319             if (!is_error(ret)) {
6320                 if (put_user_u16(high2lowuid(ruid), arg1)
6321                     || put_user_u16(high2lowuid(euid), arg2)
6322                     || put_user_u16(high2lowuid(suid), arg3))
6323                     goto efault;
6324             }
6325         }
6326         break;
6327 #endif
6328 #ifdef TARGET_NR_getresgid
6329     case TARGET_NR_setresgid:
6330         ret = get_errno(setresgid(low2highgid(arg1),
6331                                   low2highgid(arg2),
6332                                   low2highgid(arg3)));
6333         break;
6334 #endif
6335 #ifdef TARGET_NR_getresgid
6336     case TARGET_NR_getresgid:
6337         {
6338             gid_t rgid, egid, sgid;
6339             ret = get_errno(getresgid(&rgid, &egid, &sgid));
6340             if (!is_error(ret)) {
6341                 if (put_user_u16(high2lowgid(rgid), arg1)
6342                     || put_user_u16(high2lowgid(egid), arg2)
6343                     || put_user_u16(high2lowgid(sgid), arg3))
6344                     goto efault;
6345             }
6346         }
6347         break;
6348 #endif
6349     case TARGET_NR_chown:
6350         if (!(p = lock_user_string(arg1)))
6351             goto efault;
6352         ret = get_errno(chown(p, low2highuid(arg2), low2highgid(arg3)));
6353         unlock_user(p, arg1, 0);
6354         break;
6355     case TARGET_NR_setuid:
6356         ret = get_errno(setuid(low2highuid(arg1)));
6357         break;
6358     case TARGET_NR_setgid:
6359         ret = get_errno(setgid(low2highgid(arg1)));
6360         break;
6361     case TARGET_NR_setfsuid:
6362         ret = get_errno(setfsuid(arg1));
6363         break;
6364     case TARGET_NR_setfsgid:
6365         ret = get_errno(setfsgid(arg1));
6366         break;
6367 #endif /* USE_UID16 */
6368 
6369 #ifdef TARGET_NR_lchown32
6370     case TARGET_NR_lchown32:
6371         if (!(p = lock_user_string(arg1)))
6372             goto efault;
6373         ret = get_errno(lchown(p, arg2, arg3));
6374         unlock_user(p, arg1, 0);
6375         break;
6376 #endif
6377 #ifdef TARGET_NR_getuid32
6378     case TARGET_NR_getuid32:
6379         ret = get_errno(getuid());
6380         break;
6381 #endif
6382 
6383 #if defined(TARGET_NR_getxuid) && defined(TARGET_ALPHA)
6384    /* Alpha specific */
6385     case TARGET_NR_getxuid:
6386 	 {
6387 	    uid_t euid;
6388 	    euid=geteuid();
6389 	    ((CPUAlphaState *)cpu_env)->ir[IR_A4]=euid;
6390 	 }
6391         ret = get_errno(getuid());
6392         break;
6393 #endif
6394 #if defined(TARGET_NR_getxgid) && defined(TARGET_ALPHA)
6395    /* Alpha specific */
6396     case TARGET_NR_getxgid:
6397 	 {
6398 	    uid_t egid;
6399 	    egid=getegid();
6400 	    ((CPUAlphaState *)cpu_env)->ir[IR_A4]=egid;
6401 	 }
6402         ret = get_errno(getgid());
6403         break;
6404 #endif
6405 
6406 #ifdef TARGET_NR_getgid32
6407     case TARGET_NR_getgid32:
6408         ret = get_errno(getgid());
6409         break;
6410 #endif
6411 #ifdef TARGET_NR_geteuid32
6412     case TARGET_NR_geteuid32:
6413         ret = get_errno(geteuid());
6414         break;
6415 #endif
6416 #ifdef TARGET_NR_getegid32
6417     case TARGET_NR_getegid32:
6418         ret = get_errno(getegid());
6419         break;
6420 #endif
6421 #ifdef TARGET_NR_setreuid32
6422     case TARGET_NR_setreuid32:
6423         ret = get_errno(setreuid(arg1, arg2));
6424         break;
6425 #endif
6426 #ifdef TARGET_NR_setregid32
6427     case TARGET_NR_setregid32:
6428         ret = get_errno(setregid(arg1, arg2));
6429         break;
6430 #endif
6431 #ifdef TARGET_NR_getgroups32
6432     case TARGET_NR_getgroups32:
6433         {
6434             int gidsetsize = arg1;
6435             uint32_t *target_grouplist;
6436             gid_t *grouplist;
6437             int i;
6438 
6439             grouplist = alloca(gidsetsize * sizeof(gid_t));
6440             ret = get_errno(getgroups(gidsetsize, grouplist));
6441             if (gidsetsize == 0)
6442                 break;
6443             if (!is_error(ret)) {
6444                 target_grouplist = lock_user(VERIFY_WRITE, arg2, gidsetsize * 4, 0);
6445                 if (!target_grouplist) {
6446                     ret = -TARGET_EFAULT;
6447                     goto fail;
6448                 }
6449                 for(i = 0;i < ret; i++)
6450                     target_grouplist[i] = tswap32(grouplist[i]);
6451                 unlock_user(target_grouplist, arg2, gidsetsize * 4);
6452             }
6453         }
6454         break;
6455 #endif
6456 #ifdef TARGET_NR_setgroups32
6457     case TARGET_NR_setgroups32:
6458         {
6459             int gidsetsize = arg1;
6460             uint32_t *target_grouplist;
6461             gid_t *grouplist;
6462             int i;
6463 
6464             grouplist = alloca(gidsetsize * sizeof(gid_t));
6465             target_grouplist = lock_user(VERIFY_READ, arg2, gidsetsize * 4, 1);
6466             if (!target_grouplist) {
6467                 ret = -TARGET_EFAULT;
6468                 goto fail;
6469             }
6470             for(i = 0;i < gidsetsize; i++)
6471                 grouplist[i] = tswap32(target_grouplist[i]);
6472             unlock_user(target_grouplist, arg2, 0);
6473             ret = get_errno(setgroups(gidsetsize, grouplist));
6474         }
6475         break;
6476 #endif
6477 #ifdef TARGET_NR_fchown32
6478     case TARGET_NR_fchown32:
6479         ret = get_errno(fchown(arg1, arg2, arg3));
6480         break;
6481 #endif
6482 #ifdef TARGET_NR_setresuid32
6483     case TARGET_NR_setresuid32:
6484         ret = get_errno(setresuid(arg1, arg2, arg3));
6485         break;
6486 #endif
6487 #ifdef TARGET_NR_getresuid32
6488     case TARGET_NR_getresuid32:
6489         {
6490             uid_t ruid, euid, suid;
6491             ret = get_errno(getresuid(&ruid, &euid, &suid));
6492             if (!is_error(ret)) {
6493                 if (put_user_u32(ruid, arg1)
6494                     || put_user_u32(euid, arg2)
6495                     || put_user_u32(suid, arg3))
6496                     goto efault;
6497             }
6498         }
6499         break;
6500 #endif
6501 #ifdef TARGET_NR_setresgid32
6502     case TARGET_NR_setresgid32:
6503         ret = get_errno(setresgid(arg1, arg2, arg3));
6504         break;
6505 #endif
6506 #ifdef TARGET_NR_getresgid32
6507     case TARGET_NR_getresgid32:
6508         {
6509             gid_t rgid, egid, sgid;
6510             ret = get_errno(getresgid(&rgid, &egid, &sgid));
6511             if (!is_error(ret)) {
6512                 if (put_user_u32(rgid, arg1)
6513                     || put_user_u32(egid, arg2)
6514                     || put_user_u32(sgid, arg3))
6515                     goto efault;
6516             }
6517         }
6518         break;
6519 #endif
6520 #ifdef TARGET_NR_chown32
6521     case TARGET_NR_chown32:
6522         if (!(p = lock_user_string(arg1)))
6523             goto efault;
6524         ret = get_errno(chown(p, arg2, arg3));
6525         unlock_user(p, arg1, 0);
6526         break;
6527 #endif
6528 #ifdef TARGET_NR_setuid32
6529     case TARGET_NR_setuid32:
6530         ret = get_errno(setuid(arg1));
6531         break;
6532 #endif
6533 #ifdef TARGET_NR_setgid32
6534     case TARGET_NR_setgid32:
6535         ret = get_errno(setgid(arg1));
6536         break;
6537 #endif
6538 #ifdef TARGET_NR_setfsuid32
6539     case TARGET_NR_setfsuid32:
6540         ret = get_errno(setfsuid(arg1));
6541         break;
6542 #endif
6543 #ifdef TARGET_NR_setfsgid32
6544     case TARGET_NR_setfsgid32:
6545         ret = get_errno(setfsgid(arg1));
6546         break;
6547 #endif
6548 
6549     case TARGET_NR_pivot_root:
6550         goto unimplemented;
6551 #ifdef TARGET_NR_mincore
6552     case TARGET_NR_mincore:
6553         {
6554             void *a;
6555             ret = -TARGET_EFAULT;
6556             if (!(a = lock_user(VERIFY_READ, arg1,arg2, 0)))
6557                 goto efault;
6558             if (!(p = lock_user_string(arg3)))
6559                 goto mincore_fail;
6560             ret = get_errno(mincore(a, arg2, p));
6561             unlock_user(p, arg3, ret);
6562             mincore_fail:
6563             unlock_user(a, arg1, 0);
6564         }
6565         break;
6566 #endif
6567 #ifdef TARGET_NR_arm_fadvise64_64
6568     case TARGET_NR_arm_fadvise64_64:
6569 	{
6570 		/*
6571 		 * arm_fadvise64_64 looks like fadvise64_64 but
6572 		 * with different argument order
6573 		 */
6574 		abi_long temp;
6575 		temp = arg3;
6576 		arg3 = arg4;
6577 		arg4 = temp;
6578 	}
6579 #endif
6580 #if defined(TARGET_NR_fadvise64_64) || defined(TARGET_NR_arm_fadvise64_64) || defined(TARGET_NR_fadvise64)
6581 #ifdef TARGET_NR_fadvise64_64
6582     case TARGET_NR_fadvise64_64:
6583 #endif
6584 #ifdef TARGET_NR_fadvise64
6585     case TARGET_NR_fadvise64:
6586 #endif
6587 #ifdef TARGET_S390X
6588         switch (arg4) {
6589         case 4: arg4 = POSIX_FADV_NOREUSE + 1; break; /* make sure it's an invalid value */
6590         case 5: arg4 = POSIX_FADV_NOREUSE + 2; break; /* ditto */
6591         case 6: arg4 = POSIX_FADV_DONTNEED; break;
6592         case 7: arg4 = POSIX_FADV_NOREUSE; break;
6593         default: break;
6594         }
6595 #endif
6596         ret = -posix_fadvise(arg1, arg2, arg3, arg4);
6597 	break;
6598 #endif
6599 #ifdef TARGET_NR_madvise
6600     case TARGET_NR_madvise:
6601         /* A straight passthrough may not be safe because qemu sometimes
6602            turns private flie-backed mappings into anonymous mappings.
6603            This will break MADV_DONTNEED.
6604            This is a hint, so ignoring and returning success is ok.  */
6605         ret = get_errno(0);
6606         break;
6607 #endif
6608 #if TARGET_ABI_BITS == 32
6609     case TARGET_NR_fcntl64:
6610     {
6611 	int cmd;
6612 	struct flock64 fl;
6613 	struct target_flock64 *target_fl;
6614 #ifdef TARGET_ARM
6615 	struct target_eabi_flock64 *target_efl;
6616 #endif
6617 
6618 	cmd = target_to_host_fcntl_cmd(arg2);
6619 	if (cmd == -TARGET_EINVAL)
6620 		return cmd;
6621 
6622         switch(arg2) {
6623         case TARGET_F_GETLK64:
6624 #ifdef TARGET_ARM
6625             if (((CPUARMState *)cpu_env)->eabi) {
6626                 if (!lock_user_struct(VERIFY_READ, target_efl, arg3, 1))
6627                     goto efault;
6628                 fl.l_type = tswap16(target_efl->l_type);
6629                 fl.l_whence = tswap16(target_efl->l_whence);
6630                 fl.l_start = tswap64(target_efl->l_start);
6631                 fl.l_len = tswap64(target_efl->l_len);
6632                 fl.l_pid = tswap32(target_efl->l_pid);
6633                 unlock_user_struct(target_efl, arg3, 0);
6634             } else
6635 #endif
6636             {
6637                 if (!lock_user_struct(VERIFY_READ, target_fl, arg3, 1))
6638                     goto efault;
6639                 fl.l_type = tswap16(target_fl->l_type);
6640                 fl.l_whence = tswap16(target_fl->l_whence);
6641                 fl.l_start = tswap64(target_fl->l_start);
6642                 fl.l_len = tswap64(target_fl->l_len);
6643                 fl.l_pid = tswap32(target_fl->l_pid);
6644                 unlock_user_struct(target_fl, arg3, 0);
6645             }
6646             ret = get_errno(fcntl(arg1, cmd, &fl));
6647 	    if (ret == 0) {
6648 #ifdef TARGET_ARM
6649                 if (((CPUARMState *)cpu_env)->eabi) {
6650                     if (!lock_user_struct(VERIFY_WRITE, target_efl, arg3, 0))
6651                         goto efault;
6652                     target_efl->l_type = tswap16(fl.l_type);
6653                     target_efl->l_whence = tswap16(fl.l_whence);
6654                     target_efl->l_start = tswap64(fl.l_start);
6655                     target_efl->l_len = tswap64(fl.l_len);
6656                     target_efl->l_pid = tswap32(fl.l_pid);
6657                     unlock_user_struct(target_efl, arg3, 1);
6658                 } else
6659 #endif
6660                 {
6661                     if (!lock_user_struct(VERIFY_WRITE, target_fl, arg3, 0))
6662                         goto efault;
6663                     target_fl->l_type = tswap16(fl.l_type);
6664                     target_fl->l_whence = tswap16(fl.l_whence);
6665                     target_fl->l_start = tswap64(fl.l_start);
6666                     target_fl->l_len = tswap64(fl.l_len);
6667                     target_fl->l_pid = tswap32(fl.l_pid);
6668                     unlock_user_struct(target_fl, arg3, 1);
6669                 }
6670 	    }
6671 	    break;
6672 
6673         case TARGET_F_SETLK64:
6674         case TARGET_F_SETLKW64:
6675 #ifdef TARGET_ARM
6676             if (((CPUARMState *)cpu_env)->eabi) {
6677                 if (!lock_user_struct(VERIFY_READ, target_efl, arg3, 1))
6678                     goto efault;
6679                 fl.l_type = tswap16(target_efl->l_type);
6680                 fl.l_whence = tswap16(target_efl->l_whence);
6681                 fl.l_start = tswap64(target_efl->l_start);
6682                 fl.l_len = tswap64(target_efl->l_len);
6683                 fl.l_pid = tswap32(target_efl->l_pid);
6684                 unlock_user_struct(target_efl, arg3, 0);
6685             } else
6686 #endif
6687             {
6688                 if (!lock_user_struct(VERIFY_READ, target_fl, arg3, 1))
6689                     goto efault;
6690                 fl.l_type = tswap16(target_fl->l_type);
6691                 fl.l_whence = tswap16(target_fl->l_whence);
6692                 fl.l_start = tswap64(target_fl->l_start);
6693                 fl.l_len = tswap64(target_fl->l_len);
6694                 fl.l_pid = tswap32(target_fl->l_pid);
6695                 unlock_user_struct(target_fl, arg3, 0);
6696             }
6697             ret = get_errno(fcntl(arg1, cmd, &fl));
6698 	    break;
6699         default:
6700             ret = do_fcntl(arg1, arg2, arg3);
6701             break;
6702         }
6703 	break;
6704     }
6705 #endif
6706 #ifdef TARGET_NR_cacheflush
6707     case TARGET_NR_cacheflush:
6708         /* self-modifying code is handled automatically, so nothing needed */
6709         ret = 0;
6710         break;
6711 #endif
6712 #ifdef TARGET_NR_security
6713     case TARGET_NR_security:
6714         goto unimplemented;
6715 #endif
6716 #ifdef TARGET_NR_getpagesize
6717     case TARGET_NR_getpagesize:
6718         ret = TARGET_PAGE_SIZE;
6719         break;
6720 #endif
6721     case TARGET_NR_gettid:
6722         ret = get_errno(gettid());
6723         break;
6724 #ifdef TARGET_NR_readahead
6725     case TARGET_NR_readahead:
6726 #if TARGET_ABI_BITS == 32
6727 #ifdef TARGET_ARM
6728         if (((CPUARMState *)cpu_env)->eabi)
6729         {
6730             arg2 = arg3;
6731             arg3 = arg4;
6732             arg4 = arg5;
6733         }
6734 #endif
6735         ret = get_errno(readahead(arg1, ((off64_t)arg3 << 32) | arg2, arg4));
6736 #else
6737         ret = get_errno(readahead(arg1, arg2, arg3));
6738 #endif
6739         break;
6740 #endif
6741 #ifdef TARGET_NR_setxattr
6742     case TARGET_NR_setxattr:
6743     case TARGET_NR_lsetxattr:
6744     case TARGET_NR_fsetxattr:
6745     case TARGET_NR_getxattr:
6746     case TARGET_NR_lgetxattr:
6747     case TARGET_NR_fgetxattr:
6748     case TARGET_NR_listxattr:
6749     case TARGET_NR_llistxattr:
6750     case TARGET_NR_flistxattr:
6751     case TARGET_NR_removexattr:
6752     case TARGET_NR_lremovexattr:
6753     case TARGET_NR_fremovexattr:
6754         ret = -TARGET_EOPNOTSUPP;
6755         break;
6756 #endif
6757 #ifdef TARGET_NR_set_thread_area
6758     case TARGET_NR_set_thread_area:
6759 #if defined(TARGET_MIPS)
6760       ((CPUMIPSState *) cpu_env)->tls_value = arg1;
6761       ret = 0;
6762       break;
6763 #elif defined(TARGET_CRIS)
6764       if (arg1 & 0xff)
6765           ret = -TARGET_EINVAL;
6766       else {
6767           ((CPUCRISState *) cpu_env)->pregs[PR_PID] = arg1;
6768           ret = 0;
6769       }
6770       break;
6771 #elif defined(TARGET_I386) && defined(TARGET_ABI32)
6772       ret = do_set_thread_area(cpu_env, arg1);
6773       break;
6774 #else
6775       goto unimplemented_nowarn;
6776 #endif
6777 #endif
6778 #ifdef TARGET_NR_get_thread_area
6779     case TARGET_NR_get_thread_area:
6780 #if defined(TARGET_I386) && defined(TARGET_ABI32)
6781         ret = do_get_thread_area(cpu_env, arg1);
6782 #else
6783         goto unimplemented_nowarn;
6784 #endif
6785 #endif
6786 #ifdef TARGET_NR_getdomainname
6787     case TARGET_NR_getdomainname:
6788         goto unimplemented_nowarn;
6789 #endif
6790 
6791 #ifdef TARGET_NR_clock_gettime
6792     case TARGET_NR_clock_gettime:
6793     {
6794         struct timespec ts;
6795         ret = get_errno(clock_gettime(arg1, &ts));
6796         if (!is_error(ret)) {
6797             host_to_target_timespec(arg2, &ts);
6798         }
6799         break;
6800     }
6801 #endif
6802 #ifdef TARGET_NR_clock_getres
6803     case TARGET_NR_clock_getres:
6804     {
6805         struct timespec ts;
6806         ret = get_errno(clock_getres(arg1, &ts));
6807         if (!is_error(ret)) {
6808             host_to_target_timespec(arg2, &ts);
6809         }
6810         break;
6811     }
6812 #endif
6813 #ifdef TARGET_NR_clock_nanosleep
6814     case TARGET_NR_clock_nanosleep:
6815     {
6816         struct timespec ts;
6817         target_to_host_timespec(&ts, arg3);
6818         ret = get_errno(clock_nanosleep(arg1, arg2, &ts, arg4 ? &ts : NULL));
6819         if (arg4)
6820             host_to_target_timespec(arg4, &ts);
6821         break;
6822     }
6823 #endif
6824 
6825 #if defined(TARGET_NR_set_tid_address) && defined(__NR_set_tid_address)
6826     case TARGET_NR_set_tid_address:
6827         ret = get_errno(set_tid_address((int *)g2h(arg1)));
6828         break;
6829 #endif
6830 
6831 #if defined(TARGET_NR_tkill) && defined(__NR_tkill)
6832     case TARGET_NR_tkill:
6833         ret = get_errno(sys_tkill((int)arg1, target_to_host_signal(arg2)));
6834         break;
6835 #endif
6836 
6837 #if defined(TARGET_NR_tgkill) && defined(__NR_tgkill)
6838     case TARGET_NR_tgkill:
6839 	ret = get_errno(sys_tgkill((int)arg1, (int)arg2,
6840                         target_to_host_signal(arg3)));
6841 	break;
6842 #endif
6843 
6844 #ifdef TARGET_NR_set_robust_list
6845     case TARGET_NR_set_robust_list:
6846 	goto unimplemented_nowarn;
6847 #endif
6848 
6849 #if defined(TARGET_NR_utimensat) && defined(__NR_utimensat)
6850     case TARGET_NR_utimensat:
6851         {
6852             struct timespec *tsp, ts[2];
6853             if (!arg3) {
6854                 tsp = NULL;
6855             } else {
6856                 target_to_host_timespec(ts, arg3);
6857                 target_to_host_timespec(ts+1, arg3+sizeof(struct target_timespec));
6858                 tsp = ts;
6859             }
6860             if (!arg2)
6861                 ret = get_errno(sys_utimensat(arg1, NULL, tsp, arg4));
6862             else {
6863                 if (!(p = lock_user_string(arg2))) {
6864                     ret = -TARGET_EFAULT;
6865                     goto fail;
6866                 }
6867                 ret = get_errno(sys_utimensat(arg1, path(p), tsp, arg4));
6868                 unlock_user(p, arg2, 0);
6869             }
6870         }
6871 	break;
6872 #endif
6873 #if defined(CONFIG_USE_NPTL)
6874     case TARGET_NR_futex:
6875         ret = do_futex(arg1, arg2, arg3, arg4, arg5, arg6);
6876         break;
6877 #endif
6878 #if defined(TARGET_NR_inotify_init) && defined(__NR_inotify_init)
6879     case TARGET_NR_inotify_init:
6880         ret = get_errno(sys_inotify_init());
6881         break;
6882 #endif
6883 #if defined(TARGET_NR_inotify_add_watch) && defined(__NR_inotify_add_watch)
6884     case TARGET_NR_inotify_add_watch:
6885         p = lock_user_string(arg2);
6886         ret = get_errno(sys_inotify_add_watch(arg1, path(p), arg3));
6887         unlock_user(p, arg2, 0);
6888         break;
6889 #endif
6890 #if defined(TARGET_NR_inotify_rm_watch) && defined(__NR_inotify_rm_watch)
6891     case TARGET_NR_inotify_rm_watch:
6892         ret = get_errno(sys_inotify_rm_watch(arg1, arg2));
6893         break;
6894 #endif
6895 
6896 #if defined(TARGET_NR_mq_open) && defined(__NR_mq_open)
6897     case TARGET_NR_mq_open:
6898         {
6899             struct mq_attr posix_mq_attr;
6900 
6901             p = lock_user_string(arg1 - 1);
6902             if (arg4 != 0)
6903                 copy_from_user_mq_attr (&posix_mq_attr, arg4);
6904             ret = get_errno(mq_open(p, arg2, arg3, &posix_mq_attr));
6905             unlock_user (p, arg1, 0);
6906         }
6907         break;
6908 
6909     case TARGET_NR_mq_unlink:
6910         p = lock_user_string(arg1 - 1);
6911         ret = get_errno(mq_unlink(p));
6912         unlock_user (p, arg1, 0);
6913         break;
6914 
6915     case TARGET_NR_mq_timedsend:
6916         {
6917             struct timespec ts;
6918 
6919             p = lock_user (VERIFY_READ, arg2, arg3, 1);
6920             if (arg5 != 0) {
6921                 target_to_host_timespec(&ts, arg5);
6922                 ret = get_errno(mq_timedsend(arg1, p, arg3, arg4, &ts));
6923                 host_to_target_timespec(arg5, &ts);
6924             }
6925             else
6926                 ret = get_errno(mq_send(arg1, p, arg3, arg4));
6927             unlock_user (p, arg2, arg3);
6928         }
6929         break;
6930 
6931     case TARGET_NR_mq_timedreceive:
6932         {
6933             struct timespec ts;
6934             unsigned int prio;
6935 
6936             p = lock_user (VERIFY_READ, arg2, arg3, 1);
6937             if (arg5 != 0) {
6938                 target_to_host_timespec(&ts, arg5);
6939                 ret = get_errno(mq_timedreceive(arg1, p, arg3, &prio, &ts));
6940                 host_to_target_timespec(arg5, &ts);
6941             }
6942             else
6943                 ret = get_errno(mq_receive(arg1, p, arg3, &prio));
6944             unlock_user (p, arg2, arg3);
6945             if (arg4 != 0)
6946                 put_user_u32(prio, arg4);
6947         }
6948         break;
6949 
6950     /* Not implemented for now... */
6951 /*     case TARGET_NR_mq_notify: */
6952 /*         break; */
6953 
6954     case TARGET_NR_mq_getsetattr:
6955         {
6956             struct mq_attr posix_mq_attr_in, posix_mq_attr_out;
6957             ret = 0;
6958             if (arg3 != 0) {
6959                 ret = mq_getattr(arg1, &posix_mq_attr_out);
6960                 copy_to_user_mq_attr(arg3, &posix_mq_attr_out);
6961             }
6962             if (arg2 != 0) {
6963                 copy_from_user_mq_attr(&posix_mq_attr_in, arg2);
6964                 ret |= mq_setattr(arg1, &posix_mq_attr_in, &posix_mq_attr_out);
6965             }
6966 
6967         }
6968         break;
6969 #endif
6970 
6971 #ifdef CONFIG_SPLICE
6972 #ifdef TARGET_NR_tee
6973     case TARGET_NR_tee:
6974         {
6975             ret = get_errno(tee(arg1,arg2,arg3,arg4));
6976         }
6977         break;
6978 #endif
6979 #ifdef TARGET_NR_splice
6980     case TARGET_NR_splice:
6981         {
6982             loff_t loff_in, loff_out;
6983             loff_t *ploff_in = NULL, *ploff_out = NULL;
6984             if(arg2) {
6985                 get_user_u64(loff_in, arg2);
6986                 ploff_in = &loff_in;
6987             }
6988             if(arg4) {
6989                 get_user_u64(loff_out, arg2);
6990                 ploff_out = &loff_out;
6991             }
6992             ret = get_errno(splice(arg1, ploff_in, arg3, ploff_out, arg5, arg6));
6993         }
6994         break;
6995 #endif
6996 #ifdef TARGET_NR_vmsplice
6997 	case TARGET_NR_vmsplice:
6998         {
6999             int count = arg3;
7000             struct iovec *vec;
7001 
7002             vec = alloca(count * sizeof(struct iovec));
7003             if (lock_iovec(VERIFY_READ, vec, arg2, count, 1) < 0)
7004                 goto efault;
7005             ret = get_errno(vmsplice(arg1, vec, count, arg4));
7006             unlock_iovec(vec, arg2, count, 0);
7007         }
7008         break;
7009 #endif
7010 #endif /* CONFIG_SPLICE */
7011 #ifdef CONFIG_EVENTFD
7012 #if defined(TARGET_NR_eventfd)
7013     case TARGET_NR_eventfd:
7014         ret = get_errno(eventfd(arg1, 0));
7015         break;
7016 #endif
7017 #if defined(TARGET_NR_eventfd2)
7018     case TARGET_NR_eventfd2:
7019         ret = get_errno(eventfd(arg1, arg2));
7020         break;
7021 #endif
7022 #endif /* CONFIG_EVENTFD  */
7023 #if defined(CONFIG_FALLOCATE) && defined(TARGET_NR_fallocate)
7024     case TARGET_NR_fallocate:
7025         ret = get_errno(fallocate(arg1, arg2, arg3, arg4));
7026         break;
7027 #endif
7028     default:
7029     unimplemented:
7030         gemu_log("qemu: Unsupported syscall: %d\n", num);
7031 #if defined(TARGET_NR_setxattr) || defined(TARGET_NR_get_thread_area) || defined(TARGET_NR_getdomainname) || defined(TARGET_NR_set_robust_list)
7032     unimplemented_nowarn:
7033 #endif
7034         ret = -TARGET_ENOSYS;
7035         break;
7036     }
7037 fail:
7038 #ifdef DEBUG
7039     gemu_log(" = " TARGET_ABI_FMT_ld "\n", ret);
7040 #endif
7041     if(do_strace)
7042         print_syscall_ret(num, ret);
7043     return ret;
7044 efault:
7045     ret = -TARGET_EFAULT;
7046     goto fail;
7047 }
7048