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