4 * Copyright (c) 2003 Fabrice Bellard
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.
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.
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/>.
19 #define _ATFILE_SOURCE
20 #include "qemu/osdep.h"
21 #include "qemu/cutils.h"
22 #include "qemu/path.h"
29 #include <sys/mount.h>
31 #include <sys/fsuid.h>
32 #include <sys/personality.h>
33 #include <sys/prctl.h>
34 #include <sys/resource.h>
36 #include <linux/capability.h>
38 #include <sys/timex.h>
39 #include <sys/socket.h>
43 #include <sys/times.h>
46 #include <sys/statfs.h>
48 #include <sys/sysinfo.h>
49 #include <sys/signalfd.h>
50 //#include <sys/user.h>
51 #include <netinet/ip.h>
52 #include <netinet/tcp.h>
53 #include <linux/wireless.h>
54 #include <linux/icmp.h>
55 #include <linux/icmpv6.h>
56 #include <linux/errqueue.h>
57 #include <linux/random.h>
58 #include "qemu-common.h"
60 #include <sys/timerfd.h>
66 #include <sys/eventfd.h>
69 #include <sys/epoll.h>
72 #include "qemu/xattr.h"
74 #ifdef CONFIG_SENDFILE
75 #include <sys/sendfile.h>
78 #define termios host_termios
79 #define winsize host_winsize
80 #define termio host_termio
81 #define sgttyb host_sgttyb /* same as target */
82 #define tchars host_tchars /* same as target */
83 #define ltchars host_ltchars /* same as target */
85 #include <linux/termios.h>
86 #include <linux/unistd.h>
87 #include <linux/cdrom.h>
88 #include <linux/hdreg.h>
89 #include <linux/soundcard.h>
91 #include <linux/mtio.h>
93 #if defined(CONFIG_FIEMAP)
94 #include <linux/fiemap.h>
97 #if defined(CONFIG_USBFS)
98 #include <linux/usbdevice_fs.h>
99 #include <linux/usb/ch9.h>
101 #include <linux/vt.h>
102 #include <linux/dm-ioctl.h>
103 #include <linux/reboot.h>
104 #include <linux/route.h>
105 #include <linux/filter.h>
106 #include <linux/blkpg.h>
107 #include <netpacket/packet.h>
108 #include <linux/netlink.h>
109 #include "linux_loop.h"
113 #include "fd-trans.h"
116 #define CLONE_IO 0x80000000 /* Clone io context */
119 /* We can't directly call the host clone syscall, because this will
120 * badly confuse libc (breaking mutexes, for example). So we must
121 * divide clone flags into:
122 * * flag combinations that look like pthread_create()
123 * * flag combinations that look like fork()
124 * * flags we can implement within QEMU itself
125 * * flags we can't support and will return an error for
127 /* For thread creation, all these flags must be present; for
128 * fork, none must be present.
130 #define CLONE_THREAD_FLAGS \
131 (CLONE_VM | CLONE_FS | CLONE_FILES | \
132 CLONE_SIGHAND | CLONE_THREAD | CLONE_SYSVSEM)
134 /* These flags are ignored:
135 * CLONE_DETACHED is now ignored by the kernel;
136 * CLONE_IO is just an optimisation hint to the I/O scheduler
138 #define CLONE_IGNORED_FLAGS \
139 (CLONE_DETACHED | CLONE_IO)
141 /* Flags for fork which we can implement within QEMU itself */
142 #define CLONE_OPTIONAL_FORK_FLAGS \
143 (CLONE_SETTLS | CLONE_PARENT_SETTID | \
144 CLONE_CHILD_CLEARTID | CLONE_CHILD_SETTID)
146 /* Flags for thread creation which we can implement within QEMU itself */
147 #define CLONE_OPTIONAL_THREAD_FLAGS \
148 (CLONE_SETTLS | CLONE_PARENT_SETTID | \
149 CLONE_CHILD_CLEARTID | CLONE_CHILD_SETTID | CLONE_PARENT)
151 #define CLONE_INVALID_FORK_FLAGS \
152 (~(CSIGNAL | CLONE_OPTIONAL_FORK_FLAGS | CLONE_IGNORED_FLAGS))
154 #define CLONE_INVALID_THREAD_FLAGS \
155 (~(CSIGNAL | CLONE_THREAD_FLAGS | CLONE_OPTIONAL_THREAD_FLAGS | \
156 CLONE_IGNORED_FLAGS))
158 /* CLONE_VFORK is special cased early in do_fork(). The other flag bits
159 * have almost all been allocated. We cannot support any of
160 * CLONE_NEWNS, CLONE_NEWCGROUP, CLONE_NEWUTS, CLONE_NEWIPC,
161 * CLONE_NEWUSER, CLONE_NEWPID, CLONE_NEWNET, CLONE_PTRACE, CLONE_UNTRACED.
162 * The checks against the invalid thread masks above will catch these.
163 * (The one remaining unallocated bit is 0x1000 which used to be CLONE_PID.)
166 /* Define DEBUG_ERESTARTSYS to force every syscall to be restarted
167 * once. This exercises the codepaths for restart.
169 //#define DEBUG_ERESTARTSYS
171 //#include <linux/msdos_fs.h>
172 #define VFAT_IOCTL_READDIR_BOTH _IOR('r', 1, struct linux_dirent [2])
173 #define VFAT_IOCTL_READDIR_SHORT _IOR('r', 2, struct linux_dirent [2])
183 #define _syscall0(type,name) \
184 static type name (void) \
186 return syscall(__NR_##name); \
189 #define _syscall1(type,name,type1,arg1) \
190 static type name (type1 arg1) \
192 return syscall(__NR_##name, arg1); \
195 #define _syscall2(type,name,type1,arg1,type2,arg2) \
196 static type name (type1 arg1,type2 arg2) \
198 return syscall(__NR_##name, arg1, arg2); \
201 #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
202 static type name (type1 arg1,type2 arg2,type3 arg3) \
204 return syscall(__NR_##name, arg1, arg2, arg3); \
207 #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
208 static type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4) \
210 return syscall(__NR_##name, arg1, arg2, arg3, arg4); \
213 #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
215 static type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5) \
217 return syscall(__NR_##name, arg1, arg2, arg3, arg4, arg5); \
221 #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
222 type5,arg5,type6,arg6) \
223 static type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5, \
226 return syscall(__NR_##name, arg1, arg2, arg3, arg4, arg5, arg6); \
230 #define __NR_sys_uname __NR_uname
231 #define __NR_sys_getcwd1 __NR_getcwd
232 #define __NR_sys_getdents __NR_getdents
233 #define __NR_sys_getdents64 __NR_getdents64
234 #define __NR_sys_getpriority __NR_getpriority
235 #define __NR_sys_rt_sigqueueinfo __NR_rt_sigqueueinfo
236 #define __NR_sys_rt_tgsigqueueinfo __NR_rt_tgsigqueueinfo
237 #define __NR_sys_syslog __NR_syslog
238 #define __NR_sys_futex __NR_futex
239 #define __NR_sys_inotify_init __NR_inotify_init
240 #define __NR_sys_inotify_add_watch __NR_inotify_add_watch
241 #define __NR_sys_inotify_rm_watch __NR_inotify_rm_watch
243 #if defined(__alpha__) || defined(__x86_64__) || defined(__s390x__)
244 #define __NR__llseek __NR_lseek
247 /* Newer kernel ports have llseek() instead of _llseek() */
248 #if defined(TARGET_NR_llseek) && !defined(TARGET_NR__llseek)
249 #define TARGET_NR__llseek TARGET_NR_llseek
253 _syscall0(int, gettid
)
255 /* This is a replacement for the host gettid() and must return a host
257 static int gettid(void) {
262 /* For the 64-bit guest on 32-bit host case we must emulate
263 * getdents using getdents64, because otherwise the host
264 * might hand us back more dirent records than we can fit
265 * into the guest buffer after structure format conversion.
266 * Otherwise we emulate getdents with getdents if the host has it.
268 #if defined(__NR_getdents) && HOST_LONG_BITS >= TARGET_ABI_BITS
269 #define EMULATE_GETDENTS_WITH_GETDENTS
272 #if defined(TARGET_NR_getdents) && defined(EMULATE_GETDENTS_WITH_GETDENTS)
273 _syscall3(int, sys_getdents
, uint
, fd
, struct linux_dirent
*, dirp
, uint
, count
);
275 #if (defined(TARGET_NR_getdents) && \
276 !defined(EMULATE_GETDENTS_WITH_GETDENTS)) || \
277 (defined(TARGET_NR_getdents64) && defined(__NR_getdents64))
278 _syscall3(int, sys_getdents64
, uint
, fd
, struct linux_dirent64
*, dirp
, uint
, count
);
280 #if defined(TARGET_NR__llseek) && defined(__NR_llseek)
281 _syscall5(int, _llseek
, uint
, fd
, ulong
, hi
, ulong
, lo
,
282 loff_t
*, res
, uint
, wh
);
284 _syscall3(int, sys_rt_sigqueueinfo
, pid_t
, pid
, int, sig
, siginfo_t
*, uinfo
)
285 _syscall4(int, sys_rt_tgsigqueueinfo
, pid_t
, pid
, pid_t
, tid
, int, sig
,
287 _syscall3(int,sys_syslog
,int,type
,char*,bufp
,int,len
)
288 #ifdef __NR_exit_group
289 _syscall1(int,exit_group
,int,error_code
)
291 #if defined(TARGET_NR_set_tid_address) && defined(__NR_set_tid_address)
292 _syscall1(int,set_tid_address
,int *,tidptr
)
294 #if defined(TARGET_NR_futex) && defined(__NR_futex)
295 _syscall6(int,sys_futex
,int *,uaddr
,int,op
,int,val
,
296 const struct timespec
*,timeout
,int *,uaddr2
,int,val3
)
298 #define __NR_sys_sched_getaffinity __NR_sched_getaffinity
299 _syscall3(int, sys_sched_getaffinity
, pid_t
, pid
, unsigned int, len
,
300 unsigned long *, user_mask_ptr
);
301 #define __NR_sys_sched_setaffinity __NR_sched_setaffinity
302 _syscall3(int, sys_sched_setaffinity
, pid_t
, pid
, unsigned int, len
,
303 unsigned long *, user_mask_ptr
);
304 #define __NR_sys_getcpu __NR_getcpu
305 _syscall3(int, sys_getcpu
, unsigned *, cpu
, unsigned *, node
, void *, tcache
);
306 _syscall4(int, reboot
, int, magic1
, int, magic2
, unsigned int, cmd
,
308 _syscall2(int, capget
, struct __user_cap_header_struct
*, header
,
309 struct __user_cap_data_struct
*, data
);
310 _syscall2(int, capset
, struct __user_cap_header_struct
*, header
,
311 struct __user_cap_data_struct
*, data
);
312 #if defined(TARGET_NR_ioprio_get) && defined(__NR_ioprio_get)
313 _syscall2(int, ioprio_get
, int, which
, int, who
)
315 #if defined(TARGET_NR_ioprio_set) && defined(__NR_ioprio_set)
316 _syscall3(int, ioprio_set
, int, which
, int, who
, int, ioprio
)
318 #if defined(TARGET_NR_getrandom) && defined(__NR_getrandom)
319 _syscall3(int, getrandom
, void *, buf
, size_t, buflen
, unsigned int, flags
)
322 #if defined(TARGET_NR_kcmp) && defined(__NR_kcmp)
323 _syscall5(int, kcmp
, pid_t
, pid1
, pid_t
, pid2
, int, type
,
324 unsigned long, idx1
, unsigned long, idx2
)
327 static bitmask_transtbl fcntl_flags_tbl
[] = {
328 { TARGET_O_ACCMODE
, TARGET_O_WRONLY
, O_ACCMODE
, O_WRONLY
, },
329 { TARGET_O_ACCMODE
, TARGET_O_RDWR
, O_ACCMODE
, O_RDWR
, },
330 { TARGET_O_CREAT
, TARGET_O_CREAT
, O_CREAT
, O_CREAT
, },
331 { TARGET_O_EXCL
, TARGET_O_EXCL
, O_EXCL
, O_EXCL
, },
332 { TARGET_O_NOCTTY
, TARGET_O_NOCTTY
, O_NOCTTY
, O_NOCTTY
, },
333 { TARGET_O_TRUNC
, TARGET_O_TRUNC
, O_TRUNC
, O_TRUNC
, },
334 { TARGET_O_APPEND
, TARGET_O_APPEND
, O_APPEND
, O_APPEND
, },
335 { TARGET_O_NONBLOCK
, TARGET_O_NONBLOCK
, O_NONBLOCK
, O_NONBLOCK
, },
336 { TARGET_O_SYNC
, TARGET_O_DSYNC
, O_SYNC
, O_DSYNC
, },
337 { TARGET_O_SYNC
, TARGET_O_SYNC
, O_SYNC
, O_SYNC
, },
338 { TARGET_FASYNC
, TARGET_FASYNC
, FASYNC
, FASYNC
, },
339 { TARGET_O_DIRECTORY
, TARGET_O_DIRECTORY
, O_DIRECTORY
, O_DIRECTORY
, },
340 { TARGET_O_NOFOLLOW
, TARGET_O_NOFOLLOW
, O_NOFOLLOW
, O_NOFOLLOW
, },
341 #if defined(O_DIRECT)
342 { TARGET_O_DIRECT
, TARGET_O_DIRECT
, O_DIRECT
, O_DIRECT
, },
344 #if defined(O_NOATIME)
345 { TARGET_O_NOATIME
, TARGET_O_NOATIME
, O_NOATIME
, O_NOATIME
},
347 #if defined(O_CLOEXEC)
348 { TARGET_O_CLOEXEC
, TARGET_O_CLOEXEC
, O_CLOEXEC
, O_CLOEXEC
},
351 { TARGET_O_PATH
, TARGET_O_PATH
, O_PATH
, O_PATH
},
353 #if defined(O_TMPFILE)
354 { TARGET_O_TMPFILE
, TARGET_O_TMPFILE
, O_TMPFILE
, O_TMPFILE
},
356 /* Don't terminate the list prematurely on 64-bit host+guest. */
357 #if TARGET_O_LARGEFILE != 0 || O_LARGEFILE != 0
358 { TARGET_O_LARGEFILE
, TARGET_O_LARGEFILE
, O_LARGEFILE
, O_LARGEFILE
, },
363 static int sys_getcwd1(char *buf
, size_t size
)
365 if (getcwd(buf
, size
) == NULL
) {
366 /* getcwd() sets errno */
369 return strlen(buf
)+1;
372 #ifdef TARGET_NR_utimensat
373 #if defined(__NR_utimensat)
374 #define __NR_sys_utimensat __NR_utimensat
375 _syscall4(int,sys_utimensat
,int,dirfd
,const char *,pathname
,
376 const struct timespec
*,tsp
,int,flags
)
378 static int sys_utimensat(int dirfd
, const char *pathname
,
379 const struct timespec times
[2], int flags
)
385 #endif /* TARGET_NR_utimensat */
387 #ifdef TARGET_NR_renameat2
388 #if defined(__NR_renameat2)
389 #define __NR_sys_renameat2 __NR_renameat2
390 _syscall5(int, sys_renameat2
, int, oldfd
, const char *, old
, int, newfd
,
391 const char *, new, unsigned int, flags
)
393 static int sys_renameat2(int oldfd
, const char *old
,
394 int newfd
, const char *new, int flags
)
397 return renameat(oldfd
, old
, newfd
, new);
403 #endif /* TARGET_NR_renameat2 */
405 #ifdef CONFIG_INOTIFY
406 #include <sys/inotify.h>
408 #if defined(TARGET_NR_inotify_init) && defined(__NR_inotify_init)
409 static int sys_inotify_init(void)
411 return (inotify_init());
414 #if defined(TARGET_NR_inotify_add_watch) && defined(__NR_inotify_add_watch)
415 static int sys_inotify_add_watch(int fd
,const char *pathname
, int32_t mask
)
417 return (inotify_add_watch(fd
, pathname
, mask
));
420 #if defined(TARGET_NR_inotify_rm_watch) && defined(__NR_inotify_rm_watch)
421 static int sys_inotify_rm_watch(int fd
, int32_t wd
)
423 return (inotify_rm_watch(fd
, wd
));
426 #ifdef CONFIG_INOTIFY1
427 #if defined(TARGET_NR_inotify_init1) && defined(__NR_inotify_init1)
428 static int sys_inotify_init1(int flags
)
430 return (inotify_init1(flags
));
435 /* Userspace can usually survive runtime without inotify */
436 #undef TARGET_NR_inotify_init
437 #undef TARGET_NR_inotify_init1
438 #undef TARGET_NR_inotify_add_watch
439 #undef TARGET_NR_inotify_rm_watch
440 #endif /* CONFIG_INOTIFY */
442 #if defined(TARGET_NR_prlimit64)
443 #ifndef __NR_prlimit64
444 # define __NR_prlimit64 -1
446 #define __NR_sys_prlimit64 __NR_prlimit64
447 /* The glibc rlimit structure may not be that used by the underlying syscall */
448 struct host_rlimit64
{
452 _syscall4(int, sys_prlimit64
, pid_t
, pid
, int, resource
,
453 const struct host_rlimit64
*, new_limit
,
454 struct host_rlimit64
*, old_limit
)
458 #if defined(TARGET_NR_timer_create)
459 /* Maxiumum of 32 active POSIX timers allowed at any one time. */
460 static timer_t g_posix_timers
[32] = { 0, } ;
462 static inline int next_free_host_timer(void)
465 /* FIXME: Does finding the next free slot require a lock? */
466 for (k
= 0; k
< ARRAY_SIZE(g_posix_timers
); k
++) {
467 if (g_posix_timers
[k
] == 0) {
468 g_posix_timers
[k
] = (timer_t
) 1;
476 /* ARM EABI and MIPS expect 64bit types aligned even on pairs or registers */
478 static inline int regpairs_aligned(void *cpu_env
, int num
)
480 return ((((CPUARMState
*)cpu_env
)->eabi
) == 1) ;
482 #elif defined(TARGET_MIPS) && (TARGET_ABI_BITS == 32)
483 static inline int regpairs_aligned(void *cpu_env
, int num
) { return 1; }
484 #elif defined(TARGET_PPC) && !defined(TARGET_PPC64)
485 /* SysV AVI for PPC32 expects 64bit parameters to be passed on odd/even pairs
486 * of registers which translates to the same as ARM/MIPS, because we start with
488 static inline int regpairs_aligned(void *cpu_env
, int num
) { return 1; }
489 #elif defined(TARGET_SH4)
490 /* SH4 doesn't align register pairs, except for p{read,write}64 */
491 static inline int regpairs_aligned(void *cpu_env
, int num
)
494 case TARGET_NR_pread64
:
495 case TARGET_NR_pwrite64
:
502 #elif defined(TARGET_XTENSA)
503 static inline int regpairs_aligned(void *cpu_env
, int num
) { return 1; }
505 static inline int regpairs_aligned(void *cpu_env
, int num
) { return 0; }
508 #define ERRNO_TABLE_SIZE 1200
510 /* target_to_host_errno_table[] is initialized from
511 * host_to_target_errno_table[] in syscall_init(). */
512 static uint16_t target_to_host_errno_table
[ERRNO_TABLE_SIZE
] = {
516 * This list is the union of errno values overridden in asm-<arch>/errno.h
517 * minus the errnos that are not actually generic to all archs.
519 static uint16_t host_to_target_errno_table
[ERRNO_TABLE_SIZE
] = {
520 [EAGAIN
] = TARGET_EAGAIN
,
521 [EIDRM
] = TARGET_EIDRM
,
522 [ECHRNG
] = TARGET_ECHRNG
,
523 [EL2NSYNC
] = TARGET_EL2NSYNC
,
524 [EL3HLT
] = TARGET_EL3HLT
,
525 [EL3RST
] = TARGET_EL3RST
,
526 [ELNRNG
] = TARGET_ELNRNG
,
527 [EUNATCH
] = TARGET_EUNATCH
,
528 [ENOCSI
] = TARGET_ENOCSI
,
529 [EL2HLT
] = TARGET_EL2HLT
,
530 [EDEADLK
] = TARGET_EDEADLK
,
531 [ENOLCK
] = TARGET_ENOLCK
,
532 [EBADE
] = TARGET_EBADE
,
533 [EBADR
] = TARGET_EBADR
,
534 [EXFULL
] = TARGET_EXFULL
,
535 [ENOANO
] = TARGET_ENOANO
,
536 [EBADRQC
] = TARGET_EBADRQC
,
537 [EBADSLT
] = TARGET_EBADSLT
,
538 [EBFONT
] = TARGET_EBFONT
,
539 [ENOSTR
] = TARGET_ENOSTR
,
540 [ENODATA
] = TARGET_ENODATA
,
541 [ETIME
] = TARGET_ETIME
,
542 [ENOSR
] = TARGET_ENOSR
,
543 [ENONET
] = TARGET_ENONET
,
544 [ENOPKG
] = TARGET_ENOPKG
,
545 [EREMOTE
] = TARGET_EREMOTE
,
546 [ENOLINK
] = TARGET_ENOLINK
,
547 [EADV
] = TARGET_EADV
,
548 [ESRMNT
] = TARGET_ESRMNT
,
549 [ECOMM
] = TARGET_ECOMM
,
550 [EPROTO
] = TARGET_EPROTO
,
551 [EDOTDOT
] = TARGET_EDOTDOT
,
552 [EMULTIHOP
] = TARGET_EMULTIHOP
,
553 [EBADMSG
] = TARGET_EBADMSG
,
554 [ENAMETOOLONG
] = TARGET_ENAMETOOLONG
,
555 [EOVERFLOW
] = TARGET_EOVERFLOW
,
556 [ENOTUNIQ
] = TARGET_ENOTUNIQ
,
557 [EBADFD
] = TARGET_EBADFD
,
558 [EREMCHG
] = TARGET_EREMCHG
,
559 [ELIBACC
] = TARGET_ELIBACC
,
560 [ELIBBAD
] = TARGET_ELIBBAD
,
561 [ELIBSCN
] = TARGET_ELIBSCN
,
562 [ELIBMAX
] = TARGET_ELIBMAX
,
563 [ELIBEXEC
] = TARGET_ELIBEXEC
,
564 [EILSEQ
] = TARGET_EILSEQ
,
565 [ENOSYS
] = TARGET_ENOSYS
,
566 [ELOOP
] = TARGET_ELOOP
,
567 [ERESTART
] = TARGET_ERESTART
,
568 [ESTRPIPE
] = TARGET_ESTRPIPE
,
569 [ENOTEMPTY
] = TARGET_ENOTEMPTY
,
570 [EUSERS
] = TARGET_EUSERS
,
571 [ENOTSOCK
] = TARGET_ENOTSOCK
,
572 [EDESTADDRREQ
] = TARGET_EDESTADDRREQ
,
573 [EMSGSIZE
] = TARGET_EMSGSIZE
,
574 [EPROTOTYPE
] = TARGET_EPROTOTYPE
,
575 [ENOPROTOOPT
] = TARGET_ENOPROTOOPT
,
576 [EPROTONOSUPPORT
] = TARGET_EPROTONOSUPPORT
,
577 [ESOCKTNOSUPPORT
] = TARGET_ESOCKTNOSUPPORT
,
578 [EOPNOTSUPP
] = TARGET_EOPNOTSUPP
,
579 [EPFNOSUPPORT
] = TARGET_EPFNOSUPPORT
,
580 [EAFNOSUPPORT
] = TARGET_EAFNOSUPPORT
,
581 [EADDRINUSE
] = TARGET_EADDRINUSE
,
582 [EADDRNOTAVAIL
] = TARGET_EADDRNOTAVAIL
,
583 [ENETDOWN
] = TARGET_ENETDOWN
,
584 [ENETUNREACH
] = TARGET_ENETUNREACH
,
585 [ENETRESET
] = TARGET_ENETRESET
,
586 [ECONNABORTED
] = TARGET_ECONNABORTED
,
587 [ECONNRESET
] = TARGET_ECONNRESET
,
588 [ENOBUFS
] = TARGET_ENOBUFS
,
589 [EISCONN
] = TARGET_EISCONN
,
590 [ENOTCONN
] = TARGET_ENOTCONN
,
591 [EUCLEAN
] = TARGET_EUCLEAN
,
592 [ENOTNAM
] = TARGET_ENOTNAM
,
593 [ENAVAIL
] = TARGET_ENAVAIL
,
594 [EISNAM
] = TARGET_EISNAM
,
595 [EREMOTEIO
] = TARGET_EREMOTEIO
,
596 [EDQUOT
] = TARGET_EDQUOT
,
597 [ESHUTDOWN
] = TARGET_ESHUTDOWN
,
598 [ETOOMANYREFS
] = TARGET_ETOOMANYREFS
,
599 [ETIMEDOUT
] = TARGET_ETIMEDOUT
,
600 [ECONNREFUSED
] = TARGET_ECONNREFUSED
,
601 [EHOSTDOWN
] = TARGET_EHOSTDOWN
,
602 [EHOSTUNREACH
] = TARGET_EHOSTUNREACH
,
603 [EALREADY
] = TARGET_EALREADY
,
604 [EINPROGRESS
] = TARGET_EINPROGRESS
,
605 [ESTALE
] = TARGET_ESTALE
,
606 [ECANCELED
] = TARGET_ECANCELED
,
607 [ENOMEDIUM
] = TARGET_ENOMEDIUM
,
608 [EMEDIUMTYPE
] = TARGET_EMEDIUMTYPE
,
610 [ENOKEY
] = TARGET_ENOKEY
,
613 [EKEYEXPIRED
] = TARGET_EKEYEXPIRED
,
616 [EKEYREVOKED
] = TARGET_EKEYREVOKED
,
619 [EKEYREJECTED
] = TARGET_EKEYREJECTED
,
622 [EOWNERDEAD
] = TARGET_EOWNERDEAD
,
624 #ifdef ENOTRECOVERABLE
625 [ENOTRECOVERABLE
] = TARGET_ENOTRECOVERABLE
,
628 [ENOMSG
] = TARGET_ENOMSG
,
631 [ERFKILL
] = TARGET_ERFKILL
,
634 [EHWPOISON
] = TARGET_EHWPOISON
,
638 static inline int host_to_target_errno(int err
)
640 if (err
>= 0 && err
< ERRNO_TABLE_SIZE
&&
641 host_to_target_errno_table
[err
]) {
642 return host_to_target_errno_table
[err
];
647 static inline int target_to_host_errno(int err
)
649 if (err
>= 0 && err
< ERRNO_TABLE_SIZE
&&
650 target_to_host_errno_table
[err
]) {
651 return target_to_host_errno_table
[err
];
656 static inline abi_long
get_errno(abi_long ret
)
659 return -host_to_target_errno(errno
);
664 const char *target_strerror(int err
)
666 if (err
== TARGET_ERESTARTSYS
) {
667 return "To be restarted";
669 if (err
== TARGET_QEMU_ESIGRETURN
) {
670 return "Successful exit from sigreturn";
673 if ((err
>= ERRNO_TABLE_SIZE
) || (err
< 0)) {
676 return strerror(target_to_host_errno(err
));
679 #define safe_syscall0(type, name) \
680 static type safe_##name(void) \
682 return safe_syscall(__NR_##name); \
685 #define safe_syscall1(type, name, type1, arg1) \
686 static type safe_##name(type1 arg1) \
688 return safe_syscall(__NR_##name, arg1); \
691 #define safe_syscall2(type, name, type1, arg1, type2, arg2) \
692 static type safe_##name(type1 arg1, type2 arg2) \
694 return safe_syscall(__NR_##name, arg1, arg2); \
697 #define safe_syscall3(type, name, type1, arg1, type2, arg2, type3, arg3) \
698 static type safe_##name(type1 arg1, type2 arg2, type3 arg3) \
700 return safe_syscall(__NR_##name, arg1, arg2, arg3); \
703 #define safe_syscall4(type, name, type1, arg1, type2, arg2, type3, arg3, \
705 static type safe_##name(type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
707 return safe_syscall(__NR_##name, arg1, arg2, arg3, arg4); \
710 #define safe_syscall5(type, name, type1, arg1, type2, arg2, type3, arg3, \
711 type4, arg4, type5, arg5) \
712 static type safe_##name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \
715 return safe_syscall(__NR_##name, arg1, arg2, arg3, arg4, arg5); \
718 #define safe_syscall6(type, name, type1, arg1, type2, arg2, type3, arg3, \
719 type4, arg4, type5, arg5, type6, arg6) \
720 static type safe_##name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \
721 type5 arg5, type6 arg6) \
723 return safe_syscall(__NR_##name, arg1, arg2, arg3, arg4, arg5, arg6); \
726 safe_syscall3(ssize_t
, read
, int, fd
, void *, buff
, size_t, count
)
727 safe_syscall3(ssize_t
, write
, int, fd
, const void *, buff
, size_t, count
)
728 safe_syscall4(int, openat
, int, dirfd
, const char *, pathname
, \
729 int, flags
, mode_t
, mode
)
730 safe_syscall4(pid_t
, wait4
, pid_t
, pid
, int *, status
, int, options
, \
731 struct rusage
*, rusage
)
732 safe_syscall5(int, waitid
, idtype_t
, idtype
, id_t
, id
, siginfo_t
*, infop
, \
733 int, options
, struct rusage
*, rusage
)
734 safe_syscall3(int, execve
, const char *, filename
, char **, argv
, char **, envp
)
735 safe_syscall6(int, pselect6
, int, nfds
, fd_set
*, readfds
, fd_set
*, writefds
, \
736 fd_set
*, exceptfds
, struct timespec
*, timeout
, void *, sig
)
737 safe_syscall5(int, ppoll
, struct pollfd
*, ufds
, unsigned int, nfds
,
738 struct timespec
*, tsp
, const sigset_t
*, sigmask
,
740 safe_syscall6(int, epoll_pwait
, int, epfd
, struct epoll_event
*, events
,
741 int, maxevents
, int, timeout
, const sigset_t
*, sigmask
,
743 safe_syscall6(int,futex
,int *,uaddr
,int,op
,int,val
, \
744 const struct timespec
*,timeout
,int *,uaddr2
,int,val3
)
745 safe_syscall2(int, rt_sigsuspend
, sigset_t
*, newset
, size_t, sigsetsize
)
746 safe_syscall2(int, kill
, pid_t
, pid
, int, sig
)
747 safe_syscall2(int, tkill
, int, tid
, int, sig
)
748 safe_syscall3(int, tgkill
, int, tgid
, int, pid
, int, sig
)
749 safe_syscall3(ssize_t
, readv
, int, fd
, const struct iovec
*, iov
, int, iovcnt
)
750 safe_syscall3(ssize_t
, writev
, int, fd
, const struct iovec
*, iov
, int, iovcnt
)
751 safe_syscall5(ssize_t
, preadv
, int, fd
, const struct iovec
*, iov
, int, iovcnt
,
752 unsigned long, pos_l
, unsigned long, pos_h
)
753 safe_syscall5(ssize_t
, pwritev
, int, fd
, const struct iovec
*, iov
, int, iovcnt
,
754 unsigned long, pos_l
, unsigned long, pos_h
)
755 safe_syscall3(int, connect
, int, fd
, const struct sockaddr
*, addr
,
757 safe_syscall6(ssize_t
, sendto
, int, fd
, const void *, buf
, size_t, len
,
758 int, flags
, const struct sockaddr
*, addr
, socklen_t
, addrlen
)
759 safe_syscall6(ssize_t
, recvfrom
, int, fd
, void *, buf
, size_t, len
,
760 int, flags
, struct sockaddr
*, addr
, socklen_t
*, addrlen
)
761 safe_syscall3(ssize_t
, sendmsg
, int, fd
, const struct msghdr
*, msg
, int, flags
)
762 safe_syscall3(ssize_t
, recvmsg
, int, fd
, struct msghdr
*, msg
, int, flags
)
763 safe_syscall2(int, flock
, int, fd
, int, operation
)
764 safe_syscall4(int, rt_sigtimedwait
, const sigset_t
*, these
, siginfo_t
*, uinfo
,
765 const struct timespec
*, uts
, size_t, sigsetsize
)
766 safe_syscall4(int, accept4
, int, fd
, struct sockaddr
*, addr
, socklen_t
*, len
,
768 safe_syscall2(int, nanosleep
, const struct timespec
*, req
,
769 struct timespec
*, rem
)
770 #ifdef TARGET_NR_clock_nanosleep
771 safe_syscall4(int, clock_nanosleep
, const clockid_t
, clock
, int, flags
,
772 const struct timespec
*, req
, struct timespec
*, rem
)
775 safe_syscall4(int, msgsnd
, int, msgid
, const void *, msgp
, size_t, sz
,
777 safe_syscall5(int, msgrcv
, int, msgid
, void *, msgp
, size_t, sz
,
778 long, msgtype
, int, flags
)
779 safe_syscall4(int, semtimedop
, int, semid
, struct sembuf
*, tsops
,
780 unsigned, nsops
, const struct timespec
*, timeout
)
782 /* This host kernel architecture uses a single ipc syscall; fake up
783 * wrappers for the sub-operations to hide this implementation detail.
784 * Annoyingly we can't include linux/ipc.h to get the constant definitions
785 * for the call parameter because some structs in there conflict with the
786 * sys/ipc.h ones. So we just define them here, and rely on them being
787 * the same for all host architectures.
789 #define Q_SEMTIMEDOP 4
792 #define Q_IPCCALL(VERSION, OP) ((VERSION) << 16 | (OP))
794 safe_syscall6(int, ipc
, int, call
, long, first
, long, second
, long, third
,
795 void *, ptr
, long, fifth
)
796 static int safe_msgsnd(int msgid
, const void *msgp
, size_t sz
, int flags
)
798 return safe_ipc(Q_IPCCALL(0, Q_MSGSND
), msgid
, sz
, flags
, (void *)msgp
, 0);
800 static int safe_msgrcv(int msgid
, void *msgp
, size_t sz
, long type
, int flags
)
802 return safe_ipc(Q_IPCCALL(1, Q_MSGRCV
), msgid
, sz
, flags
, msgp
, type
);
804 static int safe_semtimedop(int semid
, struct sembuf
*tsops
, unsigned nsops
,
805 const struct timespec
*timeout
)
807 return safe_ipc(Q_IPCCALL(0, Q_SEMTIMEDOP
), semid
, nsops
, 0, tsops
,
811 #if defined(TARGET_NR_mq_open) && defined(__NR_mq_open)
812 safe_syscall5(int, mq_timedsend
, int, mqdes
, const char *, msg_ptr
,
813 size_t, len
, unsigned, prio
, const struct timespec
*, timeout
)
814 safe_syscall5(int, mq_timedreceive
, int, mqdes
, char *, msg_ptr
,
815 size_t, len
, unsigned *, prio
, const struct timespec
*, timeout
)
817 /* We do ioctl like this rather than via safe_syscall3 to preserve the
818 * "third argument might be integer or pointer or not present" behaviour of
821 #define safe_ioctl(...) safe_syscall(__NR_ioctl, __VA_ARGS__)
822 /* Similarly for fcntl. Note that callers must always:
823 * pass the F_GETLK64 etc constants rather than the unsuffixed F_GETLK
824 * use the flock64 struct rather than unsuffixed flock
825 * This will then work and use a 64-bit offset for both 32-bit and 64-bit hosts.
828 #define safe_fcntl(...) safe_syscall(__NR_fcntl64, __VA_ARGS__)
830 #define safe_fcntl(...) safe_syscall(__NR_fcntl, __VA_ARGS__)
833 static inline int host_to_target_sock_type(int host_type
)
837 switch (host_type
& 0xf /* SOCK_TYPE_MASK */) {
839 target_type
= TARGET_SOCK_DGRAM
;
842 target_type
= TARGET_SOCK_STREAM
;
845 target_type
= host_type
& 0xf /* SOCK_TYPE_MASK */;
849 #if defined(SOCK_CLOEXEC)
850 if (host_type
& SOCK_CLOEXEC
) {
851 target_type
|= TARGET_SOCK_CLOEXEC
;
855 #if defined(SOCK_NONBLOCK)
856 if (host_type
& SOCK_NONBLOCK
) {
857 target_type
|= TARGET_SOCK_NONBLOCK
;
864 static abi_ulong target_brk
;
865 static abi_ulong target_original_brk
;
866 static abi_ulong brk_page
;
868 void target_set_brk(abi_ulong new_brk
)
870 target_original_brk
= target_brk
= HOST_PAGE_ALIGN(new_brk
);
871 brk_page
= HOST_PAGE_ALIGN(target_brk
);
874 //#define DEBUGF_BRK(message, args...) do { fprintf(stderr, (message), ## args); } while (0)
875 #define DEBUGF_BRK(message, args...)
877 /* do_brk() must return target values and target errnos. */
878 abi_long
do_brk(abi_ulong new_brk
)
880 abi_long mapped_addr
;
881 abi_ulong new_alloc_size
;
883 DEBUGF_BRK("do_brk(" TARGET_ABI_FMT_lx
") -> ", new_brk
);
886 DEBUGF_BRK(TARGET_ABI_FMT_lx
" (!new_brk)\n", target_brk
);
889 if (new_brk
< target_original_brk
) {
890 DEBUGF_BRK(TARGET_ABI_FMT_lx
" (new_brk < target_original_brk)\n",
895 /* If the new brk is less than the highest page reserved to the
896 * target heap allocation, set it and we're almost done... */
897 if (new_brk
<= brk_page
) {
898 /* Heap contents are initialized to zero, as for anonymous
900 if (new_brk
> target_brk
) {
901 memset(g2h(target_brk
), 0, new_brk
- target_brk
);
903 target_brk
= new_brk
;
904 DEBUGF_BRK(TARGET_ABI_FMT_lx
" (new_brk <= brk_page)\n", target_brk
);
908 /* We need to allocate more memory after the brk... Note that
909 * we don't use MAP_FIXED because that will map over the top of
910 * any existing mapping (like the one with the host libc or qemu
911 * itself); instead we treat "mapped but at wrong address" as
912 * a failure and unmap again.
914 new_alloc_size
= HOST_PAGE_ALIGN(new_brk
- brk_page
);
915 mapped_addr
= get_errno(target_mmap(brk_page
, new_alloc_size
,
916 PROT_READ
|PROT_WRITE
,
917 MAP_ANON
|MAP_PRIVATE
, 0, 0));
919 if (mapped_addr
== brk_page
) {
920 /* Heap contents are initialized to zero, as for anonymous
921 * mapped pages. Technically the new pages are already
922 * initialized to zero since they *are* anonymous mapped
923 * pages, however we have to take care with the contents that
924 * come from the remaining part of the previous page: it may
925 * contains garbage data due to a previous heap usage (grown
927 memset(g2h(target_brk
), 0, brk_page
- target_brk
);
929 target_brk
= new_brk
;
930 brk_page
= HOST_PAGE_ALIGN(target_brk
);
931 DEBUGF_BRK(TARGET_ABI_FMT_lx
" (mapped_addr == brk_page)\n",
934 } else if (mapped_addr
!= -1) {
935 /* Mapped but at wrong address, meaning there wasn't actually
936 * enough space for this brk.
938 target_munmap(mapped_addr
, new_alloc_size
);
940 DEBUGF_BRK(TARGET_ABI_FMT_lx
" (mapped_addr != -1)\n", target_brk
);
943 DEBUGF_BRK(TARGET_ABI_FMT_lx
" (otherwise)\n", target_brk
);
946 #if defined(TARGET_ALPHA)
947 /* We (partially) emulate OSF/1 on Alpha, which requires we
948 return a proper errno, not an unchanged brk value. */
949 return -TARGET_ENOMEM
;
951 /* For everything else, return the previous break. */
955 static inline abi_long
copy_from_user_fdset(fd_set
*fds
,
956 abi_ulong target_fds_addr
,
960 abi_ulong b
, *target_fds
;
962 nw
= DIV_ROUND_UP(n
, TARGET_ABI_BITS
);
963 if (!(target_fds
= lock_user(VERIFY_READ
,
965 sizeof(abi_ulong
) * nw
,
967 return -TARGET_EFAULT
;
971 for (i
= 0; i
< nw
; i
++) {
972 /* grab the abi_ulong */
973 __get_user(b
, &target_fds
[i
]);
974 for (j
= 0; j
< TARGET_ABI_BITS
; j
++) {
975 /* check the bit inside the abi_ulong */
982 unlock_user(target_fds
, target_fds_addr
, 0);
987 static inline abi_ulong
copy_from_user_fdset_ptr(fd_set
*fds
, fd_set
**fds_ptr
,
988 abi_ulong target_fds_addr
,
991 if (target_fds_addr
) {
992 if (copy_from_user_fdset(fds
, target_fds_addr
, n
))
993 return -TARGET_EFAULT
;
1001 static inline abi_long
copy_to_user_fdset(abi_ulong target_fds_addr
,
1007 abi_ulong
*target_fds
;
1009 nw
= DIV_ROUND_UP(n
, TARGET_ABI_BITS
);
1010 if (!(target_fds
= lock_user(VERIFY_WRITE
,
1012 sizeof(abi_ulong
) * nw
,
1014 return -TARGET_EFAULT
;
1017 for (i
= 0; i
< nw
; i
++) {
1019 for (j
= 0; j
< TARGET_ABI_BITS
; j
++) {
1020 v
|= ((abi_ulong
)(FD_ISSET(k
, fds
) != 0) << j
);
1023 __put_user(v
, &target_fds
[i
]);
1026 unlock_user(target_fds
, target_fds_addr
, sizeof(abi_ulong
) * nw
);
1031 #if defined(__alpha__)
1032 #define HOST_HZ 1024
1037 static inline abi_long
host_to_target_clock_t(long ticks
)
1039 #if HOST_HZ == TARGET_HZ
1042 return ((int64_t)ticks
* TARGET_HZ
) / HOST_HZ
;
1046 static inline abi_long
host_to_target_rusage(abi_ulong target_addr
,
1047 const struct rusage
*rusage
)
1049 struct target_rusage
*target_rusage
;
1051 if (!lock_user_struct(VERIFY_WRITE
, target_rusage
, target_addr
, 0))
1052 return -TARGET_EFAULT
;
1053 target_rusage
->ru_utime
.tv_sec
= tswapal(rusage
->ru_utime
.tv_sec
);
1054 target_rusage
->ru_utime
.tv_usec
= tswapal(rusage
->ru_utime
.tv_usec
);
1055 target_rusage
->ru_stime
.tv_sec
= tswapal(rusage
->ru_stime
.tv_sec
);
1056 target_rusage
->ru_stime
.tv_usec
= tswapal(rusage
->ru_stime
.tv_usec
);
1057 target_rusage
->ru_maxrss
= tswapal(rusage
->ru_maxrss
);
1058 target_rusage
->ru_ixrss
= tswapal(rusage
->ru_ixrss
);
1059 target_rusage
->ru_idrss
= tswapal(rusage
->ru_idrss
);
1060 target_rusage
->ru_isrss
= tswapal(rusage
->ru_isrss
);
1061 target_rusage
->ru_minflt
= tswapal(rusage
->ru_minflt
);
1062 target_rusage
->ru_majflt
= tswapal(rusage
->ru_majflt
);
1063 target_rusage
->ru_nswap
= tswapal(rusage
->ru_nswap
);
1064 target_rusage
->ru_inblock
= tswapal(rusage
->ru_inblock
);
1065 target_rusage
->ru_oublock
= tswapal(rusage
->ru_oublock
);
1066 target_rusage
->ru_msgsnd
= tswapal(rusage
->ru_msgsnd
);
1067 target_rusage
->ru_msgrcv
= tswapal(rusage
->ru_msgrcv
);
1068 target_rusage
->ru_nsignals
= tswapal(rusage
->ru_nsignals
);
1069 target_rusage
->ru_nvcsw
= tswapal(rusage
->ru_nvcsw
);
1070 target_rusage
->ru_nivcsw
= tswapal(rusage
->ru_nivcsw
);
1071 unlock_user_struct(target_rusage
, target_addr
, 1);
1076 static inline rlim_t
target_to_host_rlim(abi_ulong target_rlim
)
1078 abi_ulong target_rlim_swap
;
1081 target_rlim_swap
= tswapal(target_rlim
);
1082 if (target_rlim_swap
== TARGET_RLIM_INFINITY
)
1083 return RLIM_INFINITY
;
1085 result
= target_rlim_swap
;
1086 if (target_rlim_swap
!= (rlim_t
)result
)
1087 return RLIM_INFINITY
;
1092 static inline abi_ulong
host_to_target_rlim(rlim_t rlim
)
1094 abi_ulong target_rlim_swap
;
1097 if (rlim
== RLIM_INFINITY
|| rlim
!= (abi_long
)rlim
)
1098 target_rlim_swap
= TARGET_RLIM_INFINITY
;
1100 target_rlim_swap
= rlim
;
1101 result
= tswapal(target_rlim_swap
);
1106 static inline int target_to_host_resource(int code
)
1109 case TARGET_RLIMIT_AS
:
1111 case TARGET_RLIMIT_CORE
:
1113 case TARGET_RLIMIT_CPU
:
1115 case TARGET_RLIMIT_DATA
:
1117 case TARGET_RLIMIT_FSIZE
:
1118 return RLIMIT_FSIZE
;
1119 case TARGET_RLIMIT_LOCKS
:
1120 return RLIMIT_LOCKS
;
1121 case TARGET_RLIMIT_MEMLOCK
:
1122 return RLIMIT_MEMLOCK
;
1123 case TARGET_RLIMIT_MSGQUEUE
:
1124 return RLIMIT_MSGQUEUE
;
1125 case TARGET_RLIMIT_NICE
:
1127 case TARGET_RLIMIT_NOFILE
:
1128 return RLIMIT_NOFILE
;
1129 case TARGET_RLIMIT_NPROC
:
1130 return RLIMIT_NPROC
;
1131 case TARGET_RLIMIT_RSS
:
1133 case TARGET_RLIMIT_RTPRIO
:
1134 return RLIMIT_RTPRIO
;
1135 case TARGET_RLIMIT_SIGPENDING
:
1136 return RLIMIT_SIGPENDING
;
1137 case TARGET_RLIMIT_STACK
:
1138 return RLIMIT_STACK
;
1144 static inline abi_long
copy_from_user_timeval(struct timeval
*tv
,
1145 abi_ulong target_tv_addr
)
1147 struct target_timeval
*target_tv
;
1149 if (!lock_user_struct(VERIFY_READ
, target_tv
, target_tv_addr
, 1))
1150 return -TARGET_EFAULT
;
1152 __get_user(tv
->tv_sec
, &target_tv
->tv_sec
);
1153 __get_user(tv
->tv_usec
, &target_tv
->tv_usec
);
1155 unlock_user_struct(target_tv
, target_tv_addr
, 0);
1160 static inline abi_long
copy_to_user_timeval(abi_ulong target_tv_addr
,
1161 const struct timeval
*tv
)
1163 struct target_timeval
*target_tv
;
1165 if (!lock_user_struct(VERIFY_WRITE
, target_tv
, target_tv_addr
, 0))
1166 return -TARGET_EFAULT
;
1168 __put_user(tv
->tv_sec
, &target_tv
->tv_sec
);
1169 __put_user(tv
->tv_usec
, &target_tv
->tv_usec
);
1171 unlock_user_struct(target_tv
, target_tv_addr
, 1);
1176 static inline abi_long
copy_from_user_timezone(struct timezone
*tz
,
1177 abi_ulong target_tz_addr
)
1179 struct target_timezone
*target_tz
;
1181 if (!lock_user_struct(VERIFY_READ
, target_tz
, target_tz_addr
, 1)) {
1182 return -TARGET_EFAULT
;
1185 __get_user(tz
->tz_minuteswest
, &target_tz
->tz_minuteswest
);
1186 __get_user(tz
->tz_dsttime
, &target_tz
->tz_dsttime
);
1188 unlock_user_struct(target_tz
, target_tz_addr
, 0);
1193 #if defined(TARGET_NR_mq_open) && defined(__NR_mq_open)
1196 static inline abi_long
copy_from_user_mq_attr(struct mq_attr
*attr
,
1197 abi_ulong target_mq_attr_addr
)
1199 struct target_mq_attr
*target_mq_attr
;
1201 if (!lock_user_struct(VERIFY_READ
, target_mq_attr
,
1202 target_mq_attr_addr
, 1))
1203 return -TARGET_EFAULT
;
1205 __get_user(attr
->mq_flags
, &target_mq_attr
->mq_flags
);
1206 __get_user(attr
->mq_maxmsg
, &target_mq_attr
->mq_maxmsg
);
1207 __get_user(attr
->mq_msgsize
, &target_mq_attr
->mq_msgsize
);
1208 __get_user(attr
->mq_curmsgs
, &target_mq_attr
->mq_curmsgs
);
1210 unlock_user_struct(target_mq_attr
, target_mq_attr_addr
, 0);
1215 static inline abi_long
copy_to_user_mq_attr(abi_ulong target_mq_attr_addr
,
1216 const struct mq_attr
*attr
)
1218 struct target_mq_attr
*target_mq_attr
;
1220 if (!lock_user_struct(VERIFY_WRITE
, target_mq_attr
,
1221 target_mq_attr_addr
, 0))
1222 return -TARGET_EFAULT
;
1224 __put_user(attr
->mq_flags
, &target_mq_attr
->mq_flags
);
1225 __put_user(attr
->mq_maxmsg
, &target_mq_attr
->mq_maxmsg
);
1226 __put_user(attr
->mq_msgsize
, &target_mq_attr
->mq_msgsize
);
1227 __put_user(attr
->mq_curmsgs
, &target_mq_attr
->mq_curmsgs
);
1229 unlock_user_struct(target_mq_attr
, target_mq_attr_addr
, 1);
1235 #if defined(TARGET_NR_select) || defined(TARGET_NR__newselect)
1236 /* do_select() must return target values and target errnos. */
1237 static abi_long
do_select(int n
,
1238 abi_ulong rfd_addr
, abi_ulong wfd_addr
,
1239 abi_ulong efd_addr
, abi_ulong target_tv_addr
)
1241 fd_set rfds
, wfds
, efds
;
1242 fd_set
*rfds_ptr
, *wfds_ptr
, *efds_ptr
;
1244 struct timespec ts
, *ts_ptr
;
1247 ret
= copy_from_user_fdset_ptr(&rfds
, &rfds_ptr
, rfd_addr
, n
);
1251 ret
= copy_from_user_fdset_ptr(&wfds
, &wfds_ptr
, wfd_addr
, n
);
1255 ret
= copy_from_user_fdset_ptr(&efds
, &efds_ptr
, efd_addr
, n
);
1260 if (target_tv_addr
) {
1261 if (copy_from_user_timeval(&tv
, target_tv_addr
))
1262 return -TARGET_EFAULT
;
1263 ts
.tv_sec
= tv
.tv_sec
;
1264 ts
.tv_nsec
= tv
.tv_usec
* 1000;
1270 ret
= get_errno(safe_pselect6(n
, rfds_ptr
, wfds_ptr
, efds_ptr
,
1273 if (!is_error(ret
)) {
1274 if (rfd_addr
&& copy_to_user_fdset(rfd_addr
, &rfds
, n
))
1275 return -TARGET_EFAULT
;
1276 if (wfd_addr
&& copy_to_user_fdset(wfd_addr
, &wfds
, n
))
1277 return -TARGET_EFAULT
;
1278 if (efd_addr
&& copy_to_user_fdset(efd_addr
, &efds
, n
))
1279 return -TARGET_EFAULT
;
1281 if (target_tv_addr
) {
1282 tv
.tv_sec
= ts
.tv_sec
;
1283 tv
.tv_usec
= ts
.tv_nsec
/ 1000;
1284 if (copy_to_user_timeval(target_tv_addr
, &tv
)) {
1285 return -TARGET_EFAULT
;
1293 #if defined(TARGET_WANT_OLD_SYS_SELECT)
1294 static abi_long
do_old_select(abi_ulong arg1
)
1296 struct target_sel_arg_struct
*sel
;
1297 abi_ulong inp
, outp
, exp
, tvp
;
1300 if (!lock_user_struct(VERIFY_READ
, sel
, arg1
, 1)) {
1301 return -TARGET_EFAULT
;
1304 nsel
= tswapal(sel
->n
);
1305 inp
= tswapal(sel
->inp
);
1306 outp
= tswapal(sel
->outp
);
1307 exp
= tswapal(sel
->exp
);
1308 tvp
= tswapal(sel
->tvp
);
1310 unlock_user_struct(sel
, arg1
, 0);
1312 return do_select(nsel
, inp
, outp
, exp
, tvp
);
1317 static abi_long
do_pipe2(int host_pipe
[], int flags
)
1320 return pipe2(host_pipe
, flags
);
1326 static abi_long
do_pipe(void *cpu_env
, abi_ulong pipedes
,
1327 int flags
, int is_pipe2
)
1331 ret
= flags
? do_pipe2(host_pipe
, flags
) : pipe(host_pipe
);
1334 return get_errno(ret
);
1336 /* Several targets have special calling conventions for the original
1337 pipe syscall, but didn't replicate this into the pipe2 syscall. */
1339 #if defined(TARGET_ALPHA)
1340 ((CPUAlphaState
*)cpu_env
)->ir
[IR_A4
] = host_pipe
[1];
1341 return host_pipe
[0];
1342 #elif defined(TARGET_MIPS)
1343 ((CPUMIPSState
*)cpu_env
)->active_tc
.gpr
[3] = host_pipe
[1];
1344 return host_pipe
[0];
1345 #elif defined(TARGET_SH4)
1346 ((CPUSH4State
*)cpu_env
)->gregs
[1] = host_pipe
[1];
1347 return host_pipe
[0];
1348 #elif defined(TARGET_SPARC)
1349 ((CPUSPARCState
*)cpu_env
)->regwptr
[1] = host_pipe
[1];
1350 return host_pipe
[0];
1354 if (put_user_s32(host_pipe
[0], pipedes
)
1355 || put_user_s32(host_pipe
[1], pipedes
+ sizeof(host_pipe
[0])))
1356 return -TARGET_EFAULT
;
1357 return get_errno(ret
);
1360 static inline abi_long
target_to_host_ip_mreq(struct ip_mreqn
*mreqn
,
1361 abi_ulong target_addr
,
1364 struct target_ip_mreqn
*target_smreqn
;
1366 target_smreqn
= lock_user(VERIFY_READ
, target_addr
, len
, 1);
1368 return -TARGET_EFAULT
;
1369 mreqn
->imr_multiaddr
.s_addr
= target_smreqn
->imr_multiaddr
.s_addr
;
1370 mreqn
->imr_address
.s_addr
= target_smreqn
->imr_address
.s_addr
;
1371 if (len
== sizeof(struct target_ip_mreqn
))
1372 mreqn
->imr_ifindex
= tswapal(target_smreqn
->imr_ifindex
);
1373 unlock_user(target_smreqn
, target_addr
, 0);
1378 static inline abi_long
target_to_host_sockaddr(int fd
, struct sockaddr
*addr
,
1379 abi_ulong target_addr
,
1382 const socklen_t unix_maxlen
= sizeof (struct sockaddr_un
);
1383 sa_family_t sa_family
;
1384 struct target_sockaddr
*target_saddr
;
1386 if (fd_trans_target_to_host_addr(fd
)) {
1387 return fd_trans_target_to_host_addr(fd
)(addr
, target_addr
, len
);
1390 target_saddr
= lock_user(VERIFY_READ
, target_addr
, len
, 1);
1392 return -TARGET_EFAULT
;
1394 sa_family
= tswap16(target_saddr
->sa_family
);
1396 /* Oops. The caller might send a incomplete sun_path; sun_path
1397 * must be terminated by \0 (see the manual page), but
1398 * unfortunately it is quite common to specify sockaddr_un
1399 * length as "strlen(x->sun_path)" while it should be
1400 * "strlen(...) + 1". We'll fix that here if needed.
1401 * Linux kernel has a similar feature.
1404 if (sa_family
== AF_UNIX
) {
1405 if (len
< unix_maxlen
&& len
> 0) {
1406 char *cp
= (char*)target_saddr
;
1408 if ( cp
[len
-1] && !cp
[len
] )
1411 if (len
> unix_maxlen
)
1415 memcpy(addr
, target_saddr
, len
);
1416 addr
->sa_family
= sa_family
;
1417 if (sa_family
== AF_NETLINK
) {
1418 struct sockaddr_nl
*nladdr
;
1420 nladdr
= (struct sockaddr_nl
*)addr
;
1421 nladdr
->nl_pid
= tswap32(nladdr
->nl_pid
);
1422 nladdr
->nl_groups
= tswap32(nladdr
->nl_groups
);
1423 } else if (sa_family
== AF_PACKET
) {
1424 struct target_sockaddr_ll
*lladdr
;
1426 lladdr
= (struct target_sockaddr_ll
*)addr
;
1427 lladdr
->sll_ifindex
= tswap32(lladdr
->sll_ifindex
);
1428 lladdr
->sll_hatype
= tswap16(lladdr
->sll_hatype
);
1430 unlock_user(target_saddr
, target_addr
, 0);
1435 static inline abi_long
host_to_target_sockaddr(abi_ulong target_addr
,
1436 struct sockaddr
*addr
,
1439 struct target_sockaddr
*target_saddr
;
1446 target_saddr
= lock_user(VERIFY_WRITE
, target_addr
, len
, 0);
1448 return -TARGET_EFAULT
;
1449 memcpy(target_saddr
, addr
, len
);
1450 if (len
>= offsetof(struct target_sockaddr
, sa_family
) +
1451 sizeof(target_saddr
->sa_family
)) {
1452 target_saddr
->sa_family
= tswap16(addr
->sa_family
);
1454 if (addr
->sa_family
== AF_NETLINK
&& len
>= sizeof(struct sockaddr_nl
)) {
1455 struct sockaddr_nl
*target_nl
= (struct sockaddr_nl
*)target_saddr
;
1456 target_nl
->nl_pid
= tswap32(target_nl
->nl_pid
);
1457 target_nl
->nl_groups
= tswap32(target_nl
->nl_groups
);
1458 } else if (addr
->sa_family
== AF_PACKET
) {
1459 struct sockaddr_ll
*target_ll
= (struct sockaddr_ll
*)target_saddr
;
1460 target_ll
->sll_ifindex
= tswap32(target_ll
->sll_ifindex
);
1461 target_ll
->sll_hatype
= tswap16(target_ll
->sll_hatype
);
1462 } else if (addr
->sa_family
== AF_INET6
&&
1463 len
>= sizeof(struct target_sockaddr_in6
)) {
1464 struct target_sockaddr_in6
*target_in6
=
1465 (struct target_sockaddr_in6
*)target_saddr
;
1466 target_in6
->sin6_scope_id
= tswap16(target_in6
->sin6_scope_id
);
1468 unlock_user(target_saddr
, target_addr
, len
);
1473 static inline abi_long
target_to_host_cmsg(struct msghdr
*msgh
,
1474 struct target_msghdr
*target_msgh
)
1476 struct cmsghdr
*cmsg
= CMSG_FIRSTHDR(msgh
);
1477 abi_long msg_controllen
;
1478 abi_ulong target_cmsg_addr
;
1479 struct target_cmsghdr
*target_cmsg
, *target_cmsg_start
;
1480 socklen_t space
= 0;
1482 msg_controllen
= tswapal(target_msgh
->msg_controllen
);
1483 if (msg_controllen
< sizeof (struct target_cmsghdr
))
1485 target_cmsg_addr
= tswapal(target_msgh
->msg_control
);
1486 target_cmsg
= lock_user(VERIFY_READ
, target_cmsg_addr
, msg_controllen
, 1);
1487 target_cmsg_start
= target_cmsg
;
1489 return -TARGET_EFAULT
;
1491 while (cmsg
&& target_cmsg
) {
1492 void *data
= CMSG_DATA(cmsg
);
1493 void *target_data
= TARGET_CMSG_DATA(target_cmsg
);
1495 int len
= tswapal(target_cmsg
->cmsg_len
)
1496 - sizeof(struct target_cmsghdr
);
1498 space
+= CMSG_SPACE(len
);
1499 if (space
> msgh
->msg_controllen
) {
1500 space
-= CMSG_SPACE(len
);
1501 /* This is a QEMU bug, since we allocated the payload
1502 * area ourselves (unlike overflow in host-to-target
1503 * conversion, which is just the guest giving us a buffer
1504 * that's too small). It can't happen for the payload types
1505 * we currently support; if it becomes an issue in future
1506 * we would need to improve our allocation strategy to
1507 * something more intelligent than "twice the size of the
1508 * target buffer we're reading from".
1510 gemu_log("Host cmsg overflow\n");
1514 if (tswap32(target_cmsg
->cmsg_level
) == TARGET_SOL_SOCKET
) {
1515 cmsg
->cmsg_level
= SOL_SOCKET
;
1517 cmsg
->cmsg_level
= tswap32(target_cmsg
->cmsg_level
);
1519 cmsg
->cmsg_type
= tswap32(target_cmsg
->cmsg_type
);
1520 cmsg
->cmsg_len
= CMSG_LEN(len
);
1522 if (cmsg
->cmsg_level
== SOL_SOCKET
&& cmsg
->cmsg_type
== SCM_RIGHTS
) {
1523 int *fd
= (int *)data
;
1524 int *target_fd
= (int *)target_data
;
1525 int i
, numfds
= len
/ sizeof(int);
1527 for (i
= 0; i
< numfds
; i
++) {
1528 __get_user(fd
[i
], target_fd
+ i
);
1530 } else if (cmsg
->cmsg_level
== SOL_SOCKET
1531 && cmsg
->cmsg_type
== SCM_CREDENTIALS
) {
1532 struct ucred
*cred
= (struct ucred
*)data
;
1533 struct target_ucred
*target_cred
=
1534 (struct target_ucred
*)target_data
;
1536 __get_user(cred
->pid
, &target_cred
->pid
);
1537 __get_user(cred
->uid
, &target_cred
->uid
);
1538 __get_user(cred
->gid
, &target_cred
->gid
);
1540 gemu_log("Unsupported ancillary data: %d/%d\n",
1541 cmsg
->cmsg_level
, cmsg
->cmsg_type
);
1542 memcpy(data
, target_data
, len
);
1545 cmsg
= CMSG_NXTHDR(msgh
, cmsg
);
1546 target_cmsg
= TARGET_CMSG_NXTHDR(target_msgh
, target_cmsg
,
1549 unlock_user(target_cmsg
, target_cmsg_addr
, 0);
1551 msgh
->msg_controllen
= space
;
1555 static inline abi_long
host_to_target_cmsg(struct target_msghdr
*target_msgh
,
1556 struct msghdr
*msgh
)
1558 struct cmsghdr
*cmsg
= CMSG_FIRSTHDR(msgh
);
1559 abi_long msg_controllen
;
1560 abi_ulong target_cmsg_addr
;
1561 struct target_cmsghdr
*target_cmsg
, *target_cmsg_start
;
1562 socklen_t space
= 0;
1564 msg_controllen
= tswapal(target_msgh
->msg_controllen
);
1565 if (msg_controllen
< sizeof (struct target_cmsghdr
))
1567 target_cmsg_addr
= tswapal(target_msgh
->msg_control
);
1568 target_cmsg
= lock_user(VERIFY_WRITE
, target_cmsg_addr
, msg_controllen
, 0);
1569 target_cmsg_start
= target_cmsg
;
1571 return -TARGET_EFAULT
;
1573 while (cmsg
&& target_cmsg
) {
1574 void *data
= CMSG_DATA(cmsg
);
1575 void *target_data
= TARGET_CMSG_DATA(target_cmsg
);
1577 int len
= cmsg
->cmsg_len
- sizeof(struct cmsghdr
);
1578 int tgt_len
, tgt_space
;
1580 /* We never copy a half-header but may copy half-data;
1581 * this is Linux's behaviour in put_cmsg(). Note that
1582 * truncation here is a guest problem (which we report
1583 * to the guest via the CTRUNC bit), unlike truncation
1584 * in target_to_host_cmsg, which is a QEMU bug.
1586 if (msg_controllen
< sizeof(struct target_cmsghdr
)) {
1587 target_msgh
->msg_flags
|= tswap32(MSG_CTRUNC
);
1591 if (cmsg
->cmsg_level
== SOL_SOCKET
) {
1592 target_cmsg
->cmsg_level
= tswap32(TARGET_SOL_SOCKET
);
1594 target_cmsg
->cmsg_level
= tswap32(cmsg
->cmsg_level
);
1596 target_cmsg
->cmsg_type
= tswap32(cmsg
->cmsg_type
);
1598 /* Payload types which need a different size of payload on
1599 * the target must adjust tgt_len here.
1602 switch (cmsg
->cmsg_level
) {
1604 switch (cmsg
->cmsg_type
) {
1606 tgt_len
= sizeof(struct target_timeval
);
1616 if (msg_controllen
< TARGET_CMSG_LEN(tgt_len
)) {
1617 target_msgh
->msg_flags
|= tswap32(MSG_CTRUNC
);
1618 tgt_len
= msg_controllen
- sizeof(struct target_cmsghdr
);
1621 /* We must now copy-and-convert len bytes of payload
1622 * into tgt_len bytes of destination space. Bear in mind
1623 * that in both source and destination we may be dealing
1624 * with a truncated value!
1626 switch (cmsg
->cmsg_level
) {
1628 switch (cmsg
->cmsg_type
) {
1631 int *fd
= (int *)data
;
1632 int *target_fd
= (int *)target_data
;
1633 int i
, numfds
= tgt_len
/ sizeof(int);
1635 for (i
= 0; i
< numfds
; i
++) {
1636 __put_user(fd
[i
], target_fd
+ i
);
1642 struct timeval
*tv
= (struct timeval
*)data
;
1643 struct target_timeval
*target_tv
=
1644 (struct target_timeval
*)target_data
;
1646 if (len
!= sizeof(struct timeval
) ||
1647 tgt_len
!= sizeof(struct target_timeval
)) {
1651 /* copy struct timeval to target */
1652 __put_user(tv
->tv_sec
, &target_tv
->tv_sec
);
1653 __put_user(tv
->tv_usec
, &target_tv
->tv_usec
);
1656 case SCM_CREDENTIALS
:
1658 struct ucred
*cred
= (struct ucred
*)data
;
1659 struct target_ucred
*target_cred
=
1660 (struct target_ucred
*)target_data
;
1662 __put_user(cred
->pid
, &target_cred
->pid
);
1663 __put_user(cred
->uid
, &target_cred
->uid
);
1664 __put_user(cred
->gid
, &target_cred
->gid
);
1673 switch (cmsg
->cmsg_type
) {
1676 uint32_t *v
= (uint32_t *)data
;
1677 uint32_t *t_int
= (uint32_t *)target_data
;
1679 if (len
!= sizeof(uint32_t) ||
1680 tgt_len
!= sizeof(uint32_t)) {
1683 __put_user(*v
, t_int
);
1689 struct sock_extended_err ee
;
1690 struct sockaddr_in offender
;
1692 struct errhdr_t
*errh
= (struct errhdr_t
*)data
;
1693 struct errhdr_t
*target_errh
=
1694 (struct errhdr_t
*)target_data
;
1696 if (len
!= sizeof(struct errhdr_t
) ||
1697 tgt_len
!= sizeof(struct errhdr_t
)) {
1700 __put_user(errh
->ee
.ee_errno
, &target_errh
->ee
.ee_errno
);
1701 __put_user(errh
->ee
.ee_origin
, &target_errh
->ee
.ee_origin
);
1702 __put_user(errh
->ee
.ee_type
, &target_errh
->ee
.ee_type
);
1703 __put_user(errh
->ee
.ee_code
, &target_errh
->ee
.ee_code
);
1704 __put_user(errh
->ee
.ee_pad
, &target_errh
->ee
.ee_pad
);
1705 __put_user(errh
->ee
.ee_info
, &target_errh
->ee
.ee_info
);
1706 __put_user(errh
->ee
.ee_data
, &target_errh
->ee
.ee_data
);
1707 host_to_target_sockaddr((unsigned long) &target_errh
->offender
,
1708 (void *) &errh
->offender
, sizeof(errh
->offender
));
1717 switch (cmsg
->cmsg_type
) {
1720 uint32_t *v
= (uint32_t *)data
;
1721 uint32_t *t_int
= (uint32_t *)target_data
;
1723 if (len
!= sizeof(uint32_t) ||
1724 tgt_len
!= sizeof(uint32_t)) {
1727 __put_user(*v
, t_int
);
1733 struct sock_extended_err ee
;
1734 struct sockaddr_in6 offender
;
1736 struct errhdr6_t
*errh
= (struct errhdr6_t
*)data
;
1737 struct errhdr6_t
*target_errh
=
1738 (struct errhdr6_t
*)target_data
;
1740 if (len
!= sizeof(struct errhdr6_t
) ||
1741 tgt_len
!= sizeof(struct errhdr6_t
)) {
1744 __put_user(errh
->ee
.ee_errno
, &target_errh
->ee
.ee_errno
);
1745 __put_user(errh
->ee
.ee_origin
, &target_errh
->ee
.ee_origin
);
1746 __put_user(errh
->ee
.ee_type
, &target_errh
->ee
.ee_type
);
1747 __put_user(errh
->ee
.ee_code
, &target_errh
->ee
.ee_code
);
1748 __put_user(errh
->ee
.ee_pad
, &target_errh
->ee
.ee_pad
);
1749 __put_user(errh
->ee
.ee_info
, &target_errh
->ee
.ee_info
);
1750 __put_user(errh
->ee
.ee_data
, &target_errh
->ee
.ee_data
);
1751 host_to_target_sockaddr((unsigned long) &target_errh
->offender
,
1752 (void *) &errh
->offender
, sizeof(errh
->offender
));
1762 gemu_log("Unsupported ancillary data: %d/%d\n",
1763 cmsg
->cmsg_level
, cmsg
->cmsg_type
);
1764 memcpy(target_data
, data
, MIN(len
, tgt_len
));
1765 if (tgt_len
> len
) {
1766 memset(target_data
+ len
, 0, tgt_len
- len
);
1770 target_cmsg
->cmsg_len
= tswapal(TARGET_CMSG_LEN(tgt_len
));
1771 tgt_space
= TARGET_CMSG_SPACE(tgt_len
);
1772 if (msg_controllen
< tgt_space
) {
1773 tgt_space
= msg_controllen
;
1775 msg_controllen
-= tgt_space
;
1777 cmsg
= CMSG_NXTHDR(msgh
, cmsg
);
1778 target_cmsg
= TARGET_CMSG_NXTHDR(target_msgh
, target_cmsg
,
1781 unlock_user(target_cmsg
, target_cmsg_addr
, space
);
1783 target_msgh
->msg_controllen
= tswapal(space
);
1787 /* do_setsockopt() Must return target values and target errnos. */
1788 static abi_long
do_setsockopt(int sockfd
, int level
, int optname
,
1789 abi_ulong optval_addr
, socklen_t optlen
)
1793 struct ip_mreqn
*ip_mreq
;
1794 struct ip_mreq_source
*ip_mreq_source
;
1798 /* TCP options all take an 'int' value. */
1799 if (optlen
< sizeof(uint32_t))
1800 return -TARGET_EINVAL
;
1802 if (get_user_u32(val
, optval_addr
))
1803 return -TARGET_EFAULT
;
1804 ret
= get_errno(setsockopt(sockfd
, level
, optname
, &val
, sizeof(val
)));
1811 case IP_ROUTER_ALERT
:
1815 case IP_MTU_DISCOVER
:
1822 case IP_MULTICAST_TTL
:
1823 case IP_MULTICAST_LOOP
:
1825 if (optlen
>= sizeof(uint32_t)) {
1826 if (get_user_u32(val
, optval_addr
))
1827 return -TARGET_EFAULT
;
1828 } else if (optlen
>= 1) {
1829 if (get_user_u8(val
, optval_addr
))
1830 return -TARGET_EFAULT
;
1832 ret
= get_errno(setsockopt(sockfd
, level
, optname
, &val
, sizeof(val
)));
1834 case IP_ADD_MEMBERSHIP
:
1835 case IP_DROP_MEMBERSHIP
:
1836 if (optlen
< sizeof (struct target_ip_mreq
) ||
1837 optlen
> sizeof (struct target_ip_mreqn
))
1838 return -TARGET_EINVAL
;
1840 ip_mreq
= (struct ip_mreqn
*) alloca(optlen
);
1841 target_to_host_ip_mreq(ip_mreq
, optval_addr
, optlen
);
1842 ret
= get_errno(setsockopt(sockfd
, level
, optname
, ip_mreq
, optlen
));
1845 case IP_BLOCK_SOURCE
:
1846 case IP_UNBLOCK_SOURCE
:
1847 case IP_ADD_SOURCE_MEMBERSHIP
:
1848 case IP_DROP_SOURCE_MEMBERSHIP
:
1849 if (optlen
!= sizeof (struct target_ip_mreq_source
))
1850 return -TARGET_EINVAL
;
1852 ip_mreq_source
= lock_user(VERIFY_READ
, optval_addr
, optlen
, 1);
1853 ret
= get_errno(setsockopt(sockfd
, level
, optname
, ip_mreq_source
, optlen
));
1854 unlock_user (ip_mreq_source
, optval_addr
, 0);
1863 case IPV6_MTU_DISCOVER
:
1866 case IPV6_RECVPKTINFO
:
1867 case IPV6_UNICAST_HOPS
:
1868 case IPV6_MULTICAST_HOPS
:
1869 case IPV6_MULTICAST_LOOP
:
1871 case IPV6_RECVHOPLIMIT
:
1872 case IPV6_2292HOPLIMIT
:
1875 if (optlen
< sizeof(uint32_t)) {
1876 return -TARGET_EINVAL
;
1878 if (get_user_u32(val
, optval_addr
)) {
1879 return -TARGET_EFAULT
;
1881 ret
= get_errno(setsockopt(sockfd
, level
, optname
,
1882 &val
, sizeof(val
)));
1886 struct in6_pktinfo pki
;
1888 if (optlen
< sizeof(pki
)) {
1889 return -TARGET_EINVAL
;
1892 if (copy_from_user(&pki
, optval_addr
, sizeof(pki
))) {
1893 return -TARGET_EFAULT
;
1896 pki
.ipi6_ifindex
= tswap32(pki
.ipi6_ifindex
);
1898 ret
= get_errno(setsockopt(sockfd
, level
, optname
,
1899 &pki
, sizeof(pki
)));
1910 struct icmp6_filter icmp6f
;
1912 if (optlen
> sizeof(icmp6f
)) {
1913 optlen
= sizeof(icmp6f
);
1916 if (copy_from_user(&icmp6f
, optval_addr
, optlen
)) {
1917 return -TARGET_EFAULT
;
1920 for (val
= 0; val
< 8; val
++) {
1921 icmp6f
.data
[val
] = tswap32(icmp6f
.data
[val
]);
1924 ret
= get_errno(setsockopt(sockfd
, level
, optname
,
1936 /* those take an u32 value */
1937 if (optlen
< sizeof(uint32_t)) {
1938 return -TARGET_EINVAL
;
1941 if (get_user_u32(val
, optval_addr
)) {
1942 return -TARGET_EFAULT
;
1944 ret
= get_errno(setsockopt(sockfd
, level
, optname
,
1945 &val
, sizeof(val
)));
1952 case TARGET_SOL_SOCKET
:
1954 case TARGET_SO_RCVTIMEO
:
1958 optname
= SO_RCVTIMEO
;
1961 if (optlen
!= sizeof(struct target_timeval
)) {
1962 return -TARGET_EINVAL
;
1965 if (copy_from_user_timeval(&tv
, optval_addr
)) {
1966 return -TARGET_EFAULT
;
1969 ret
= get_errno(setsockopt(sockfd
, SOL_SOCKET
, optname
,
1973 case TARGET_SO_SNDTIMEO
:
1974 optname
= SO_SNDTIMEO
;
1976 case TARGET_SO_ATTACH_FILTER
:
1978 struct target_sock_fprog
*tfprog
;
1979 struct target_sock_filter
*tfilter
;
1980 struct sock_fprog fprog
;
1981 struct sock_filter
*filter
;
1984 if (optlen
!= sizeof(*tfprog
)) {
1985 return -TARGET_EINVAL
;
1987 if (!lock_user_struct(VERIFY_READ
, tfprog
, optval_addr
, 0)) {
1988 return -TARGET_EFAULT
;
1990 if (!lock_user_struct(VERIFY_READ
, tfilter
,
1991 tswapal(tfprog
->filter
), 0)) {
1992 unlock_user_struct(tfprog
, optval_addr
, 1);
1993 return -TARGET_EFAULT
;
1996 fprog
.len
= tswap16(tfprog
->len
);
1997 filter
= g_try_new(struct sock_filter
, fprog
.len
);
1998 if (filter
== NULL
) {
1999 unlock_user_struct(tfilter
, tfprog
->filter
, 1);
2000 unlock_user_struct(tfprog
, optval_addr
, 1);
2001 return -TARGET_ENOMEM
;
2003 for (i
= 0; i
< fprog
.len
; i
++) {
2004 filter
[i
].code
= tswap16(tfilter
[i
].code
);
2005 filter
[i
].jt
= tfilter
[i
].jt
;
2006 filter
[i
].jf
= tfilter
[i
].jf
;
2007 filter
[i
].k
= tswap32(tfilter
[i
].k
);
2009 fprog
.filter
= filter
;
2011 ret
= get_errno(setsockopt(sockfd
, SOL_SOCKET
,
2012 SO_ATTACH_FILTER
, &fprog
, sizeof(fprog
)));
2015 unlock_user_struct(tfilter
, tfprog
->filter
, 1);
2016 unlock_user_struct(tfprog
, optval_addr
, 1);
2019 case TARGET_SO_BINDTODEVICE
:
2021 char *dev_ifname
, *addr_ifname
;
2023 if (optlen
> IFNAMSIZ
- 1) {
2024 optlen
= IFNAMSIZ
- 1;
2026 dev_ifname
= lock_user(VERIFY_READ
, optval_addr
, optlen
, 1);
2028 return -TARGET_EFAULT
;
2030 optname
= SO_BINDTODEVICE
;
2031 addr_ifname
= alloca(IFNAMSIZ
);
2032 memcpy(addr_ifname
, dev_ifname
, optlen
);
2033 addr_ifname
[optlen
] = 0;
2034 ret
= get_errno(setsockopt(sockfd
, SOL_SOCKET
, optname
,
2035 addr_ifname
, optlen
));
2036 unlock_user (dev_ifname
, optval_addr
, 0);
2039 case TARGET_SO_LINGER
:
2042 struct target_linger
*tlg
;
2044 if (optlen
!= sizeof(struct target_linger
)) {
2045 return -TARGET_EINVAL
;
2047 if (!lock_user_struct(VERIFY_READ
, tlg
, optval_addr
, 1)) {
2048 return -TARGET_EFAULT
;
2050 __get_user(lg
.l_onoff
, &tlg
->l_onoff
);
2051 __get_user(lg
.l_linger
, &tlg
->l_linger
);
2052 ret
= get_errno(setsockopt(sockfd
, SOL_SOCKET
, SO_LINGER
,
2054 unlock_user_struct(tlg
, optval_addr
, 0);
2057 /* Options with 'int' argument. */
2058 case TARGET_SO_DEBUG
:
2061 case TARGET_SO_REUSEADDR
:
2062 optname
= SO_REUSEADDR
;
2065 case TARGET_SO_REUSEPORT
:
2066 optname
= SO_REUSEPORT
;
2069 case TARGET_SO_TYPE
:
2072 case TARGET_SO_ERROR
:
2075 case TARGET_SO_DONTROUTE
:
2076 optname
= SO_DONTROUTE
;
2078 case TARGET_SO_BROADCAST
:
2079 optname
= SO_BROADCAST
;
2081 case TARGET_SO_SNDBUF
:
2082 optname
= SO_SNDBUF
;
2084 case TARGET_SO_SNDBUFFORCE
:
2085 optname
= SO_SNDBUFFORCE
;
2087 case TARGET_SO_RCVBUF
:
2088 optname
= SO_RCVBUF
;
2090 case TARGET_SO_RCVBUFFORCE
:
2091 optname
= SO_RCVBUFFORCE
;
2093 case TARGET_SO_KEEPALIVE
:
2094 optname
= SO_KEEPALIVE
;
2096 case TARGET_SO_OOBINLINE
:
2097 optname
= SO_OOBINLINE
;
2099 case TARGET_SO_NO_CHECK
:
2100 optname
= SO_NO_CHECK
;
2102 case TARGET_SO_PRIORITY
:
2103 optname
= SO_PRIORITY
;
2106 case TARGET_SO_BSDCOMPAT
:
2107 optname
= SO_BSDCOMPAT
;
2110 case TARGET_SO_PASSCRED
:
2111 optname
= SO_PASSCRED
;
2113 case TARGET_SO_PASSSEC
:
2114 optname
= SO_PASSSEC
;
2116 case TARGET_SO_TIMESTAMP
:
2117 optname
= SO_TIMESTAMP
;
2119 case TARGET_SO_RCVLOWAT
:
2120 optname
= SO_RCVLOWAT
;
2125 if (optlen
< sizeof(uint32_t))
2126 return -TARGET_EINVAL
;
2128 if (get_user_u32(val
, optval_addr
))
2129 return -TARGET_EFAULT
;
2130 ret
= get_errno(setsockopt(sockfd
, SOL_SOCKET
, optname
, &val
, sizeof(val
)));
2134 gemu_log("Unsupported setsockopt level=%d optname=%d\n", level
, optname
);
2135 ret
= -TARGET_ENOPROTOOPT
;
2140 /* do_getsockopt() Must return target values and target errnos. */
2141 static abi_long
do_getsockopt(int sockfd
, int level
, int optname
,
2142 abi_ulong optval_addr
, abi_ulong optlen
)
2149 case TARGET_SOL_SOCKET
:
2152 /* These don't just return a single integer */
2153 case TARGET_SO_RCVTIMEO
:
2154 case TARGET_SO_SNDTIMEO
:
2155 case TARGET_SO_PEERNAME
:
2157 case TARGET_SO_PEERCRED
: {
2160 struct target_ucred
*tcr
;
2162 if (get_user_u32(len
, optlen
)) {
2163 return -TARGET_EFAULT
;
2166 return -TARGET_EINVAL
;
2170 ret
= get_errno(getsockopt(sockfd
, level
, SO_PEERCRED
,
2178 if (!lock_user_struct(VERIFY_WRITE
, tcr
, optval_addr
, 0)) {
2179 return -TARGET_EFAULT
;
2181 __put_user(cr
.pid
, &tcr
->pid
);
2182 __put_user(cr
.uid
, &tcr
->uid
);
2183 __put_user(cr
.gid
, &tcr
->gid
);
2184 unlock_user_struct(tcr
, optval_addr
, 1);
2185 if (put_user_u32(len
, optlen
)) {
2186 return -TARGET_EFAULT
;
2190 case TARGET_SO_LINGER
:
2194 struct target_linger
*tlg
;
2196 if (get_user_u32(len
, optlen
)) {
2197 return -TARGET_EFAULT
;
2200 return -TARGET_EINVAL
;
2204 ret
= get_errno(getsockopt(sockfd
, level
, SO_LINGER
,
2212 if (!lock_user_struct(VERIFY_WRITE
, tlg
, optval_addr
, 0)) {
2213 return -TARGET_EFAULT
;
2215 __put_user(lg
.l_onoff
, &tlg
->l_onoff
);
2216 __put_user(lg
.l_linger
, &tlg
->l_linger
);
2217 unlock_user_struct(tlg
, optval_addr
, 1);
2218 if (put_user_u32(len
, optlen
)) {
2219 return -TARGET_EFAULT
;
2223 /* Options with 'int' argument. */
2224 case TARGET_SO_DEBUG
:
2227 case TARGET_SO_REUSEADDR
:
2228 optname
= SO_REUSEADDR
;
2231 case TARGET_SO_REUSEPORT
:
2232 optname
= SO_REUSEPORT
;
2235 case TARGET_SO_TYPE
:
2238 case TARGET_SO_ERROR
:
2241 case TARGET_SO_DONTROUTE
:
2242 optname
= SO_DONTROUTE
;
2244 case TARGET_SO_BROADCAST
:
2245 optname
= SO_BROADCAST
;
2247 case TARGET_SO_SNDBUF
:
2248 optname
= SO_SNDBUF
;
2250 case TARGET_SO_RCVBUF
:
2251 optname
= SO_RCVBUF
;
2253 case TARGET_SO_KEEPALIVE
:
2254 optname
= SO_KEEPALIVE
;
2256 case TARGET_SO_OOBINLINE
:
2257 optname
= SO_OOBINLINE
;
2259 case TARGET_SO_NO_CHECK
:
2260 optname
= SO_NO_CHECK
;
2262 case TARGET_SO_PRIORITY
:
2263 optname
= SO_PRIORITY
;
2266 case TARGET_SO_BSDCOMPAT
:
2267 optname
= SO_BSDCOMPAT
;
2270 case TARGET_SO_PASSCRED
:
2271 optname
= SO_PASSCRED
;
2273 case TARGET_SO_TIMESTAMP
:
2274 optname
= SO_TIMESTAMP
;
2276 case TARGET_SO_RCVLOWAT
:
2277 optname
= SO_RCVLOWAT
;
2279 case TARGET_SO_ACCEPTCONN
:
2280 optname
= SO_ACCEPTCONN
;
2287 /* TCP options all take an 'int' value. */
2289 if (get_user_u32(len
, optlen
))
2290 return -TARGET_EFAULT
;
2292 return -TARGET_EINVAL
;
2294 ret
= get_errno(getsockopt(sockfd
, level
, optname
, &val
, &lv
));
2297 if (optname
== SO_TYPE
) {
2298 val
= host_to_target_sock_type(val
);
2303 if (put_user_u32(val
, optval_addr
))
2304 return -TARGET_EFAULT
;
2306 if (put_user_u8(val
, optval_addr
))
2307 return -TARGET_EFAULT
;
2309 if (put_user_u32(len
, optlen
))
2310 return -TARGET_EFAULT
;
2317 case IP_ROUTER_ALERT
:
2321 case IP_MTU_DISCOVER
:
2327 case IP_MULTICAST_TTL
:
2328 case IP_MULTICAST_LOOP
:
2329 if (get_user_u32(len
, optlen
))
2330 return -TARGET_EFAULT
;
2332 return -TARGET_EINVAL
;
2334 ret
= get_errno(getsockopt(sockfd
, level
, optname
, &val
, &lv
));
2337 if (len
< sizeof(int) && len
> 0 && val
>= 0 && val
< 255) {
2339 if (put_user_u32(len
, optlen
)
2340 || put_user_u8(val
, optval_addr
))
2341 return -TARGET_EFAULT
;
2343 if (len
> sizeof(int))
2345 if (put_user_u32(len
, optlen
)
2346 || put_user_u32(val
, optval_addr
))
2347 return -TARGET_EFAULT
;
2351 ret
= -TARGET_ENOPROTOOPT
;
2357 case IPV6_MTU_DISCOVER
:
2360 case IPV6_RECVPKTINFO
:
2361 case IPV6_UNICAST_HOPS
:
2362 case IPV6_MULTICAST_HOPS
:
2363 case IPV6_MULTICAST_LOOP
:
2365 case IPV6_RECVHOPLIMIT
:
2366 case IPV6_2292HOPLIMIT
:
2368 if (get_user_u32(len
, optlen
))
2369 return -TARGET_EFAULT
;
2371 return -TARGET_EINVAL
;
2373 ret
= get_errno(getsockopt(sockfd
, level
, optname
, &val
, &lv
));
2376 if (len
< sizeof(int) && len
> 0 && val
>= 0 && val
< 255) {
2378 if (put_user_u32(len
, optlen
)
2379 || put_user_u8(val
, optval_addr
))
2380 return -TARGET_EFAULT
;
2382 if (len
> sizeof(int))
2384 if (put_user_u32(len
, optlen
)
2385 || put_user_u32(val
, optval_addr
))
2386 return -TARGET_EFAULT
;
2390 ret
= -TARGET_ENOPROTOOPT
;
2396 gemu_log("getsockopt level=%d optname=%d not yet supported\n",
2398 ret
= -TARGET_EOPNOTSUPP
;
2404 /* Convert target low/high pair representing file offset into the host
2405 * low/high pair. This function doesn't handle offsets bigger than 64 bits
2406 * as the kernel doesn't handle them either.
2408 static void target_to_host_low_high(abi_ulong tlow
,
2410 unsigned long *hlow
,
2411 unsigned long *hhigh
)
2413 uint64_t off
= tlow
|
2414 ((unsigned long long)thigh
<< TARGET_LONG_BITS
/ 2) <<
2415 TARGET_LONG_BITS
/ 2;
2418 *hhigh
= (off
>> HOST_LONG_BITS
/ 2) >> HOST_LONG_BITS
/ 2;
2421 static struct iovec
*lock_iovec(int type
, abi_ulong target_addr
,
2422 abi_ulong count
, int copy
)
2424 struct target_iovec
*target_vec
;
2426 abi_ulong total_len
, max_len
;
2429 bool bad_address
= false;
2435 if (count
> IOV_MAX
) {
2440 vec
= g_try_new0(struct iovec
, count
);
2446 target_vec
= lock_user(VERIFY_READ
, target_addr
,
2447 count
* sizeof(struct target_iovec
), 1);
2448 if (target_vec
== NULL
) {
2453 /* ??? If host page size > target page size, this will result in a
2454 value larger than what we can actually support. */
2455 max_len
= 0x7fffffff & TARGET_PAGE_MASK
;
2458 for (i
= 0; i
< count
; i
++) {
2459 abi_ulong base
= tswapal(target_vec
[i
].iov_base
);
2460 abi_long len
= tswapal(target_vec
[i
].iov_len
);
2465 } else if (len
== 0) {
2466 /* Zero length pointer is ignored. */
2467 vec
[i
].iov_base
= 0;
2469 vec
[i
].iov_base
= lock_user(type
, base
, len
, copy
);
2470 /* If the first buffer pointer is bad, this is a fault. But
2471 * subsequent bad buffers will result in a partial write; this
2472 * is realized by filling the vector with null pointers and
2474 if (!vec
[i
].iov_base
) {
2485 if (len
> max_len
- total_len
) {
2486 len
= max_len
- total_len
;
2489 vec
[i
].iov_len
= len
;
2493 unlock_user(target_vec
, target_addr
, 0);
2498 if (tswapal(target_vec
[i
].iov_len
) > 0) {
2499 unlock_user(vec
[i
].iov_base
, tswapal(target_vec
[i
].iov_base
), 0);
2502 unlock_user(target_vec
, target_addr
, 0);
2509 static void unlock_iovec(struct iovec
*vec
, abi_ulong target_addr
,
2510 abi_ulong count
, int copy
)
2512 struct target_iovec
*target_vec
;
2515 target_vec
= lock_user(VERIFY_READ
, target_addr
,
2516 count
* sizeof(struct target_iovec
), 1);
2518 for (i
= 0; i
< count
; i
++) {
2519 abi_ulong base
= tswapal(target_vec
[i
].iov_base
);
2520 abi_long len
= tswapal(target_vec
[i
].iov_len
);
2524 unlock_user(vec
[i
].iov_base
, base
, copy
? vec
[i
].iov_len
: 0);
2526 unlock_user(target_vec
, target_addr
, 0);
2532 static inline int target_to_host_sock_type(int *type
)
2535 int target_type
= *type
;
2537 switch (target_type
& TARGET_SOCK_TYPE_MASK
) {
2538 case TARGET_SOCK_DGRAM
:
2539 host_type
= SOCK_DGRAM
;
2541 case TARGET_SOCK_STREAM
:
2542 host_type
= SOCK_STREAM
;
2545 host_type
= target_type
& TARGET_SOCK_TYPE_MASK
;
2548 if (target_type
& TARGET_SOCK_CLOEXEC
) {
2549 #if defined(SOCK_CLOEXEC)
2550 host_type
|= SOCK_CLOEXEC
;
2552 return -TARGET_EINVAL
;
2555 if (target_type
& TARGET_SOCK_NONBLOCK
) {
2556 #if defined(SOCK_NONBLOCK)
2557 host_type
|= SOCK_NONBLOCK
;
2558 #elif !defined(O_NONBLOCK)
2559 return -TARGET_EINVAL
;
2566 /* Try to emulate socket type flags after socket creation. */
2567 static int sock_flags_fixup(int fd
, int target_type
)
2569 #if !defined(SOCK_NONBLOCK) && defined(O_NONBLOCK)
2570 if (target_type
& TARGET_SOCK_NONBLOCK
) {
2571 int flags
= fcntl(fd
, F_GETFL
);
2572 if (fcntl(fd
, F_SETFL
, O_NONBLOCK
| flags
) == -1) {
2574 return -TARGET_EINVAL
;
2581 /* do_socket() Must return target values and target errnos. */
2582 static abi_long
do_socket(int domain
, int type
, int protocol
)
2584 int target_type
= type
;
2587 ret
= target_to_host_sock_type(&type
);
2592 if (domain
== PF_NETLINK
&& !(
2593 #ifdef CONFIG_RTNETLINK
2594 protocol
== NETLINK_ROUTE
||
2596 protocol
== NETLINK_KOBJECT_UEVENT
||
2597 protocol
== NETLINK_AUDIT
)) {
2598 return -EPFNOSUPPORT
;
2601 if (domain
== AF_PACKET
||
2602 (domain
== AF_INET
&& type
== SOCK_PACKET
)) {
2603 protocol
= tswap16(protocol
);
2606 ret
= get_errno(socket(domain
, type
, protocol
));
2608 ret
= sock_flags_fixup(ret
, target_type
);
2609 if (type
== SOCK_PACKET
) {
2610 /* Manage an obsolete case :
2611 * if socket type is SOCK_PACKET, bind by name
2613 fd_trans_register(ret
, &target_packet_trans
);
2614 } else if (domain
== PF_NETLINK
) {
2616 #ifdef CONFIG_RTNETLINK
2618 fd_trans_register(ret
, &target_netlink_route_trans
);
2621 case NETLINK_KOBJECT_UEVENT
:
2622 /* nothing to do: messages are strings */
2625 fd_trans_register(ret
, &target_netlink_audit_trans
);
2628 g_assert_not_reached();
2635 /* do_bind() Must return target values and target errnos. */
2636 static abi_long
do_bind(int sockfd
, abi_ulong target_addr
,
2642 if ((int)addrlen
< 0) {
2643 return -TARGET_EINVAL
;
2646 addr
= alloca(addrlen
+1);
2648 ret
= target_to_host_sockaddr(sockfd
, addr
, target_addr
, addrlen
);
2652 return get_errno(bind(sockfd
, addr
, addrlen
));
2655 /* do_connect() Must return target values and target errnos. */
2656 static abi_long
do_connect(int sockfd
, abi_ulong target_addr
,
2662 if ((int)addrlen
< 0) {
2663 return -TARGET_EINVAL
;
2666 addr
= alloca(addrlen
+1);
2668 ret
= target_to_host_sockaddr(sockfd
, addr
, target_addr
, addrlen
);
2672 return get_errno(safe_connect(sockfd
, addr
, addrlen
));
2675 /* do_sendrecvmsg_locked() Must return target values and target errnos. */
2676 static abi_long
do_sendrecvmsg_locked(int fd
, struct target_msghdr
*msgp
,
2677 int flags
, int send
)
2683 abi_ulong target_vec
;
2685 if (msgp
->msg_name
) {
2686 msg
.msg_namelen
= tswap32(msgp
->msg_namelen
);
2687 msg
.msg_name
= alloca(msg
.msg_namelen
+1);
2688 ret
= target_to_host_sockaddr(fd
, msg
.msg_name
,
2689 tswapal(msgp
->msg_name
),
2691 if (ret
== -TARGET_EFAULT
) {
2692 /* For connected sockets msg_name and msg_namelen must
2693 * be ignored, so returning EFAULT immediately is wrong.
2694 * Instead, pass a bad msg_name to the host kernel, and
2695 * let it decide whether to return EFAULT or not.
2697 msg
.msg_name
= (void *)-1;
2702 msg
.msg_name
= NULL
;
2703 msg
.msg_namelen
= 0;
2705 msg
.msg_controllen
= 2 * tswapal(msgp
->msg_controllen
);
2706 msg
.msg_control
= alloca(msg
.msg_controllen
);
2707 memset(msg
.msg_control
, 0, msg
.msg_controllen
);
2709 msg
.msg_flags
= tswap32(msgp
->msg_flags
);
2711 count
= tswapal(msgp
->msg_iovlen
);
2712 target_vec
= tswapal(msgp
->msg_iov
);
2714 if (count
> IOV_MAX
) {
2715 /* sendrcvmsg returns a different errno for this condition than
2716 * readv/writev, so we must catch it here before lock_iovec() does.
2718 ret
= -TARGET_EMSGSIZE
;
2722 vec
= lock_iovec(send
? VERIFY_READ
: VERIFY_WRITE
,
2723 target_vec
, count
, send
);
2725 ret
= -host_to_target_errno(errno
);
2728 msg
.msg_iovlen
= count
;
2732 if (fd_trans_target_to_host_data(fd
)) {
2735 host_msg
= g_malloc(msg
.msg_iov
->iov_len
);
2736 memcpy(host_msg
, msg
.msg_iov
->iov_base
, msg
.msg_iov
->iov_len
);
2737 ret
= fd_trans_target_to_host_data(fd
)(host_msg
,
2738 msg
.msg_iov
->iov_len
);
2740 msg
.msg_iov
->iov_base
= host_msg
;
2741 ret
= get_errno(safe_sendmsg(fd
, &msg
, flags
));
2745 ret
= target_to_host_cmsg(&msg
, msgp
);
2747 ret
= get_errno(safe_sendmsg(fd
, &msg
, flags
));
2751 ret
= get_errno(safe_recvmsg(fd
, &msg
, flags
));
2752 if (!is_error(ret
)) {
2754 if (fd_trans_host_to_target_data(fd
)) {
2755 ret
= fd_trans_host_to_target_data(fd
)(msg
.msg_iov
->iov_base
,
2756 MIN(msg
.msg_iov
->iov_len
, len
));
2758 ret
= host_to_target_cmsg(msgp
, &msg
);
2760 if (!is_error(ret
)) {
2761 msgp
->msg_namelen
= tswap32(msg
.msg_namelen
);
2762 msgp
->msg_flags
= tswap32(msg
.msg_flags
);
2763 if (msg
.msg_name
!= NULL
&& msg
.msg_name
!= (void *)-1) {
2764 ret
= host_to_target_sockaddr(tswapal(msgp
->msg_name
),
2765 msg
.msg_name
, msg
.msg_namelen
);
2777 unlock_iovec(vec
, target_vec
, count
, !send
);
2782 static abi_long
do_sendrecvmsg(int fd
, abi_ulong target_msg
,
2783 int flags
, int send
)
2786 struct target_msghdr
*msgp
;
2788 if (!lock_user_struct(send
? VERIFY_READ
: VERIFY_WRITE
,
2792 return -TARGET_EFAULT
;
2794 ret
= do_sendrecvmsg_locked(fd
, msgp
, flags
, send
);
2795 unlock_user_struct(msgp
, target_msg
, send
? 0 : 1);
2799 /* We don't rely on the C library to have sendmmsg/recvmmsg support,
2800 * so it might not have this *mmsg-specific flag either.
2802 #ifndef MSG_WAITFORONE
2803 #define MSG_WAITFORONE 0x10000
2806 static abi_long
do_sendrecvmmsg(int fd
, abi_ulong target_msgvec
,
2807 unsigned int vlen
, unsigned int flags
,
2810 struct target_mmsghdr
*mmsgp
;
2814 if (vlen
> UIO_MAXIOV
) {
2818 mmsgp
= lock_user(VERIFY_WRITE
, target_msgvec
, sizeof(*mmsgp
) * vlen
, 1);
2820 return -TARGET_EFAULT
;
2823 for (i
= 0; i
< vlen
; i
++) {
2824 ret
= do_sendrecvmsg_locked(fd
, &mmsgp
[i
].msg_hdr
, flags
, send
);
2825 if (is_error(ret
)) {
2828 mmsgp
[i
].msg_len
= tswap32(ret
);
2829 /* MSG_WAITFORONE turns on MSG_DONTWAIT after one packet */
2830 if (flags
& MSG_WAITFORONE
) {
2831 flags
|= MSG_DONTWAIT
;
2835 unlock_user(mmsgp
, target_msgvec
, sizeof(*mmsgp
) * i
);
2837 /* Return number of datagrams sent if we sent any at all;
2838 * otherwise return the error.
2846 /* do_accept4() Must return target values and target errnos. */
2847 static abi_long
do_accept4(int fd
, abi_ulong target_addr
,
2848 abi_ulong target_addrlen_addr
, int flags
)
2850 socklen_t addrlen
, ret_addrlen
;
2855 host_flags
= target_to_host_bitmask(flags
, fcntl_flags_tbl
);
2857 if (target_addr
== 0) {
2858 return get_errno(safe_accept4(fd
, NULL
, NULL
, host_flags
));
2861 /* linux returns EINVAL if addrlen pointer is invalid */
2862 if (get_user_u32(addrlen
, target_addrlen_addr
))
2863 return -TARGET_EINVAL
;
2865 if ((int)addrlen
< 0) {
2866 return -TARGET_EINVAL
;
2869 if (!access_ok(VERIFY_WRITE
, target_addr
, addrlen
))
2870 return -TARGET_EINVAL
;
2872 addr
= alloca(addrlen
);
2874 ret_addrlen
= addrlen
;
2875 ret
= get_errno(safe_accept4(fd
, addr
, &ret_addrlen
, host_flags
));
2876 if (!is_error(ret
)) {
2877 host_to_target_sockaddr(target_addr
, addr
, MIN(addrlen
, ret_addrlen
));
2878 if (put_user_u32(ret_addrlen
, target_addrlen_addr
)) {
2879 ret
= -TARGET_EFAULT
;
2885 /* do_getpeername() Must return target values and target errnos. */
2886 static abi_long
do_getpeername(int fd
, abi_ulong target_addr
,
2887 abi_ulong target_addrlen_addr
)
2889 socklen_t addrlen
, ret_addrlen
;
2893 if (get_user_u32(addrlen
, target_addrlen_addr
))
2894 return -TARGET_EFAULT
;
2896 if ((int)addrlen
< 0) {
2897 return -TARGET_EINVAL
;
2900 if (!access_ok(VERIFY_WRITE
, target_addr
, addrlen
))
2901 return -TARGET_EFAULT
;
2903 addr
= alloca(addrlen
);
2905 ret_addrlen
= addrlen
;
2906 ret
= get_errno(getpeername(fd
, addr
, &ret_addrlen
));
2907 if (!is_error(ret
)) {
2908 host_to_target_sockaddr(target_addr
, addr
, MIN(addrlen
, ret_addrlen
));
2909 if (put_user_u32(ret_addrlen
, target_addrlen_addr
)) {
2910 ret
= -TARGET_EFAULT
;
2916 /* do_getsockname() Must return target values and target errnos. */
2917 static abi_long
do_getsockname(int fd
, abi_ulong target_addr
,
2918 abi_ulong target_addrlen_addr
)
2920 socklen_t addrlen
, ret_addrlen
;
2924 if (get_user_u32(addrlen
, target_addrlen_addr
))
2925 return -TARGET_EFAULT
;
2927 if ((int)addrlen
< 0) {
2928 return -TARGET_EINVAL
;
2931 if (!access_ok(VERIFY_WRITE
, target_addr
, addrlen
))
2932 return -TARGET_EFAULT
;
2934 addr
= alloca(addrlen
);
2936 ret_addrlen
= addrlen
;
2937 ret
= get_errno(getsockname(fd
, addr
, &ret_addrlen
));
2938 if (!is_error(ret
)) {
2939 host_to_target_sockaddr(target_addr
, addr
, MIN(addrlen
, ret_addrlen
));
2940 if (put_user_u32(ret_addrlen
, target_addrlen_addr
)) {
2941 ret
= -TARGET_EFAULT
;
2947 /* do_socketpair() Must return target values and target errnos. */
2948 static abi_long
do_socketpair(int domain
, int type
, int protocol
,
2949 abi_ulong target_tab_addr
)
2954 target_to_host_sock_type(&type
);
2956 ret
= get_errno(socketpair(domain
, type
, protocol
, tab
));
2957 if (!is_error(ret
)) {
2958 if (put_user_s32(tab
[0], target_tab_addr
)
2959 || put_user_s32(tab
[1], target_tab_addr
+ sizeof(tab
[0])))
2960 ret
= -TARGET_EFAULT
;
2965 /* do_sendto() Must return target values and target errnos. */
2966 static abi_long
do_sendto(int fd
, abi_ulong msg
, size_t len
, int flags
,
2967 abi_ulong target_addr
, socklen_t addrlen
)
2971 void *copy_msg
= NULL
;
2974 if ((int)addrlen
< 0) {
2975 return -TARGET_EINVAL
;
2978 host_msg
= lock_user(VERIFY_READ
, msg
, len
, 1);
2980 return -TARGET_EFAULT
;
2981 if (fd_trans_target_to_host_data(fd
)) {
2982 copy_msg
= host_msg
;
2983 host_msg
= g_malloc(len
);
2984 memcpy(host_msg
, copy_msg
, len
);
2985 ret
= fd_trans_target_to_host_data(fd
)(host_msg
, len
);
2991 addr
= alloca(addrlen
+1);
2992 ret
= target_to_host_sockaddr(fd
, addr
, target_addr
, addrlen
);
2996 ret
= get_errno(safe_sendto(fd
, host_msg
, len
, flags
, addr
, addrlen
));
2998 ret
= get_errno(safe_sendto(fd
, host_msg
, len
, flags
, NULL
, 0));
3003 host_msg
= copy_msg
;
3005 unlock_user(host_msg
, msg
, 0);
3009 /* do_recvfrom() Must return target values and target errnos. */
3010 static abi_long
do_recvfrom(int fd
, abi_ulong msg
, size_t len
, int flags
,
3011 abi_ulong target_addr
,
3012 abi_ulong target_addrlen
)
3014 socklen_t addrlen
, ret_addrlen
;
3019 host_msg
= lock_user(VERIFY_WRITE
, msg
, len
, 0);
3021 return -TARGET_EFAULT
;
3023 if (get_user_u32(addrlen
, target_addrlen
)) {
3024 ret
= -TARGET_EFAULT
;
3027 if ((int)addrlen
< 0) {
3028 ret
= -TARGET_EINVAL
;
3031 addr
= alloca(addrlen
);
3032 ret_addrlen
= addrlen
;
3033 ret
= get_errno(safe_recvfrom(fd
, host_msg
, len
, flags
,
3034 addr
, &ret_addrlen
));
3036 addr
= NULL
; /* To keep compiler quiet. */
3037 addrlen
= 0; /* To keep compiler quiet. */
3038 ret
= get_errno(safe_recvfrom(fd
, host_msg
, len
, flags
, NULL
, 0));
3040 if (!is_error(ret
)) {
3041 if (fd_trans_host_to_target_data(fd
)) {
3043 trans
= fd_trans_host_to_target_data(fd
)(host_msg
, MIN(ret
, len
));
3044 if (is_error(trans
)) {
3050 host_to_target_sockaddr(target_addr
, addr
,
3051 MIN(addrlen
, ret_addrlen
));
3052 if (put_user_u32(ret_addrlen
, target_addrlen
)) {
3053 ret
= -TARGET_EFAULT
;
3057 unlock_user(host_msg
, msg
, len
);
3060 unlock_user(host_msg
, msg
, 0);
3065 #ifdef TARGET_NR_socketcall
3066 /* do_socketcall() must return target values and target errnos. */
3067 static abi_long
do_socketcall(int num
, abi_ulong vptr
)
3069 static const unsigned nargs
[] = { /* number of arguments per operation */
3070 [TARGET_SYS_SOCKET
] = 3, /* domain, type, protocol */
3071 [TARGET_SYS_BIND
] = 3, /* fd, addr, addrlen */
3072 [TARGET_SYS_CONNECT
] = 3, /* fd, addr, addrlen */
3073 [TARGET_SYS_LISTEN
] = 2, /* fd, backlog */
3074 [TARGET_SYS_ACCEPT
] = 3, /* fd, addr, addrlen */
3075 [TARGET_SYS_GETSOCKNAME
] = 3, /* fd, addr, addrlen */
3076 [TARGET_SYS_GETPEERNAME
] = 3, /* fd, addr, addrlen */
3077 [TARGET_SYS_SOCKETPAIR
] = 4, /* domain, type, protocol, tab */
3078 [TARGET_SYS_SEND
] = 4, /* fd, msg, len, flags */
3079 [TARGET_SYS_RECV
] = 4, /* fd, msg, len, flags */
3080 [TARGET_SYS_SENDTO
] = 6, /* fd, msg, len, flags, addr, addrlen */
3081 [TARGET_SYS_RECVFROM
] = 6, /* fd, msg, len, flags, addr, addrlen */
3082 [TARGET_SYS_SHUTDOWN
] = 2, /* fd, how */
3083 [TARGET_SYS_SETSOCKOPT
] = 5, /* fd, level, optname, optval, optlen */
3084 [TARGET_SYS_GETSOCKOPT
] = 5, /* fd, level, optname, optval, optlen */
3085 [TARGET_SYS_SENDMSG
] = 3, /* fd, msg, flags */
3086 [TARGET_SYS_RECVMSG
] = 3, /* fd, msg, flags */
3087 [TARGET_SYS_ACCEPT4
] = 4, /* fd, addr, addrlen, flags */
3088 [TARGET_SYS_RECVMMSG
] = 4, /* fd, msgvec, vlen, flags */
3089 [TARGET_SYS_SENDMMSG
] = 4, /* fd, msgvec, vlen, flags */
3091 abi_long a
[6]; /* max 6 args */
3094 /* check the range of the first argument num */
3095 /* (TARGET_SYS_SENDMMSG is the highest among TARGET_SYS_xxx) */
3096 if (num
< 1 || num
> TARGET_SYS_SENDMMSG
) {
3097 return -TARGET_EINVAL
;
3099 /* ensure we have space for args */
3100 if (nargs
[num
] > ARRAY_SIZE(a
)) {
3101 return -TARGET_EINVAL
;
3103 /* collect the arguments in a[] according to nargs[] */
3104 for (i
= 0; i
< nargs
[num
]; ++i
) {
3105 if (get_user_ual(a
[i
], vptr
+ i
* sizeof(abi_long
)) != 0) {
3106 return -TARGET_EFAULT
;
3109 /* now when we have the args, invoke the appropriate underlying function */
3111 case TARGET_SYS_SOCKET
: /* domain, type, protocol */
3112 return do_socket(a
[0], a
[1], a
[2]);
3113 case TARGET_SYS_BIND
: /* sockfd, addr, addrlen */
3114 return do_bind(a
[0], a
[1], a
[2]);
3115 case TARGET_SYS_CONNECT
: /* sockfd, addr, addrlen */
3116 return do_connect(a
[0], a
[1], a
[2]);
3117 case TARGET_SYS_LISTEN
: /* sockfd, backlog */
3118 return get_errno(listen(a
[0], a
[1]));
3119 case TARGET_SYS_ACCEPT
: /* sockfd, addr, addrlen */
3120 return do_accept4(a
[0], a
[1], a
[2], 0);
3121 case TARGET_SYS_GETSOCKNAME
: /* sockfd, addr, addrlen */
3122 return do_getsockname(a
[0], a
[1], a
[2]);
3123 case TARGET_SYS_GETPEERNAME
: /* sockfd, addr, addrlen */
3124 return do_getpeername(a
[0], a
[1], a
[2]);
3125 case TARGET_SYS_SOCKETPAIR
: /* domain, type, protocol, tab */
3126 return do_socketpair(a
[0], a
[1], a
[2], a
[3]);
3127 case TARGET_SYS_SEND
: /* sockfd, msg, len, flags */
3128 return do_sendto(a
[0], a
[1], a
[2], a
[3], 0, 0);
3129 case TARGET_SYS_RECV
: /* sockfd, msg, len, flags */
3130 return do_recvfrom(a
[0], a
[1], a
[2], a
[3], 0, 0);
3131 case TARGET_SYS_SENDTO
: /* sockfd, msg, len, flags, addr, addrlen */
3132 return do_sendto(a
[0], a
[1], a
[2], a
[3], a
[4], a
[5]);
3133 case TARGET_SYS_RECVFROM
: /* sockfd, msg, len, flags, addr, addrlen */
3134 return do_recvfrom(a
[0], a
[1], a
[2], a
[3], a
[4], a
[5]);
3135 case TARGET_SYS_SHUTDOWN
: /* sockfd, how */
3136 return get_errno(shutdown(a
[0], a
[1]));
3137 case TARGET_SYS_SETSOCKOPT
: /* sockfd, level, optname, optval, optlen */
3138 return do_setsockopt(a
[0], a
[1], a
[2], a
[3], a
[4]);
3139 case TARGET_SYS_GETSOCKOPT
: /* sockfd, level, optname, optval, optlen */
3140 return do_getsockopt(a
[0], a
[1], a
[2], a
[3], a
[4]);
3141 case TARGET_SYS_SENDMSG
: /* sockfd, msg, flags */
3142 return do_sendrecvmsg(a
[0], a
[1], a
[2], 1);
3143 case TARGET_SYS_RECVMSG
: /* sockfd, msg, flags */
3144 return do_sendrecvmsg(a
[0], a
[1], a
[2], 0);
3145 case TARGET_SYS_ACCEPT4
: /* sockfd, addr, addrlen, flags */
3146 return do_accept4(a
[0], a
[1], a
[2], a
[3]);
3147 case TARGET_SYS_RECVMMSG
: /* sockfd, msgvec, vlen, flags */
3148 return do_sendrecvmmsg(a
[0], a
[1], a
[2], a
[3], 0);
3149 case TARGET_SYS_SENDMMSG
: /* sockfd, msgvec, vlen, flags */
3150 return do_sendrecvmmsg(a
[0], a
[1], a
[2], a
[3], 1);
3152 gemu_log("Unsupported socketcall: %d\n", num
);
3153 return -TARGET_EINVAL
;
3158 #define N_SHM_REGIONS 32
3160 static struct shm_region
{
3164 } shm_regions
[N_SHM_REGIONS
];
3166 #ifndef TARGET_SEMID64_DS
3167 /* asm-generic version of this struct */
3168 struct target_semid64_ds
3170 struct target_ipc_perm sem_perm
;
3171 abi_ulong sem_otime
;
3172 #if TARGET_ABI_BITS == 32
3173 abi_ulong __unused1
;
3175 abi_ulong sem_ctime
;
3176 #if TARGET_ABI_BITS == 32
3177 abi_ulong __unused2
;
3179 abi_ulong sem_nsems
;
3180 abi_ulong __unused3
;
3181 abi_ulong __unused4
;
3185 static inline abi_long
target_to_host_ipc_perm(struct ipc_perm
*host_ip
,
3186 abi_ulong target_addr
)
3188 struct target_ipc_perm
*target_ip
;
3189 struct target_semid64_ds
*target_sd
;
3191 if (!lock_user_struct(VERIFY_READ
, target_sd
, target_addr
, 1))
3192 return -TARGET_EFAULT
;
3193 target_ip
= &(target_sd
->sem_perm
);
3194 host_ip
->__key
= tswap32(target_ip
->__key
);
3195 host_ip
->uid
= tswap32(target_ip
->uid
);
3196 host_ip
->gid
= tswap32(target_ip
->gid
);
3197 host_ip
->cuid
= tswap32(target_ip
->cuid
);
3198 host_ip
->cgid
= tswap32(target_ip
->cgid
);
3199 #if defined(TARGET_ALPHA) || defined(TARGET_MIPS) || defined(TARGET_PPC)
3200 host_ip
->mode
= tswap32(target_ip
->mode
);
3202 host_ip
->mode
= tswap16(target_ip
->mode
);
3204 #if defined(TARGET_PPC)
3205 host_ip
->__seq
= tswap32(target_ip
->__seq
);
3207 host_ip
->__seq
= tswap16(target_ip
->__seq
);
3209 unlock_user_struct(target_sd
, target_addr
, 0);
3213 static inline abi_long
host_to_target_ipc_perm(abi_ulong target_addr
,
3214 struct ipc_perm
*host_ip
)
3216 struct target_ipc_perm
*target_ip
;
3217 struct target_semid64_ds
*target_sd
;
3219 if (!lock_user_struct(VERIFY_WRITE
, target_sd
, target_addr
, 0))
3220 return -TARGET_EFAULT
;
3221 target_ip
= &(target_sd
->sem_perm
);
3222 target_ip
->__key
= tswap32(host_ip
->__key
);
3223 target_ip
->uid
= tswap32(host_ip
->uid
);
3224 target_ip
->gid
= tswap32(host_ip
->gid
);
3225 target_ip
->cuid
= tswap32(host_ip
->cuid
);
3226 target_ip
->cgid
= tswap32(host_ip
->cgid
);
3227 #if defined(TARGET_ALPHA) || defined(TARGET_MIPS) || defined(TARGET_PPC)
3228 target_ip
->mode
= tswap32(host_ip
->mode
);
3230 target_ip
->mode
= tswap16(host_ip
->mode
);
3232 #if defined(TARGET_PPC)
3233 target_ip
->__seq
= tswap32(host_ip
->__seq
);
3235 target_ip
->__seq
= tswap16(host_ip
->__seq
);
3237 unlock_user_struct(target_sd
, target_addr
, 1);
3241 static inline abi_long
target_to_host_semid_ds(struct semid_ds
*host_sd
,
3242 abi_ulong target_addr
)
3244 struct target_semid64_ds
*target_sd
;
3246 if (!lock_user_struct(VERIFY_READ
, target_sd
, target_addr
, 1))
3247 return -TARGET_EFAULT
;
3248 if (target_to_host_ipc_perm(&(host_sd
->sem_perm
),target_addr
))
3249 return -TARGET_EFAULT
;
3250 host_sd
->sem_nsems
= tswapal(target_sd
->sem_nsems
);
3251 host_sd
->sem_otime
= tswapal(target_sd
->sem_otime
);
3252 host_sd
->sem_ctime
= tswapal(target_sd
->sem_ctime
);
3253 unlock_user_struct(target_sd
, target_addr
, 0);
3257 static inline abi_long
host_to_target_semid_ds(abi_ulong target_addr
,
3258 struct semid_ds
*host_sd
)
3260 struct target_semid64_ds
*target_sd
;
3262 if (!lock_user_struct(VERIFY_WRITE
, target_sd
, target_addr
, 0))
3263 return -TARGET_EFAULT
;
3264 if (host_to_target_ipc_perm(target_addr
,&(host_sd
->sem_perm
)))
3265 return -TARGET_EFAULT
;
3266 target_sd
->sem_nsems
= tswapal(host_sd
->sem_nsems
);
3267 target_sd
->sem_otime
= tswapal(host_sd
->sem_otime
);
3268 target_sd
->sem_ctime
= tswapal(host_sd
->sem_ctime
);
3269 unlock_user_struct(target_sd
, target_addr
, 1);
3273 struct target_seminfo
{
3286 static inline abi_long
host_to_target_seminfo(abi_ulong target_addr
,
3287 struct seminfo
*host_seminfo
)
3289 struct target_seminfo
*target_seminfo
;
3290 if (!lock_user_struct(VERIFY_WRITE
, target_seminfo
, target_addr
, 0))
3291 return -TARGET_EFAULT
;
3292 __put_user(host_seminfo
->semmap
, &target_seminfo
->semmap
);
3293 __put_user(host_seminfo
->semmni
, &target_seminfo
->semmni
);
3294 __put_user(host_seminfo
->semmns
, &target_seminfo
->semmns
);
3295 __put_user(host_seminfo
->semmnu
, &target_seminfo
->semmnu
);
3296 __put_user(host_seminfo
->semmsl
, &target_seminfo
->semmsl
);
3297 __put_user(host_seminfo
->semopm
, &target_seminfo
->semopm
);
3298 __put_user(host_seminfo
->semume
, &target_seminfo
->semume
);
3299 __put_user(host_seminfo
->semusz
, &target_seminfo
->semusz
);
3300 __put_user(host_seminfo
->semvmx
, &target_seminfo
->semvmx
);
3301 __put_user(host_seminfo
->semaem
, &target_seminfo
->semaem
);
3302 unlock_user_struct(target_seminfo
, target_addr
, 1);
3308 struct semid_ds
*buf
;
3309 unsigned short *array
;
3310 struct seminfo
*__buf
;
3313 union target_semun
{
3320 static inline abi_long
target_to_host_semarray(int semid
, unsigned short **host_array
,
3321 abi_ulong target_addr
)
3324 unsigned short *array
;
3326 struct semid_ds semid_ds
;
3329 semun
.buf
= &semid_ds
;
3331 ret
= semctl(semid
, 0, IPC_STAT
, semun
);
3333 return get_errno(ret
);
3335 nsems
= semid_ds
.sem_nsems
;
3337 *host_array
= g_try_new(unsigned short, nsems
);
3339 return -TARGET_ENOMEM
;
3341 array
= lock_user(VERIFY_READ
, target_addr
,
3342 nsems
*sizeof(unsigned short), 1);
3344 g_free(*host_array
);
3345 return -TARGET_EFAULT
;
3348 for(i
=0; i
<nsems
; i
++) {
3349 __get_user((*host_array
)[i
], &array
[i
]);
3351 unlock_user(array
, target_addr
, 0);
3356 static inline abi_long
host_to_target_semarray(int semid
, abi_ulong target_addr
,
3357 unsigned short **host_array
)
3360 unsigned short *array
;
3362 struct semid_ds semid_ds
;
3365 semun
.buf
= &semid_ds
;
3367 ret
= semctl(semid
, 0, IPC_STAT
, semun
);
3369 return get_errno(ret
);
3371 nsems
= semid_ds
.sem_nsems
;
3373 array
= lock_user(VERIFY_WRITE
, target_addr
,
3374 nsems
*sizeof(unsigned short), 0);
3376 return -TARGET_EFAULT
;
3378 for(i
=0; i
<nsems
; i
++) {
3379 __put_user((*host_array
)[i
], &array
[i
]);
3381 g_free(*host_array
);
3382 unlock_user(array
, target_addr
, 1);
3387 static inline abi_long
do_semctl(int semid
, int semnum
, int cmd
,
3388 abi_ulong target_arg
)
3390 union target_semun target_su
= { .buf
= target_arg
};
3392 struct semid_ds dsarg
;
3393 unsigned short *array
= NULL
;
3394 struct seminfo seminfo
;
3395 abi_long ret
= -TARGET_EINVAL
;
3402 /* In 64 bit cross-endian situations, we will erroneously pick up
3403 * the wrong half of the union for the "val" element. To rectify
3404 * this, the entire 8-byte structure is byteswapped, followed by
3405 * a swap of the 4 byte val field. In other cases, the data is
3406 * already in proper host byte order. */
3407 if (sizeof(target_su
.val
) != (sizeof(target_su
.buf
))) {
3408 target_su
.buf
= tswapal(target_su
.buf
);
3409 arg
.val
= tswap32(target_su
.val
);
3411 arg
.val
= target_su
.val
;
3413 ret
= get_errno(semctl(semid
, semnum
, cmd
, arg
));
3417 err
= target_to_host_semarray(semid
, &array
, target_su
.array
);
3421 ret
= get_errno(semctl(semid
, semnum
, cmd
, arg
));
3422 err
= host_to_target_semarray(semid
, target_su
.array
, &array
);
3429 err
= target_to_host_semid_ds(&dsarg
, target_su
.buf
);
3433 ret
= get_errno(semctl(semid
, semnum
, cmd
, arg
));
3434 err
= host_to_target_semid_ds(target_su
.buf
, &dsarg
);
3440 arg
.__buf
= &seminfo
;
3441 ret
= get_errno(semctl(semid
, semnum
, cmd
, arg
));
3442 err
= host_to_target_seminfo(target_su
.__buf
, &seminfo
);
3450 ret
= get_errno(semctl(semid
, semnum
, cmd
, NULL
));
3457 struct target_sembuf
{
3458 unsigned short sem_num
;
3463 static inline abi_long
target_to_host_sembuf(struct sembuf
*host_sembuf
,
3464 abi_ulong target_addr
,
3467 struct target_sembuf
*target_sembuf
;
3470 target_sembuf
= lock_user(VERIFY_READ
, target_addr
,
3471 nsops
*sizeof(struct target_sembuf
), 1);
3473 return -TARGET_EFAULT
;
3475 for(i
=0; i
<nsops
; i
++) {
3476 __get_user(host_sembuf
[i
].sem_num
, &target_sembuf
[i
].sem_num
);
3477 __get_user(host_sembuf
[i
].sem_op
, &target_sembuf
[i
].sem_op
);
3478 __get_user(host_sembuf
[i
].sem_flg
, &target_sembuf
[i
].sem_flg
);
3481 unlock_user(target_sembuf
, target_addr
, 0);
3486 static inline abi_long
do_semop(int semid
, abi_long ptr
, unsigned nsops
)
3488 struct sembuf sops
[nsops
];
3490 if (target_to_host_sembuf(sops
, ptr
, nsops
))
3491 return -TARGET_EFAULT
;
3493 return get_errno(safe_semtimedop(semid
, sops
, nsops
, NULL
));
3496 struct target_msqid_ds
3498 struct target_ipc_perm msg_perm
;
3499 abi_ulong msg_stime
;
3500 #if TARGET_ABI_BITS == 32
3501 abi_ulong __unused1
;
3503 abi_ulong msg_rtime
;
3504 #if TARGET_ABI_BITS == 32
3505 abi_ulong __unused2
;
3507 abi_ulong msg_ctime
;
3508 #if TARGET_ABI_BITS == 32
3509 abi_ulong __unused3
;
3511 abi_ulong __msg_cbytes
;
3513 abi_ulong msg_qbytes
;
3514 abi_ulong msg_lspid
;
3515 abi_ulong msg_lrpid
;
3516 abi_ulong __unused4
;
3517 abi_ulong __unused5
;
3520 static inline abi_long
target_to_host_msqid_ds(struct msqid_ds
*host_md
,
3521 abi_ulong target_addr
)
3523 struct target_msqid_ds
*target_md
;
3525 if (!lock_user_struct(VERIFY_READ
, target_md
, target_addr
, 1))
3526 return -TARGET_EFAULT
;
3527 if (target_to_host_ipc_perm(&(host_md
->msg_perm
),target_addr
))
3528 return -TARGET_EFAULT
;
3529 host_md
->msg_stime
= tswapal(target_md
->msg_stime
);
3530 host_md
->msg_rtime
= tswapal(target_md
->msg_rtime
);
3531 host_md
->msg_ctime
= tswapal(target_md
->msg_ctime
);
3532 host_md
->__msg_cbytes
= tswapal(target_md
->__msg_cbytes
);
3533 host_md
->msg_qnum
= tswapal(target_md
->msg_qnum
);
3534 host_md
->msg_qbytes
= tswapal(target_md
->msg_qbytes
);
3535 host_md
->msg_lspid
= tswapal(target_md
->msg_lspid
);
3536 host_md
->msg_lrpid
= tswapal(target_md
->msg_lrpid
);
3537 unlock_user_struct(target_md
, target_addr
, 0);
3541 static inline abi_long
host_to_target_msqid_ds(abi_ulong target_addr
,
3542 struct msqid_ds
*host_md
)
3544 struct target_msqid_ds
*target_md
;
3546 if (!lock_user_struct(VERIFY_WRITE
, target_md
, target_addr
, 0))
3547 return -TARGET_EFAULT
;
3548 if (host_to_target_ipc_perm(target_addr
,&(host_md
->msg_perm
)))
3549 return -TARGET_EFAULT
;
3550 target_md
->msg_stime
= tswapal(host_md
->msg_stime
);
3551 target_md
->msg_rtime
= tswapal(host_md
->msg_rtime
);
3552 target_md
->msg_ctime
= tswapal(host_md
->msg_ctime
);
3553 target_md
->__msg_cbytes
= tswapal(host_md
->__msg_cbytes
);
3554 target_md
->msg_qnum
= tswapal(host_md
->msg_qnum
);
3555 target_md
->msg_qbytes
= tswapal(host_md
->msg_qbytes
);
3556 target_md
->msg_lspid
= tswapal(host_md
->msg_lspid
);
3557 target_md
->msg_lrpid
= tswapal(host_md
->msg_lrpid
);
3558 unlock_user_struct(target_md
, target_addr
, 1);
3562 struct target_msginfo
{
3570 unsigned short int msgseg
;
3573 static inline abi_long
host_to_target_msginfo(abi_ulong target_addr
,
3574 struct msginfo
*host_msginfo
)
3576 struct target_msginfo
*target_msginfo
;
3577 if (!lock_user_struct(VERIFY_WRITE
, target_msginfo
, target_addr
, 0))
3578 return -TARGET_EFAULT
;
3579 __put_user(host_msginfo
->msgpool
, &target_msginfo
->msgpool
);
3580 __put_user(host_msginfo
->msgmap
, &target_msginfo
->msgmap
);
3581 __put_user(host_msginfo
->msgmax
, &target_msginfo
->msgmax
);
3582 __put_user(host_msginfo
->msgmnb
, &target_msginfo
->msgmnb
);
3583 __put_user(host_msginfo
->msgmni
, &target_msginfo
->msgmni
);
3584 __put_user(host_msginfo
->msgssz
, &target_msginfo
->msgssz
);
3585 __put_user(host_msginfo
->msgtql
, &target_msginfo
->msgtql
);
3586 __put_user(host_msginfo
->msgseg
, &target_msginfo
->msgseg
);
3587 unlock_user_struct(target_msginfo
, target_addr
, 1);
3591 static inline abi_long
do_msgctl(int msgid
, int cmd
, abi_long ptr
)
3593 struct msqid_ds dsarg
;
3594 struct msginfo msginfo
;
3595 abi_long ret
= -TARGET_EINVAL
;
3603 if (target_to_host_msqid_ds(&dsarg
,ptr
))
3604 return -TARGET_EFAULT
;
3605 ret
= get_errno(msgctl(msgid
, cmd
, &dsarg
));
3606 if (host_to_target_msqid_ds(ptr
,&dsarg
))
3607 return -TARGET_EFAULT
;
3610 ret
= get_errno(msgctl(msgid
, cmd
, NULL
));
3614 ret
= get_errno(msgctl(msgid
, cmd
, (struct msqid_ds
*)&msginfo
));
3615 if (host_to_target_msginfo(ptr
, &msginfo
))
3616 return -TARGET_EFAULT
;
3623 struct target_msgbuf
{
3628 static inline abi_long
do_msgsnd(int msqid
, abi_long msgp
,
3629 ssize_t msgsz
, int msgflg
)
3631 struct target_msgbuf
*target_mb
;
3632 struct msgbuf
*host_mb
;
3636 return -TARGET_EINVAL
;
3639 if (!lock_user_struct(VERIFY_READ
, target_mb
, msgp
, 0))
3640 return -TARGET_EFAULT
;
3641 host_mb
= g_try_malloc(msgsz
+ sizeof(long));
3643 unlock_user_struct(target_mb
, msgp
, 0);
3644 return -TARGET_ENOMEM
;
3646 host_mb
->mtype
= (abi_long
) tswapal(target_mb
->mtype
);
3647 memcpy(host_mb
->mtext
, target_mb
->mtext
, msgsz
);
3648 ret
= get_errno(safe_msgsnd(msqid
, host_mb
, msgsz
, msgflg
));
3650 unlock_user_struct(target_mb
, msgp
, 0);
3655 static inline abi_long
do_msgrcv(int msqid
, abi_long msgp
,
3656 ssize_t msgsz
, abi_long msgtyp
,
3659 struct target_msgbuf
*target_mb
;
3661 struct msgbuf
*host_mb
;
3665 return -TARGET_EINVAL
;
3668 if (!lock_user_struct(VERIFY_WRITE
, target_mb
, msgp
, 0))
3669 return -TARGET_EFAULT
;
3671 host_mb
= g_try_malloc(msgsz
+ sizeof(long));
3673 ret
= -TARGET_ENOMEM
;
3676 ret
= get_errno(safe_msgrcv(msqid
, host_mb
, msgsz
, msgtyp
, msgflg
));
3679 abi_ulong target_mtext_addr
= msgp
+ sizeof(abi_ulong
);
3680 target_mtext
= lock_user(VERIFY_WRITE
, target_mtext_addr
, ret
, 0);
3681 if (!target_mtext
) {
3682 ret
= -TARGET_EFAULT
;
3685 memcpy(target_mb
->mtext
, host_mb
->mtext
, ret
);
3686 unlock_user(target_mtext
, target_mtext_addr
, ret
);
3689 target_mb
->mtype
= tswapal(host_mb
->mtype
);
3693 unlock_user_struct(target_mb
, msgp
, 1);
3698 static inline abi_long
target_to_host_shmid_ds(struct shmid_ds
*host_sd
,
3699 abi_ulong target_addr
)
3701 struct target_shmid_ds
*target_sd
;
3703 if (!lock_user_struct(VERIFY_READ
, target_sd
, target_addr
, 1))
3704 return -TARGET_EFAULT
;
3705 if (target_to_host_ipc_perm(&(host_sd
->shm_perm
), target_addr
))
3706 return -TARGET_EFAULT
;
3707 __get_user(host_sd
->shm_segsz
, &target_sd
->shm_segsz
);
3708 __get_user(host_sd
->shm_atime
, &target_sd
->shm_atime
);
3709 __get_user(host_sd
->shm_dtime
, &target_sd
->shm_dtime
);
3710 __get_user(host_sd
->shm_ctime
, &target_sd
->shm_ctime
);
3711 __get_user(host_sd
->shm_cpid
, &target_sd
->shm_cpid
);
3712 __get_user(host_sd
->shm_lpid
, &target_sd
->shm_lpid
);
3713 __get_user(host_sd
->shm_nattch
, &target_sd
->shm_nattch
);
3714 unlock_user_struct(target_sd
, target_addr
, 0);
3718 static inline abi_long
host_to_target_shmid_ds(abi_ulong target_addr
,
3719 struct shmid_ds
*host_sd
)
3721 struct target_shmid_ds
*target_sd
;
3723 if (!lock_user_struct(VERIFY_WRITE
, target_sd
, target_addr
, 0))
3724 return -TARGET_EFAULT
;
3725 if (host_to_target_ipc_perm(target_addr
, &(host_sd
->shm_perm
)))
3726 return -TARGET_EFAULT
;
3727 __put_user(host_sd
->shm_segsz
, &target_sd
->shm_segsz
);
3728 __put_user(host_sd
->shm_atime
, &target_sd
->shm_atime
);
3729 __put_user(host_sd
->shm_dtime
, &target_sd
->shm_dtime
);
3730 __put_user(host_sd
->shm_ctime
, &target_sd
->shm_ctime
);
3731 __put_user(host_sd
->shm_cpid
, &target_sd
->shm_cpid
);
3732 __put_user(host_sd
->shm_lpid
, &target_sd
->shm_lpid
);
3733 __put_user(host_sd
->shm_nattch
, &target_sd
->shm_nattch
);
3734 unlock_user_struct(target_sd
, target_addr
, 1);
3738 struct target_shminfo
{
3746 static inline abi_long
host_to_target_shminfo(abi_ulong target_addr
,
3747 struct shminfo
*host_shminfo
)
3749 struct target_shminfo
*target_shminfo
;
3750 if (!lock_user_struct(VERIFY_WRITE
, target_shminfo
, target_addr
, 0))
3751 return -TARGET_EFAULT
;
3752 __put_user(host_shminfo
->shmmax
, &target_shminfo
->shmmax
);
3753 __put_user(host_shminfo
->shmmin
, &target_shminfo
->shmmin
);
3754 __put_user(host_shminfo
->shmmni
, &target_shminfo
->shmmni
);
3755 __put_user(host_shminfo
->shmseg
, &target_shminfo
->shmseg
);
3756 __put_user(host_shminfo
->shmall
, &target_shminfo
->shmall
);
3757 unlock_user_struct(target_shminfo
, target_addr
, 1);
3761 struct target_shm_info
{
3766 abi_ulong swap_attempts
;
3767 abi_ulong swap_successes
;
3770 static inline abi_long
host_to_target_shm_info(abi_ulong target_addr
,
3771 struct shm_info
*host_shm_info
)
3773 struct target_shm_info
*target_shm_info
;
3774 if (!lock_user_struct(VERIFY_WRITE
, target_shm_info
, target_addr
, 0))
3775 return -TARGET_EFAULT
;
3776 __put_user(host_shm_info
->used_ids
, &target_shm_info
->used_ids
);
3777 __put_user(host_shm_info
->shm_tot
, &target_shm_info
->shm_tot
);
3778 __put_user(host_shm_info
->shm_rss
, &target_shm_info
->shm_rss
);
3779 __put_user(host_shm_info
->shm_swp
, &target_shm_info
->shm_swp
);
3780 __put_user(host_shm_info
->swap_attempts
, &target_shm_info
->swap_attempts
);
3781 __put_user(host_shm_info
->swap_successes
, &target_shm_info
->swap_successes
);
3782 unlock_user_struct(target_shm_info
, target_addr
, 1);
3786 static inline abi_long
do_shmctl(int shmid
, int cmd
, abi_long buf
)
3788 struct shmid_ds dsarg
;
3789 struct shminfo shminfo
;
3790 struct shm_info shm_info
;
3791 abi_long ret
= -TARGET_EINVAL
;
3799 if (target_to_host_shmid_ds(&dsarg
, buf
))
3800 return -TARGET_EFAULT
;
3801 ret
= get_errno(shmctl(shmid
, cmd
, &dsarg
));
3802 if (host_to_target_shmid_ds(buf
, &dsarg
))
3803 return -TARGET_EFAULT
;
3806 ret
= get_errno(shmctl(shmid
, cmd
, (struct shmid_ds
*)&shminfo
));
3807 if (host_to_target_shminfo(buf
, &shminfo
))
3808 return -TARGET_EFAULT
;
3811 ret
= get_errno(shmctl(shmid
, cmd
, (struct shmid_ds
*)&shm_info
));
3812 if (host_to_target_shm_info(buf
, &shm_info
))
3813 return -TARGET_EFAULT
;
3818 ret
= get_errno(shmctl(shmid
, cmd
, NULL
));
3825 #ifndef TARGET_FORCE_SHMLBA
3826 /* For most architectures, SHMLBA is the same as the page size;
3827 * some architectures have larger values, in which case they should
3828 * define TARGET_FORCE_SHMLBA and provide a target_shmlba() function.
3829 * This corresponds to the kernel arch code defining __ARCH_FORCE_SHMLBA
3830 * and defining its own value for SHMLBA.
3832 * The kernel also permits SHMLBA to be set by the architecture to a
3833 * value larger than the page size without setting __ARCH_FORCE_SHMLBA;
3834 * this means that addresses are rounded to the large size if
3835 * SHM_RND is set but addresses not aligned to that size are not rejected
3836 * as long as they are at least page-aligned. Since the only architecture
3837 * which uses this is ia64 this code doesn't provide for that oddity.
3839 static inline abi_ulong
target_shmlba(CPUArchState
*cpu_env
)
3841 return TARGET_PAGE_SIZE
;
3845 static inline abi_ulong
do_shmat(CPUArchState
*cpu_env
,
3846 int shmid
, abi_ulong shmaddr
, int shmflg
)
3850 struct shmid_ds shm_info
;
3854 /* find out the length of the shared memory segment */
3855 ret
= get_errno(shmctl(shmid
, IPC_STAT
, &shm_info
));
3856 if (is_error(ret
)) {
3857 /* can't get length, bail out */
3861 shmlba
= target_shmlba(cpu_env
);
3863 if (shmaddr
& (shmlba
- 1)) {
3864 if (shmflg
& SHM_RND
) {
3865 shmaddr
&= ~(shmlba
- 1);
3867 return -TARGET_EINVAL
;
3870 if (!guest_range_valid(shmaddr
, shm_info
.shm_segsz
)) {
3871 return -TARGET_EINVAL
;
3877 host_raddr
= shmat(shmid
, (void *)g2h(shmaddr
), shmflg
);
3879 abi_ulong mmap_start
;
3881 mmap_start
= mmap_find_vma(0, shm_info
.shm_segsz
);
3883 if (mmap_start
== -1) {
3885 host_raddr
= (void *)-1;
3887 host_raddr
= shmat(shmid
, g2h(mmap_start
), shmflg
| SHM_REMAP
);
3890 if (host_raddr
== (void *)-1) {
3892 return get_errno((long)host_raddr
);
3894 raddr
=h2g((unsigned long)host_raddr
);
3896 page_set_flags(raddr
, raddr
+ shm_info
.shm_segsz
,
3897 PAGE_VALID
| PAGE_READ
|
3898 ((shmflg
& SHM_RDONLY
)? 0 : PAGE_WRITE
));
3900 for (i
= 0; i
< N_SHM_REGIONS
; i
++) {
3901 if (!shm_regions
[i
].in_use
) {
3902 shm_regions
[i
].in_use
= true;
3903 shm_regions
[i
].start
= raddr
;
3904 shm_regions
[i
].size
= shm_info
.shm_segsz
;
3914 static inline abi_long
do_shmdt(abi_ulong shmaddr
)
3921 for (i
= 0; i
< N_SHM_REGIONS
; ++i
) {
3922 if (shm_regions
[i
].in_use
&& shm_regions
[i
].start
== shmaddr
) {
3923 shm_regions
[i
].in_use
= false;
3924 page_set_flags(shmaddr
, shmaddr
+ shm_regions
[i
].size
, 0);
3928 rv
= get_errno(shmdt(g2h(shmaddr
)));
3935 #ifdef TARGET_NR_ipc
3936 /* ??? This only works with linear mappings. */
3937 /* do_ipc() must return target values and target errnos. */
3938 static abi_long
do_ipc(CPUArchState
*cpu_env
,
3939 unsigned int call
, abi_long first
,
3940 abi_long second
, abi_long third
,
3941 abi_long ptr
, abi_long fifth
)
3946 version
= call
>> 16;
3951 ret
= do_semop(first
, ptr
, second
);
3955 ret
= get_errno(semget(first
, second
, third
));
3958 case IPCOP_semctl
: {
3959 /* The semun argument to semctl is passed by value, so dereference the
3962 get_user_ual(atptr
, ptr
);
3963 ret
= do_semctl(first
, second
, third
, atptr
);
3968 ret
= get_errno(msgget(first
, second
));
3972 ret
= do_msgsnd(first
, ptr
, second
, third
);
3976 ret
= do_msgctl(first
, second
, ptr
);
3983 struct target_ipc_kludge
{
3988 if (!lock_user_struct(VERIFY_READ
, tmp
, ptr
, 1)) {
3989 ret
= -TARGET_EFAULT
;
3993 ret
= do_msgrcv(first
, tswapal(tmp
->msgp
), second
, tswapal(tmp
->msgtyp
), third
);
3995 unlock_user_struct(tmp
, ptr
, 0);
3999 ret
= do_msgrcv(first
, ptr
, second
, fifth
, third
);
4008 raddr
= do_shmat(cpu_env
, first
, ptr
, second
);
4009 if (is_error(raddr
))
4010 return get_errno(raddr
);
4011 if (put_user_ual(raddr
, third
))
4012 return -TARGET_EFAULT
;
4016 ret
= -TARGET_EINVAL
;
4021 ret
= do_shmdt(ptr
);
4025 /* IPC_* flag values are the same on all linux platforms */
4026 ret
= get_errno(shmget(first
, second
, third
));
4029 /* IPC_* and SHM_* command values are the same on all linux platforms */
4031 ret
= do_shmctl(first
, second
, ptr
);
4034 gemu_log("Unsupported ipc call: %d (version %d)\n", call
, version
);
4035 ret
= -TARGET_ENOSYS
;
4042 /* kernel structure types definitions */
4044 #define STRUCT(name, ...) STRUCT_ ## name,
4045 #define STRUCT_SPECIAL(name) STRUCT_ ## name,
4047 #include "syscall_types.h"
4051 #undef STRUCT_SPECIAL
4053 #define STRUCT(name, ...) static const argtype struct_ ## name ## _def[] = { __VA_ARGS__, TYPE_NULL };
4054 #define STRUCT_SPECIAL(name)
4055 #include "syscall_types.h"
4057 #undef STRUCT_SPECIAL
4059 typedef struct IOCTLEntry IOCTLEntry
;
4061 typedef abi_long
do_ioctl_fn(const IOCTLEntry
*ie
, uint8_t *buf_temp
,
4062 int fd
, int cmd
, abi_long arg
);
4066 unsigned int host_cmd
;
4069 do_ioctl_fn
*do_ioctl
;
4070 const argtype arg_type
[5];
4073 #define IOC_R 0x0001
4074 #define IOC_W 0x0002
4075 #define IOC_RW (IOC_R | IOC_W)
4077 #define MAX_STRUCT_SIZE 4096
4079 #ifdef CONFIG_FIEMAP
4080 /* So fiemap access checks don't overflow on 32 bit systems.
4081 * This is very slightly smaller than the limit imposed by
4082 * the underlying kernel.
4084 #define FIEMAP_MAX_EXTENTS ((UINT_MAX - sizeof(struct fiemap)) \
4085 / sizeof(struct fiemap_extent))
4087 static abi_long
do_ioctl_fs_ioc_fiemap(const IOCTLEntry
*ie
, uint8_t *buf_temp
,
4088 int fd
, int cmd
, abi_long arg
)
4090 /* The parameter for this ioctl is a struct fiemap followed
4091 * by an array of struct fiemap_extent whose size is set
4092 * in fiemap->fm_extent_count. The array is filled in by the
4095 int target_size_in
, target_size_out
;
4097 const argtype
*arg_type
= ie
->arg_type
;
4098 const argtype extent_arg_type
[] = { MK_STRUCT(STRUCT_fiemap_extent
) };
4101 int i
, extent_size
= thunk_type_size(extent_arg_type
, 0);
4105 assert(arg_type
[0] == TYPE_PTR
);
4106 assert(ie
->access
== IOC_RW
);
4108 target_size_in
= thunk_type_size(arg_type
, 0);
4109 argptr
= lock_user(VERIFY_READ
, arg
, target_size_in
, 1);
4111 return -TARGET_EFAULT
;
4113 thunk_convert(buf_temp
, argptr
, arg_type
, THUNK_HOST
);
4114 unlock_user(argptr
, arg
, 0);
4115 fm
= (struct fiemap
*)buf_temp
;
4116 if (fm
->fm_extent_count
> FIEMAP_MAX_EXTENTS
) {
4117 return -TARGET_EINVAL
;
4120 outbufsz
= sizeof (*fm
) +
4121 (sizeof(struct fiemap_extent
) * fm
->fm_extent_count
);
4123 if (outbufsz
> MAX_STRUCT_SIZE
) {
4124 /* We can't fit all the extents into the fixed size buffer.
4125 * Allocate one that is large enough and use it instead.
4127 fm
= g_try_malloc(outbufsz
);
4129 return -TARGET_ENOMEM
;
4131 memcpy(fm
, buf_temp
, sizeof(struct fiemap
));
4134 ret
= get_errno(safe_ioctl(fd
, ie
->host_cmd
, fm
));
4135 if (!is_error(ret
)) {
4136 target_size_out
= target_size_in
;
4137 /* An extent_count of 0 means we were only counting the extents
4138 * so there are no structs to copy
4140 if (fm
->fm_extent_count
!= 0) {
4141 target_size_out
+= fm
->fm_mapped_extents
* extent_size
;
4143 argptr
= lock_user(VERIFY_WRITE
, arg
, target_size_out
, 0);
4145 ret
= -TARGET_EFAULT
;
4147 /* Convert the struct fiemap */
4148 thunk_convert(argptr
, fm
, arg_type
, THUNK_TARGET
);
4149 if (fm
->fm_extent_count
!= 0) {
4150 p
= argptr
+ target_size_in
;
4151 /* ...and then all the struct fiemap_extents */
4152 for (i
= 0; i
< fm
->fm_mapped_extents
; i
++) {
4153 thunk_convert(p
, &fm
->fm_extents
[i
], extent_arg_type
,
4158 unlock_user(argptr
, arg
, target_size_out
);
4168 static abi_long
do_ioctl_ifconf(const IOCTLEntry
*ie
, uint8_t *buf_temp
,
4169 int fd
, int cmd
, abi_long arg
)
4171 const argtype
*arg_type
= ie
->arg_type
;
4175 struct ifconf
*host_ifconf
;
4177 const argtype ifreq_arg_type
[] = { MK_STRUCT(STRUCT_sockaddr_ifreq
) };
4178 int target_ifreq_size
;
4183 abi_long target_ifc_buf
;
4187 assert(arg_type
[0] == TYPE_PTR
);
4188 assert(ie
->access
== IOC_RW
);
4191 target_size
= thunk_type_size(arg_type
, 0);
4193 argptr
= lock_user(VERIFY_READ
, arg
, target_size
, 1);
4195 return -TARGET_EFAULT
;
4196 thunk_convert(buf_temp
, argptr
, arg_type
, THUNK_HOST
);
4197 unlock_user(argptr
, arg
, 0);
4199 host_ifconf
= (struct ifconf
*)(unsigned long)buf_temp
;
4200 target_ifc_buf
= (abi_long
)(unsigned long)host_ifconf
->ifc_buf
;
4201 target_ifreq_size
= thunk_type_size(ifreq_arg_type
, 0);
4203 if (target_ifc_buf
!= 0) {
4204 target_ifc_len
= host_ifconf
->ifc_len
;
4205 nb_ifreq
= target_ifc_len
/ target_ifreq_size
;
4206 host_ifc_len
= nb_ifreq
* sizeof(struct ifreq
);
4208 outbufsz
= sizeof(*host_ifconf
) + host_ifc_len
;
4209 if (outbufsz
> MAX_STRUCT_SIZE
) {
4211 * We can't fit all the extents into the fixed size buffer.
4212 * Allocate one that is large enough and use it instead.
4214 host_ifconf
= malloc(outbufsz
);
4216 return -TARGET_ENOMEM
;
4218 memcpy(host_ifconf
, buf_temp
, sizeof(*host_ifconf
));
4221 host_ifc_buf
= (char *)host_ifconf
+ sizeof(*host_ifconf
);
4223 host_ifconf
->ifc_len
= host_ifc_len
;
4225 host_ifc_buf
= NULL
;
4227 host_ifconf
->ifc_buf
= host_ifc_buf
;
4229 ret
= get_errno(safe_ioctl(fd
, ie
->host_cmd
, host_ifconf
));
4230 if (!is_error(ret
)) {
4231 /* convert host ifc_len to target ifc_len */
4233 nb_ifreq
= host_ifconf
->ifc_len
/ sizeof(struct ifreq
);
4234 target_ifc_len
= nb_ifreq
* target_ifreq_size
;
4235 host_ifconf
->ifc_len
= target_ifc_len
;
4237 /* restore target ifc_buf */
4239 host_ifconf
->ifc_buf
= (char *)(unsigned long)target_ifc_buf
;
4241 /* copy struct ifconf to target user */
4243 argptr
= lock_user(VERIFY_WRITE
, arg
, target_size
, 0);
4245 return -TARGET_EFAULT
;
4246 thunk_convert(argptr
, host_ifconf
, arg_type
, THUNK_TARGET
);
4247 unlock_user(argptr
, arg
, target_size
);
4249 if (target_ifc_buf
!= 0) {
4250 /* copy ifreq[] to target user */
4251 argptr
= lock_user(VERIFY_WRITE
, target_ifc_buf
, target_ifc_len
, 0);
4252 for (i
= 0; i
< nb_ifreq
; i
++) {
4253 thunk_convert(argptr
+ i
* target_ifreq_size
,
4254 host_ifc_buf
+ i
* sizeof(struct ifreq
),
4255 ifreq_arg_type
, THUNK_TARGET
);
4257 unlock_user(argptr
, target_ifc_buf
, target_ifc_len
);
4268 #if defined(CONFIG_USBFS)
4269 #if HOST_LONG_BITS > 64
4270 #error USBDEVFS thunks do not support >64 bit hosts yet.
4273 uint64_t target_urb_adr
;
4274 uint64_t target_buf_adr
;
4275 char *target_buf_ptr
;
4276 struct usbdevfs_urb host_urb
;
4279 static GHashTable
*usbdevfs_urb_hashtable(void)
4281 static GHashTable
*urb_hashtable
;
4283 if (!urb_hashtable
) {
4284 urb_hashtable
= g_hash_table_new(g_int64_hash
, g_int64_equal
);
4286 return urb_hashtable
;
4289 static void urb_hashtable_insert(struct live_urb
*urb
)
4291 GHashTable
*urb_hashtable
= usbdevfs_urb_hashtable();
4292 g_hash_table_insert(urb_hashtable
, urb
, urb
);
4295 static struct live_urb
*urb_hashtable_lookup(uint64_t target_urb_adr
)
4297 GHashTable
*urb_hashtable
= usbdevfs_urb_hashtable();
4298 return g_hash_table_lookup(urb_hashtable
, &target_urb_adr
);
4301 static void urb_hashtable_remove(struct live_urb
*urb
)
4303 GHashTable
*urb_hashtable
= usbdevfs_urb_hashtable();
4304 g_hash_table_remove(urb_hashtable
, urb
);
4308 do_ioctl_usbdevfs_reapurb(const IOCTLEntry
*ie
, uint8_t *buf_temp
,
4309 int fd
, int cmd
, abi_long arg
)
4311 const argtype usbfsurb_arg_type
[] = { MK_STRUCT(STRUCT_usbdevfs_urb
) };
4312 const argtype ptrvoid_arg_type
[] = { TYPE_PTRVOID
, 0, 0 };
4313 struct live_urb
*lurb
;
4317 uintptr_t target_urb_adr
;
4320 target_size
= thunk_type_size(usbfsurb_arg_type
, THUNK_TARGET
);
4322 memset(buf_temp
, 0, sizeof(uint64_t));
4323 ret
= get_errno(safe_ioctl(fd
, ie
->host_cmd
, buf_temp
));
4324 if (is_error(ret
)) {
4328 memcpy(&hurb
, buf_temp
, sizeof(uint64_t));
4329 lurb
= (void *)((uintptr_t)hurb
- offsetof(struct live_urb
, host_urb
));
4330 if (!lurb
->target_urb_adr
) {
4331 return -TARGET_EFAULT
;
4333 urb_hashtable_remove(lurb
);
4334 unlock_user(lurb
->target_buf_ptr
, lurb
->target_buf_adr
,
4335 lurb
->host_urb
.buffer_length
);
4336 lurb
->target_buf_ptr
= NULL
;
4338 /* restore the guest buffer pointer */
4339 lurb
->host_urb
.buffer
= (void *)(uintptr_t)lurb
->target_buf_adr
;
4341 /* update the guest urb struct */
4342 argptr
= lock_user(VERIFY_WRITE
, lurb
->target_urb_adr
, target_size
, 0);
4345 return -TARGET_EFAULT
;
4347 thunk_convert(argptr
, &lurb
->host_urb
, usbfsurb_arg_type
, THUNK_TARGET
);
4348 unlock_user(argptr
, lurb
->target_urb_adr
, target_size
);
4350 target_size
= thunk_type_size(ptrvoid_arg_type
, THUNK_TARGET
);
4351 /* write back the urb handle */
4352 argptr
= lock_user(VERIFY_WRITE
, arg
, target_size
, 0);
4355 return -TARGET_EFAULT
;
4358 /* GHashTable uses 64-bit keys but thunk_convert expects uintptr_t */
4359 target_urb_adr
= lurb
->target_urb_adr
;
4360 thunk_convert(argptr
, &target_urb_adr
, ptrvoid_arg_type
, THUNK_TARGET
);
4361 unlock_user(argptr
, arg
, target_size
);
4368 do_ioctl_usbdevfs_discardurb(const IOCTLEntry
*ie
,
4369 uint8_t *buf_temp
__attribute__((unused
)),
4370 int fd
, int cmd
, abi_long arg
)
4372 struct live_urb
*lurb
;
4374 /* map target address back to host URB with metadata. */
4375 lurb
= urb_hashtable_lookup(arg
);
4377 return -TARGET_EFAULT
;
4379 return get_errno(safe_ioctl(fd
, ie
->host_cmd
, &lurb
->host_urb
));
4383 do_ioctl_usbdevfs_submiturb(const IOCTLEntry
*ie
, uint8_t *buf_temp
,
4384 int fd
, int cmd
, abi_long arg
)
4386 const argtype
*arg_type
= ie
->arg_type
;
4391 struct live_urb
*lurb
;
4394 * each submitted URB needs to map to a unique ID for the
4395 * kernel, and that unique ID needs to be a pointer to
4396 * host memory. hence, we need to malloc for each URB.
4397 * isochronous transfers have a variable length struct.
4400 target_size
= thunk_type_size(arg_type
, THUNK_TARGET
);
4402 /* construct host copy of urb and metadata */
4403 lurb
= g_try_malloc0(sizeof(struct live_urb
));
4405 return -TARGET_ENOMEM
;
4408 argptr
= lock_user(VERIFY_READ
, arg
, target_size
, 1);
4411 return -TARGET_EFAULT
;
4413 thunk_convert(&lurb
->host_urb
, argptr
, arg_type
, THUNK_HOST
);
4414 unlock_user(argptr
, arg
, 0);
4416 lurb
->target_urb_adr
= arg
;
4417 lurb
->target_buf_adr
= (uintptr_t)lurb
->host_urb
.buffer
;
4419 /* buffer space used depends on endpoint type so lock the entire buffer */
4420 /* control type urbs should check the buffer contents for true direction */
4421 rw_dir
= lurb
->host_urb
.endpoint
& USB_DIR_IN
? VERIFY_WRITE
: VERIFY_READ
;
4422 lurb
->target_buf_ptr
= lock_user(rw_dir
, lurb
->target_buf_adr
,
4423 lurb
->host_urb
.buffer_length
, 1);
4424 if (lurb
->target_buf_ptr
== NULL
) {
4426 return -TARGET_EFAULT
;
4429 /* update buffer pointer in host copy */
4430 lurb
->host_urb
.buffer
= lurb
->target_buf_ptr
;
4432 ret
= get_errno(safe_ioctl(fd
, ie
->host_cmd
, &lurb
->host_urb
));
4433 if (is_error(ret
)) {
4434 unlock_user(lurb
->target_buf_ptr
, lurb
->target_buf_adr
, 0);
4437 urb_hashtable_insert(lurb
);
4442 #endif /* CONFIG_USBFS */
4444 static abi_long
do_ioctl_dm(const IOCTLEntry
*ie
, uint8_t *buf_temp
, int fd
,
4445 int cmd
, abi_long arg
)
4448 struct dm_ioctl
*host_dm
;
4449 abi_long guest_data
;
4450 uint32_t guest_data_size
;
4452 const argtype
*arg_type
= ie
->arg_type
;
4454 void *big_buf
= NULL
;
4458 target_size
= thunk_type_size(arg_type
, 0);
4459 argptr
= lock_user(VERIFY_READ
, arg
, target_size
, 1);
4461 ret
= -TARGET_EFAULT
;
4464 thunk_convert(buf_temp
, argptr
, arg_type
, THUNK_HOST
);
4465 unlock_user(argptr
, arg
, 0);
4467 /* buf_temp is too small, so fetch things into a bigger buffer */
4468 big_buf
= g_malloc0(((struct dm_ioctl
*)buf_temp
)->data_size
* 2);
4469 memcpy(big_buf
, buf_temp
, target_size
);
4473 guest_data
= arg
+ host_dm
->data_start
;
4474 if ((guest_data
- arg
) < 0) {
4475 ret
= -TARGET_EINVAL
;
4478 guest_data_size
= host_dm
->data_size
- host_dm
->data_start
;
4479 host_data
= (char*)host_dm
+ host_dm
->data_start
;
4481 argptr
= lock_user(VERIFY_READ
, guest_data
, guest_data_size
, 1);
4483 ret
= -TARGET_EFAULT
;
4487 switch (ie
->host_cmd
) {
4489 case DM_LIST_DEVICES
:
4492 case DM_DEV_SUSPEND
:
4495 case DM_TABLE_STATUS
:
4496 case DM_TABLE_CLEAR
:
4498 case DM_LIST_VERSIONS
:
4502 case DM_DEV_SET_GEOMETRY
:
4503 /* data contains only strings */
4504 memcpy(host_data
, argptr
, guest_data_size
);
4507 memcpy(host_data
, argptr
, guest_data_size
);
4508 *(uint64_t*)host_data
= tswap64(*(uint64_t*)argptr
);
4512 void *gspec
= argptr
;
4513 void *cur_data
= host_data
;
4514 const argtype arg_type
[] = { MK_STRUCT(STRUCT_dm_target_spec
) };
4515 int spec_size
= thunk_type_size(arg_type
, 0);
4518 for (i
= 0; i
< host_dm
->target_count
; i
++) {
4519 struct dm_target_spec
*spec
= cur_data
;
4523 thunk_convert(spec
, gspec
, arg_type
, THUNK_HOST
);
4524 slen
= strlen((char*)gspec
+ spec_size
) + 1;
4526 spec
->next
= sizeof(*spec
) + slen
;
4527 strcpy((char*)&spec
[1], gspec
+ spec_size
);
4529 cur_data
+= spec
->next
;
4534 ret
= -TARGET_EINVAL
;
4535 unlock_user(argptr
, guest_data
, 0);
4538 unlock_user(argptr
, guest_data
, 0);
4540 ret
= get_errno(safe_ioctl(fd
, ie
->host_cmd
, buf_temp
));
4541 if (!is_error(ret
)) {
4542 guest_data
= arg
+ host_dm
->data_start
;
4543 guest_data_size
= host_dm
->data_size
- host_dm
->data_start
;
4544 argptr
= lock_user(VERIFY_WRITE
, guest_data
, guest_data_size
, 0);
4545 switch (ie
->host_cmd
) {
4550 case DM_DEV_SUSPEND
:
4553 case DM_TABLE_CLEAR
:
4555 case DM_DEV_SET_GEOMETRY
:
4556 /* no return data */
4558 case DM_LIST_DEVICES
:
4560 struct dm_name_list
*nl
= (void*)host_dm
+ host_dm
->data_start
;
4561 uint32_t remaining_data
= guest_data_size
;
4562 void *cur_data
= argptr
;
4563 const argtype arg_type
[] = { MK_STRUCT(STRUCT_dm_name_list
) };
4564 int nl_size
= 12; /* can't use thunk_size due to alignment */
4567 uint32_t next
= nl
->next
;
4569 nl
->next
= nl_size
+ (strlen(nl
->name
) + 1);
4571 if (remaining_data
< nl
->next
) {
4572 host_dm
->flags
|= DM_BUFFER_FULL_FLAG
;
4575 thunk_convert(cur_data
, nl
, arg_type
, THUNK_TARGET
);
4576 strcpy(cur_data
+ nl_size
, nl
->name
);
4577 cur_data
+= nl
->next
;
4578 remaining_data
-= nl
->next
;
4582 nl
= (void*)nl
+ next
;
4587 case DM_TABLE_STATUS
:
4589 struct dm_target_spec
*spec
= (void*)host_dm
+ host_dm
->data_start
;
4590 void *cur_data
= argptr
;
4591 const argtype arg_type
[] = { MK_STRUCT(STRUCT_dm_target_spec
) };
4592 int spec_size
= thunk_type_size(arg_type
, 0);
4595 for (i
= 0; i
< host_dm
->target_count
; i
++) {
4596 uint32_t next
= spec
->next
;
4597 int slen
= strlen((char*)&spec
[1]) + 1;
4598 spec
->next
= (cur_data
- argptr
) + spec_size
+ slen
;
4599 if (guest_data_size
< spec
->next
) {
4600 host_dm
->flags
|= DM_BUFFER_FULL_FLAG
;
4603 thunk_convert(cur_data
, spec
, arg_type
, THUNK_TARGET
);
4604 strcpy(cur_data
+ spec_size
, (char*)&spec
[1]);
4605 cur_data
= argptr
+ spec
->next
;
4606 spec
= (void*)host_dm
+ host_dm
->data_start
+ next
;
4612 void *hdata
= (void*)host_dm
+ host_dm
->data_start
;
4613 int count
= *(uint32_t*)hdata
;
4614 uint64_t *hdev
= hdata
+ 8;
4615 uint64_t *gdev
= argptr
+ 8;
4618 *(uint32_t*)argptr
= tswap32(count
);
4619 for (i
= 0; i
< count
; i
++) {
4620 *gdev
= tswap64(*hdev
);
4626 case DM_LIST_VERSIONS
:
4628 struct dm_target_versions
*vers
= (void*)host_dm
+ host_dm
->data_start
;
4629 uint32_t remaining_data
= guest_data_size
;
4630 void *cur_data
= argptr
;
4631 const argtype arg_type
[] = { MK_STRUCT(STRUCT_dm_target_versions
) };
4632 int vers_size
= thunk_type_size(arg_type
, 0);
4635 uint32_t next
= vers
->next
;
4637 vers
->next
= vers_size
+ (strlen(vers
->name
) + 1);
4639 if (remaining_data
< vers
->next
) {
4640 host_dm
->flags
|= DM_BUFFER_FULL_FLAG
;
4643 thunk_convert(cur_data
, vers
, arg_type
, THUNK_TARGET
);
4644 strcpy(cur_data
+ vers_size
, vers
->name
);
4645 cur_data
+= vers
->next
;
4646 remaining_data
-= vers
->next
;
4650 vers
= (void*)vers
+ next
;
4655 unlock_user(argptr
, guest_data
, 0);
4656 ret
= -TARGET_EINVAL
;
4659 unlock_user(argptr
, guest_data
, guest_data_size
);
4661 argptr
= lock_user(VERIFY_WRITE
, arg
, target_size
, 0);
4663 ret
= -TARGET_EFAULT
;
4666 thunk_convert(argptr
, buf_temp
, arg_type
, THUNK_TARGET
);
4667 unlock_user(argptr
, arg
, target_size
);
4674 static abi_long
do_ioctl_blkpg(const IOCTLEntry
*ie
, uint8_t *buf_temp
, int fd
,
4675 int cmd
, abi_long arg
)
4679 const argtype
*arg_type
= ie
->arg_type
;
4680 const argtype part_arg_type
[] = { MK_STRUCT(STRUCT_blkpg_partition
) };
4683 struct blkpg_ioctl_arg
*host_blkpg
= (void*)buf_temp
;
4684 struct blkpg_partition host_part
;
4686 /* Read and convert blkpg */
4688 target_size
= thunk_type_size(arg_type
, 0);
4689 argptr
= lock_user(VERIFY_READ
, arg
, target_size
, 1);
4691 ret
= -TARGET_EFAULT
;
4694 thunk_convert(buf_temp
, argptr
, arg_type
, THUNK_HOST
);
4695 unlock_user(argptr
, arg
, 0);
4697 switch (host_blkpg
->op
) {
4698 case BLKPG_ADD_PARTITION
:
4699 case BLKPG_DEL_PARTITION
:
4700 /* payload is struct blkpg_partition */
4703 /* Unknown opcode */
4704 ret
= -TARGET_EINVAL
;
4708 /* Read and convert blkpg->data */
4709 arg
= (abi_long
)(uintptr_t)host_blkpg
->data
;
4710 target_size
= thunk_type_size(part_arg_type
, 0);
4711 argptr
= lock_user(VERIFY_READ
, arg
, target_size
, 1);
4713 ret
= -TARGET_EFAULT
;
4716 thunk_convert(&host_part
, argptr
, part_arg_type
, THUNK_HOST
);
4717 unlock_user(argptr
, arg
, 0);
4719 /* Swizzle the data pointer to our local copy and call! */
4720 host_blkpg
->data
= &host_part
;
4721 ret
= get_errno(safe_ioctl(fd
, ie
->host_cmd
, host_blkpg
));
4727 static abi_long
do_ioctl_rt(const IOCTLEntry
*ie
, uint8_t *buf_temp
,
4728 int fd
, int cmd
, abi_long arg
)
4730 const argtype
*arg_type
= ie
->arg_type
;
4731 const StructEntry
*se
;
4732 const argtype
*field_types
;
4733 const int *dst_offsets
, *src_offsets
;
4736 abi_ulong
*target_rt_dev_ptr
= NULL
;
4737 unsigned long *host_rt_dev_ptr
= NULL
;
4741 assert(ie
->access
== IOC_W
);
4742 assert(*arg_type
== TYPE_PTR
);
4744 assert(*arg_type
== TYPE_STRUCT
);
4745 target_size
= thunk_type_size(arg_type
, 0);
4746 argptr
= lock_user(VERIFY_READ
, arg
, target_size
, 1);
4748 return -TARGET_EFAULT
;
4751 assert(*arg_type
== (int)STRUCT_rtentry
);
4752 se
= struct_entries
+ *arg_type
++;
4753 assert(se
->convert
[0] == NULL
);
4754 /* convert struct here to be able to catch rt_dev string */
4755 field_types
= se
->field_types
;
4756 dst_offsets
= se
->field_offsets
[THUNK_HOST
];
4757 src_offsets
= se
->field_offsets
[THUNK_TARGET
];
4758 for (i
= 0; i
< se
->nb_fields
; i
++) {
4759 if (dst_offsets
[i
] == offsetof(struct rtentry
, rt_dev
)) {
4760 assert(*field_types
== TYPE_PTRVOID
);
4761 target_rt_dev_ptr
= (abi_ulong
*)(argptr
+ src_offsets
[i
]);
4762 host_rt_dev_ptr
= (unsigned long *)(buf_temp
+ dst_offsets
[i
]);
4763 if (*target_rt_dev_ptr
!= 0) {
4764 *host_rt_dev_ptr
= (unsigned long)lock_user_string(
4765 tswapal(*target_rt_dev_ptr
));
4766 if (!*host_rt_dev_ptr
) {
4767 unlock_user(argptr
, arg
, 0);
4768 return -TARGET_EFAULT
;
4771 *host_rt_dev_ptr
= 0;
4776 field_types
= thunk_convert(buf_temp
+ dst_offsets
[i
],
4777 argptr
+ src_offsets
[i
],
4778 field_types
, THUNK_HOST
);
4780 unlock_user(argptr
, arg
, 0);
4782 ret
= get_errno(safe_ioctl(fd
, ie
->host_cmd
, buf_temp
));
4784 assert(host_rt_dev_ptr
!= NULL
);
4785 assert(target_rt_dev_ptr
!= NULL
);
4786 if (*host_rt_dev_ptr
!= 0) {
4787 unlock_user((void *)*host_rt_dev_ptr
,
4788 *target_rt_dev_ptr
, 0);
4793 static abi_long
do_ioctl_kdsigaccept(const IOCTLEntry
*ie
, uint8_t *buf_temp
,
4794 int fd
, int cmd
, abi_long arg
)
4796 int sig
= target_to_host_signal(arg
);
4797 return get_errno(safe_ioctl(fd
, ie
->host_cmd
, sig
));
4801 static abi_long
do_ioctl_tiocgptpeer(const IOCTLEntry
*ie
, uint8_t *buf_temp
,
4802 int fd
, int cmd
, abi_long arg
)
4804 int flags
= target_to_host_bitmask(arg
, fcntl_flags_tbl
);
4805 return get_errno(safe_ioctl(fd
, ie
->host_cmd
, flags
));
4809 static IOCTLEntry ioctl_entries
[] = {
4810 #define IOCTL(cmd, access, ...) \
4811 { TARGET_ ## cmd, cmd, #cmd, access, 0, { __VA_ARGS__ } },
4812 #define IOCTL_SPECIAL(cmd, access, dofn, ...) \
4813 { TARGET_ ## cmd, cmd, #cmd, access, dofn, { __VA_ARGS__ } },
4814 #define IOCTL_IGNORE(cmd) \
4815 { TARGET_ ## cmd, 0, #cmd },
4820 /* ??? Implement proper locking for ioctls. */
4821 /* do_ioctl() Must return target values and target errnos. */
4822 static abi_long
do_ioctl(int fd
, int cmd
, abi_long arg
)
4824 const IOCTLEntry
*ie
;
4825 const argtype
*arg_type
;
4827 uint8_t buf_temp
[MAX_STRUCT_SIZE
];
4833 if (ie
->target_cmd
== 0) {
4834 gemu_log("Unsupported ioctl: cmd=0x%04lx\n", (long)cmd
);
4835 return -TARGET_ENOSYS
;
4837 if (ie
->target_cmd
== cmd
)
4841 arg_type
= ie
->arg_type
;
4843 return ie
->do_ioctl(ie
, buf_temp
, fd
, cmd
, arg
);
4844 } else if (!ie
->host_cmd
) {
4845 /* Some architectures define BSD ioctls in their headers
4846 that are not implemented in Linux. */
4847 return -TARGET_ENOSYS
;
4850 switch(arg_type
[0]) {
4853 ret
= get_errno(safe_ioctl(fd
, ie
->host_cmd
));
4857 ret
= get_errno(safe_ioctl(fd
, ie
->host_cmd
, arg
));
4861 target_size
= thunk_type_size(arg_type
, 0);
4862 switch(ie
->access
) {
4864 ret
= get_errno(safe_ioctl(fd
, ie
->host_cmd
, buf_temp
));
4865 if (!is_error(ret
)) {
4866 argptr
= lock_user(VERIFY_WRITE
, arg
, target_size
, 0);
4868 return -TARGET_EFAULT
;
4869 thunk_convert(argptr
, buf_temp
, arg_type
, THUNK_TARGET
);
4870 unlock_user(argptr
, arg
, target_size
);
4874 argptr
= lock_user(VERIFY_READ
, arg
, target_size
, 1);
4876 return -TARGET_EFAULT
;
4877 thunk_convert(buf_temp
, argptr
, arg_type
, THUNK_HOST
);
4878 unlock_user(argptr
, arg
, 0);
4879 ret
= get_errno(safe_ioctl(fd
, ie
->host_cmd
, buf_temp
));
4883 argptr
= lock_user(VERIFY_READ
, arg
, target_size
, 1);
4885 return -TARGET_EFAULT
;
4886 thunk_convert(buf_temp
, argptr
, arg_type
, THUNK_HOST
);
4887 unlock_user(argptr
, arg
, 0);
4888 ret
= get_errno(safe_ioctl(fd
, ie
->host_cmd
, buf_temp
));
4889 if (!is_error(ret
)) {
4890 argptr
= lock_user(VERIFY_WRITE
, arg
, target_size
, 0);
4892 return -TARGET_EFAULT
;
4893 thunk_convert(argptr
, buf_temp
, arg_type
, THUNK_TARGET
);
4894 unlock_user(argptr
, arg
, target_size
);
4900 gemu_log("Unsupported ioctl type: cmd=0x%04lx type=%d\n",
4901 (long)cmd
, arg_type
[0]);
4902 ret
= -TARGET_ENOSYS
;
4908 static const bitmask_transtbl iflag_tbl
[] = {
4909 { TARGET_IGNBRK
, TARGET_IGNBRK
, IGNBRK
, IGNBRK
},
4910 { TARGET_BRKINT
, TARGET_BRKINT
, BRKINT
, BRKINT
},
4911 { TARGET_IGNPAR
, TARGET_IGNPAR
, IGNPAR
, IGNPAR
},
4912 { TARGET_PARMRK
, TARGET_PARMRK
, PARMRK
, PARMRK
},
4913 { TARGET_INPCK
, TARGET_INPCK
, INPCK
, INPCK
},
4914 { TARGET_ISTRIP
, TARGET_ISTRIP
, ISTRIP
, ISTRIP
},
4915 { TARGET_INLCR
, TARGET_INLCR
, INLCR
, INLCR
},
4916 { TARGET_IGNCR
, TARGET_IGNCR
, IGNCR
, IGNCR
},
4917 { TARGET_ICRNL
, TARGET_ICRNL
, ICRNL
, ICRNL
},
4918 { TARGET_IUCLC
, TARGET_IUCLC
, IUCLC
, IUCLC
},
4919 { TARGET_IXON
, TARGET_IXON
, IXON
, IXON
},
4920 { TARGET_IXANY
, TARGET_IXANY
, IXANY
, IXANY
},
4921 { TARGET_IXOFF
, TARGET_IXOFF
, IXOFF
, IXOFF
},
4922 { TARGET_IMAXBEL
, TARGET_IMAXBEL
, IMAXBEL
, IMAXBEL
},
4926 static const bitmask_transtbl oflag_tbl
[] = {
4927 { TARGET_OPOST
, TARGET_OPOST
, OPOST
, OPOST
},
4928 { TARGET_OLCUC
, TARGET_OLCUC
, OLCUC
, OLCUC
},
4929 { TARGET_ONLCR
, TARGET_ONLCR
, ONLCR
, ONLCR
},
4930 { TARGET_OCRNL
, TARGET_OCRNL
, OCRNL
, OCRNL
},
4931 { TARGET_ONOCR
, TARGET_ONOCR
, ONOCR
, ONOCR
},
4932 { TARGET_ONLRET
, TARGET_ONLRET
, ONLRET
, ONLRET
},
4933 { TARGET_OFILL
, TARGET_OFILL
, OFILL
, OFILL
},
4934 { TARGET_OFDEL
, TARGET_OFDEL
, OFDEL
, OFDEL
},
4935 { TARGET_NLDLY
, TARGET_NL0
, NLDLY
, NL0
},
4936 { TARGET_NLDLY
, TARGET_NL1
, NLDLY
, NL1
},
4937 { TARGET_CRDLY
, TARGET_CR0
, CRDLY
, CR0
},
4938 { TARGET_CRDLY
, TARGET_CR1
, CRDLY
, CR1
},
4939 { TARGET_CRDLY
, TARGET_CR2
, CRDLY
, CR2
},
4940 { TARGET_CRDLY
, TARGET_CR3
, CRDLY
, CR3
},
4941 { TARGET_TABDLY
, TARGET_TAB0
, TABDLY
, TAB0
},
4942 { TARGET_TABDLY
, TARGET_TAB1
, TABDLY
, TAB1
},
4943 { TARGET_TABDLY
, TARGET_TAB2
, TABDLY
, TAB2
},
4944 { TARGET_TABDLY
, TARGET_TAB3
, TABDLY
, TAB3
},
4945 { TARGET_BSDLY
, TARGET_BS0
, BSDLY
, BS0
},
4946 { TARGET_BSDLY
, TARGET_BS1
, BSDLY
, BS1
},
4947 { TARGET_VTDLY
, TARGET_VT0
, VTDLY
, VT0
},
4948 { TARGET_VTDLY
, TARGET_VT1
, VTDLY
, VT1
},
4949 { TARGET_FFDLY
, TARGET_FF0
, FFDLY
, FF0
},
4950 { TARGET_FFDLY
, TARGET_FF1
, FFDLY
, FF1
},
4954 static const bitmask_transtbl cflag_tbl
[] = {
4955 { TARGET_CBAUD
, TARGET_B0
, CBAUD
, B0
},
4956 { TARGET_CBAUD
, TARGET_B50
, CBAUD
, B50
},
4957 { TARGET_CBAUD
, TARGET_B75
, CBAUD
, B75
},
4958 { TARGET_CBAUD
, TARGET_B110
, CBAUD
, B110
},
4959 { TARGET_CBAUD
, TARGET_B134
, CBAUD
, B134
},
4960 { TARGET_CBAUD
, TARGET_B150
, CBAUD
, B150
},
4961 { TARGET_CBAUD
, TARGET_B200
, CBAUD
, B200
},
4962 { TARGET_CBAUD
, TARGET_B300
, CBAUD
, B300
},
4963 { TARGET_CBAUD
, TARGET_B600
, CBAUD
, B600
},
4964 { TARGET_CBAUD
, TARGET_B1200
, CBAUD
, B1200
},
4965 { TARGET_CBAUD
, TARGET_B1800
, CBAUD
, B1800
},
4966 { TARGET_CBAUD
, TARGET_B2400
, CBAUD
, B2400
},
4967 { TARGET_CBAUD
, TARGET_B4800
, CBAUD
, B4800
},
4968 { TARGET_CBAUD
, TARGET_B9600
, CBAUD
, B9600
},
4969 { TARGET_CBAUD
, TARGET_B19200
, CBAUD
, B19200
},
4970 { TARGET_CBAUD
, TARGET_B38400
, CBAUD
, B38400
},
4971 { TARGET_CBAUD
, TARGET_B57600
, CBAUD
, B57600
},
4972 { TARGET_CBAUD
, TARGET_B115200
, CBAUD
, B115200
},
4973 { TARGET_CBAUD
, TARGET_B230400
, CBAUD
, B230400
},
4974 { TARGET_CBAUD
, TARGET_B460800
, CBAUD
, B460800
},
4975 { TARGET_CSIZE
, TARGET_CS5
, CSIZE
, CS5
},
4976 { TARGET_CSIZE
, TARGET_CS6
, CSIZE
, CS6
},
4977 { TARGET_CSIZE
, TARGET_CS7
, CSIZE
, CS7
},
4978 { TARGET_CSIZE
, TARGET_CS8
, CSIZE
, CS8
},
4979 { TARGET_CSTOPB
, TARGET_CSTOPB
, CSTOPB
, CSTOPB
},
4980 { TARGET_CREAD
, TARGET_CREAD
, CREAD
, CREAD
},
4981 { TARGET_PARENB
, TARGET_PARENB
, PARENB
, PARENB
},
4982 { TARGET_PARODD
, TARGET_PARODD
, PARODD
, PARODD
},
4983 { TARGET_HUPCL
, TARGET_HUPCL
, HUPCL
, HUPCL
},
4984 { TARGET_CLOCAL
, TARGET_CLOCAL
, CLOCAL
, CLOCAL
},
4985 { TARGET_CRTSCTS
, TARGET_CRTSCTS
, CRTSCTS
, CRTSCTS
},
4989 static const bitmask_transtbl lflag_tbl
[] = {
4990 { TARGET_ISIG
, TARGET_ISIG
, ISIG
, ISIG
},
4991 { TARGET_ICANON
, TARGET_ICANON
, ICANON
, ICANON
},
4992 { TARGET_XCASE
, TARGET_XCASE
, XCASE
, XCASE
},
4993 { TARGET_ECHO
, TARGET_ECHO
, ECHO
, ECHO
},
4994 { TARGET_ECHOE
, TARGET_ECHOE
, ECHOE
, ECHOE
},
4995 { TARGET_ECHOK
, TARGET_ECHOK
, ECHOK
, ECHOK
},
4996 { TARGET_ECHONL
, TARGET_ECHONL
, ECHONL
, ECHONL
},
4997 { TARGET_NOFLSH
, TARGET_NOFLSH
, NOFLSH
, NOFLSH
},
4998 { TARGET_TOSTOP
, TARGET_TOSTOP
, TOSTOP
, TOSTOP
},
4999 { TARGET_ECHOCTL
, TARGET_ECHOCTL
, ECHOCTL
, ECHOCTL
},
5000 { TARGET_ECHOPRT
, TARGET_ECHOPRT
, ECHOPRT
, ECHOPRT
},
5001 { TARGET_ECHOKE
, TARGET_ECHOKE
, ECHOKE
, ECHOKE
},
5002 { TARGET_FLUSHO
, TARGET_FLUSHO
, FLUSHO
, FLUSHO
},
5003 { TARGET_PENDIN
, TARGET_PENDIN
, PENDIN
, PENDIN
},
5004 { TARGET_IEXTEN
, TARGET_IEXTEN
, IEXTEN
, IEXTEN
},
5008 static void target_to_host_termios (void *dst
, const void *src
)
5010 struct host_termios
*host
= dst
;
5011 const struct target_termios
*target
= src
;
5014 target_to_host_bitmask(tswap32(target
->c_iflag
), iflag_tbl
);
5016 target_to_host_bitmask(tswap32(target
->c_oflag
), oflag_tbl
);
5018 target_to_host_bitmask(tswap32(target
->c_cflag
), cflag_tbl
);
5020 target_to_host_bitmask(tswap32(target
->c_lflag
), lflag_tbl
);
5021 host
->c_line
= target
->c_line
;
5023 memset(host
->c_cc
, 0, sizeof(host
->c_cc
));
5024 host
->c_cc
[VINTR
] = target
->c_cc
[TARGET_VINTR
];
5025 host
->c_cc
[VQUIT
] = target
->c_cc
[TARGET_VQUIT
];
5026 host
->c_cc
[VERASE
] = target
->c_cc
[TARGET_VERASE
];
5027 host
->c_cc
[VKILL
] = target
->c_cc
[TARGET_VKILL
];
5028 host
->c_cc
[VEOF
] = target
->c_cc
[TARGET_VEOF
];
5029 host
->c_cc
[VTIME
] = target
->c_cc
[TARGET_VTIME
];
5030 host
->c_cc
[VMIN
] = target
->c_cc
[TARGET_VMIN
];
5031 host
->c_cc
[VSWTC
] = target
->c_cc
[TARGET_VSWTC
];
5032 host
->c_cc
[VSTART
] = target
->c_cc
[TARGET_VSTART
];
5033 host
->c_cc
[VSTOP
] = target
->c_cc
[TARGET_VSTOP
];
5034 host
->c_cc
[VSUSP
] = target
->c_cc
[TARGET_VSUSP
];
5035 host
->c_cc
[VEOL
] = target
->c_cc
[TARGET_VEOL
];
5036 host
->c_cc
[VREPRINT
] = target
->c_cc
[TARGET_VREPRINT
];
5037 host
->c_cc
[VDISCARD
] = target
->c_cc
[TARGET_VDISCARD
];
5038 host
->c_cc
[VWERASE
] = target
->c_cc
[TARGET_VWERASE
];
5039 host
->c_cc
[VLNEXT
] = target
->c_cc
[TARGET_VLNEXT
];
5040 host
->c_cc
[VEOL2
] = target
->c_cc
[TARGET_VEOL2
];
5043 static void host_to_target_termios (void *dst
, const void *src
)
5045 struct target_termios
*target
= dst
;
5046 const struct host_termios
*host
= src
;
5049 tswap32(host_to_target_bitmask(host
->c_iflag
, iflag_tbl
));
5051 tswap32(host_to_target_bitmask(host
->c_oflag
, oflag_tbl
));
5053 tswap32(host_to_target_bitmask(host
->c_cflag
, cflag_tbl
));
5055 tswap32(host_to_target_bitmask(host
->c_lflag
, lflag_tbl
));
5056 target
->c_line
= host
->c_line
;
5058 memset(target
->c_cc
, 0, sizeof(target
->c_cc
));
5059 target
->c_cc
[TARGET_VINTR
] = host
->c_cc
[VINTR
];
5060 target
->c_cc
[TARGET_VQUIT
] = host
->c_cc
[VQUIT
];
5061 target
->c_cc
[TARGET_VERASE
] = host
->c_cc
[VERASE
];
5062 target
->c_cc
[TARGET_VKILL
] = host
->c_cc
[VKILL
];
5063 target
->c_cc
[TARGET_VEOF
] = host
->c_cc
[VEOF
];
5064 target
->c_cc
[TARGET_VTIME
] = host
->c_cc
[VTIME
];
5065 target
->c_cc
[TARGET_VMIN
] = host
->c_cc
[VMIN
];
5066 target
->c_cc
[TARGET_VSWTC
] = host
->c_cc
[VSWTC
];
5067 target
->c_cc
[TARGET_VSTART
] = host
->c_cc
[VSTART
];
5068 target
->c_cc
[TARGET_VSTOP
] = host
->c_cc
[VSTOP
];
5069 target
->c_cc
[TARGET_VSUSP
] = host
->c_cc
[VSUSP
];
5070 target
->c_cc
[TARGET_VEOL
] = host
->c_cc
[VEOL
];
5071 target
->c_cc
[TARGET_VREPRINT
] = host
->c_cc
[VREPRINT
];
5072 target
->c_cc
[TARGET_VDISCARD
] = host
->c_cc
[VDISCARD
];
5073 target
->c_cc
[TARGET_VWERASE
] = host
->c_cc
[VWERASE
];
5074 target
->c_cc
[TARGET_VLNEXT
] = host
->c_cc
[VLNEXT
];
5075 target
->c_cc
[TARGET_VEOL2
] = host
->c_cc
[VEOL2
];
5078 static const StructEntry struct_termios_def
= {
5079 .convert
= { host_to_target_termios
, target_to_host_termios
},
5080 .size
= { sizeof(struct target_termios
), sizeof(struct host_termios
) },
5081 .align
= { __alignof__(struct target_termios
), __alignof__(struct host_termios
) },
5084 static bitmask_transtbl mmap_flags_tbl
[] = {
5085 { TARGET_MAP_SHARED
, TARGET_MAP_SHARED
, MAP_SHARED
, MAP_SHARED
},
5086 { TARGET_MAP_PRIVATE
, TARGET_MAP_PRIVATE
, MAP_PRIVATE
, MAP_PRIVATE
},
5087 { TARGET_MAP_FIXED
, TARGET_MAP_FIXED
, MAP_FIXED
, MAP_FIXED
},
5088 { TARGET_MAP_ANONYMOUS
, TARGET_MAP_ANONYMOUS
,
5089 MAP_ANONYMOUS
, MAP_ANONYMOUS
},
5090 { TARGET_MAP_GROWSDOWN
, TARGET_MAP_GROWSDOWN
,
5091 MAP_GROWSDOWN
, MAP_GROWSDOWN
},
5092 { TARGET_MAP_DENYWRITE
, TARGET_MAP_DENYWRITE
,
5093 MAP_DENYWRITE
, MAP_DENYWRITE
},
5094 { TARGET_MAP_EXECUTABLE
, TARGET_MAP_EXECUTABLE
,
5095 MAP_EXECUTABLE
, MAP_EXECUTABLE
},
5096 { TARGET_MAP_LOCKED
, TARGET_MAP_LOCKED
, MAP_LOCKED
, MAP_LOCKED
},
5097 { TARGET_MAP_NORESERVE
, TARGET_MAP_NORESERVE
,
5098 MAP_NORESERVE
, MAP_NORESERVE
},
5099 { TARGET_MAP_HUGETLB
, TARGET_MAP_HUGETLB
, MAP_HUGETLB
, MAP_HUGETLB
},
5100 /* MAP_STACK had been ignored by the kernel for quite some time.
5101 Recognize it for the target insofar as we do not want to pass
5102 it through to the host. */
5103 { TARGET_MAP_STACK
, TARGET_MAP_STACK
, 0, 0 },
5107 #if defined(TARGET_I386)
5109 /* NOTE: there is really one LDT for all the threads */
5110 static uint8_t *ldt_table
;
5112 static abi_long
read_ldt(abi_ulong ptr
, unsigned long bytecount
)
5119 size
= TARGET_LDT_ENTRIES
* TARGET_LDT_ENTRY_SIZE
;
5120 if (size
> bytecount
)
5122 p
= lock_user(VERIFY_WRITE
, ptr
, size
, 0);
5124 return -TARGET_EFAULT
;
5125 /* ??? Should this by byteswapped? */
5126 memcpy(p
, ldt_table
, size
);
5127 unlock_user(p
, ptr
, size
);
5131 /* XXX: add locking support */
5132 static abi_long
write_ldt(CPUX86State
*env
,
5133 abi_ulong ptr
, unsigned long bytecount
, int oldmode
)
5135 struct target_modify_ldt_ldt_s ldt_info
;
5136 struct target_modify_ldt_ldt_s
*target_ldt_info
;
5137 int seg_32bit
, contents
, read_exec_only
, limit_in_pages
;
5138 int seg_not_present
, useable
, lm
;
5139 uint32_t *lp
, entry_1
, entry_2
;
5141 if (bytecount
!= sizeof(ldt_info
))
5142 return -TARGET_EINVAL
;
5143 if (!lock_user_struct(VERIFY_READ
, target_ldt_info
, ptr
, 1))
5144 return -TARGET_EFAULT
;
5145 ldt_info
.entry_number
= tswap32(target_ldt_info
->entry_number
);
5146 ldt_info
.base_addr
= tswapal(target_ldt_info
->base_addr
);
5147 ldt_info
.limit
= tswap32(target_ldt_info
->limit
);
5148 ldt_info
.flags
= tswap32(target_ldt_info
->flags
);
5149 unlock_user_struct(target_ldt_info
, ptr
, 0);
5151 if (ldt_info
.entry_number
>= TARGET_LDT_ENTRIES
)
5152 return -TARGET_EINVAL
;
5153 seg_32bit
= ldt_info
.flags
& 1;
5154 contents
= (ldt_info
.flags
>> 1) & 3;
5155 read_exec_only
= (ldt_info
.flags
>> 3) & 1;
5156 limit_in_pages
= (ldt_info
.flags
>> 4) & 1;
5157 seg_not_present
= (ldt_info
.flags
>> 5) & 1;
5158 useable
= (ldt_info
.flags
>> 6) & 1;
5162 lm
= (ldt_info
.flags
>> 7) & 1;
5164 if (contents
== 3) {
5166 return -TARGET_EINVAL
;
5167 if (seg_not_present
== 0)
5168 return -TARGET_EINVAL
;
5170 /* allocate the LDT */
5172 env
->ldt
.base
= target_mmap(0,
5173 TARGET_LDT_ENTRIES
* TARGET_LDT_ENTRY_SIZE
,
5174 PROT_READ
|PROT_WRITE
,
5175 MAP_ANONYMOUS
|MAP_PRIVATE
, -1, 0);
5176 if (env
->ldt
.base
== -1)
5177 return -TARGET_ENOMEM
;
5178 memset(g2h(env
->ldt
.base
), 0,
5179 TARGET_LDT_ENTRIES
* TARGET_LDT_ENTRY_SIZE
);
5180 env
->ldt
.limit
= 0xffff;
5181 ldt_table
= g2h(env
->ldt
.base
);
5184 /* NOTE: same code as Linux kernel */
5185 /* Allow LDTs to be cleared by the user. */
5186 if (ldt_info
.base_addr
== 0 && ldt_info
.limit
== 0) {
5189 read_exec_only
== 1 &&
5191 limit_in_pages
== 0 &&
5192 seg_not_present
== 1 &&
5200 entry_1
= ((ldt_info
.base_addr
& 0x0000ffff) << 16) |
5201 (ldt_info
.limit
& 0x0ffff);
5202 entry_2
= (ldt_info
.base_addr
& 0xff000000) |
5203 ((ldt_info
.base_addr
& 0x00ff0000) >> 16) |
5204 (ldt_info
.limit
& 0xf0000) |
5205 ((read_exec_only
^ 1) << 9) |
5207 ((seg_not_present
^ 1) << 15) |
5209 (limit_in_pages
<< 23) |
5213 entry_2
|= (useable
<< 20);
5215 /* Install the new entry ... */
5217 lp
= (uint32_t *)(ldt_table
+ (ldt_info
.entry_number
<< 3));
5218 lp
[0] = tswap32(entry_1
);
5219 lp
[1] = tswap32(entry_2
);
5223 /* specific and weird i386 syscalls */
5224 static abi_long
do_modify_ldt(CPUX86State
*env
, int func
, abi_ulong ptr
,
5225 unsigned long bytecount
)
5231 ret
= read_ldt(ptr
, bytecount
);
5234 ret
= write_ldt(env
, ptr
, bytecount
, 1);
5237 ret
= write_ldt(env
, ptr
, bytecount
, 0);
5240 ret
= -TARGET_ENOSYS
;
5246 #if defined(TARGET_I386) && defined(TARGET_ABI32)
5247 abi_long
do_set_thread_area(CPUX86State
*env
, abi_ulong ptr
)
5249 uint64_t *gdt_table
= g2h(env
->gdt
.base
);
5250 struct target_modify_ldt_ldt_s ldt_info
;
5251 struct target_modify_ldt_ldt_s
*target_ldt_info
;
5252 int seg_32bit
, contents
, read_exec_only
, limit_in_pages
;
5253 int seg_not_present
, useable
, lm
;
5254 uint32_t *lp
, entry_1
, entry_2
;
5257 lock_user_struct(VERIFY_WRITE
, target_ldt_info
, ptr
, 1);
5258 if (!target_ldt_info
)
5259 return -TARGET_EFAULT
;
5260 ldt_info
.entry_number
= tswap32(target_ldt_info
->entry_number
);
5261 ldt_info
.base_addr
= tswapal(target_ldt_info
->base_addr
);
5262 ldt_info
.limit
= tswap32(target_ldt_info
->limit
);
5263 ldt_info
.flags
= tswap32(target_ldt_info
->flags
);
5264 if (ldt_info
.entry_number
== -1) {
5265 for (i
=TARGET_GDT_ENTRY_TLS_MIN
; i
<=TARGET_GDT_ENTRY_TLS_MAX
; i
++) {
5266 if (gdt_table
[i
] == 0) {
5267 ldt_info
.entry_number
= i
;
5268 target_ldt_info
->entry_number
= tswap32(i
);
5273 unlock_user_struct(target_ldt_info
, ptr
, 1);
5275 if (ldt_info
.entry_number
< TARGET_GDT_ENTRY_TLS_MIN
||
5276 ldt_info
.entry_number
> TARGET_GDT_ENTRY_TLS_MAX
)
5277 return -TARGET_EINVAL
;
5278 seg_32bit
= ldt_info
.flags
& 1;
5279 contents
= (ldt_info
.flags
>> 1) & 3;
5280 read_exec_only
= (ldt_info
.flags
>> 3) & 1;
5281 limit_in_pages
= (ldt_info
.flags
>> 4) & 1;
5282 seg_not_present
= (ldt_info
.flags
>> 5) & 1;
5283 useable
= (ldt_info
.flags
>> 6) & 1;
5287 lm
= (ldt_info
.flags
>> 7) & 1;
5290 if (contents
== 3) {
5291 if (seg_not_present
== 0)
5292 return -TARGET_EINVAL
;
5295 /* NOTE: same code as Linux kernel */
5296 /* Allow LDTs to be cleared by the user. */
5297 if (ldt_info
.base_addr
== 0 && ldt_info
.limit
== 0) {
5298 if ((contents
== 0 &&
5299 read_exec_only
== 1 &&
5301 limit_in_pages
== 0 &&
5302 seg_not_present
== 1 &&
5310 entry_1
= ((ldt_info
.base_addr
& 0x0000ffff) << 16) |
5311 (ldt_info
.limit
& 0x0ffff);
5312 entry_2
= (ldt_info
.base_addr
& 0xff000000) |
5313 ((ldt_info
.base_addr
& 0x00ff0000) >> 16) |
5314 (ldt_info
.limit
& 0xf0000) |
5315 ((read_exec_only
^ 1) << 9) |
5317 ((seg_not_present
^ 1) << 15) |
5319 (limit_in_pages
<< 23) |
5324 /* Install the new entry ... */
5326 lp
= (uint32_t *)(gdt_table
+ ldt_info
.entry_number
);
5327 lp
[0] = tswap32(entry_1
);
5328 lp
[1] = tswap32(entry_2
);
5332 static abi_long
do_get_thread_area(CPUX86State
*env
, abi_ulong ptr
)
5334 struct target_modify_ldt_ldt_s
*target_ldt_info
;
5335 uint64_t *gdt_table
= g2h(env
->gdt
.base
);
5336 uint32_t base_addr
, limit
, flags
;
5337 int seg_32bit
, contents
, read_exec_only
, limit_in_pages
, idx
;
5338 int seg_not_present
, useable
, lm
;
5339 uint32_t *lp
, entry_1
, entry_2
;
5341 lock_user_struct(VERIFY_WRITE
, target_ldt_info
, ptr
, 1);
5342 if (!target_ldt_info
)
5343 return -TARGET_EFAULT
;
5344 idx
= tswap32(target_ldt_info
->entry_number
);
5345 if (idx
< TARGET_GDT_ENTRY_TLS_MIN
||
5346 idx
> TARGET_GDT_ENTRY_TLS_MAX
) {
5347 unlock_user_struct(target_ldt_info
, ptr
, 1);
5348 return -TARGET_EINVAL
;
5350 lp
= (uint32_t *)(gdt_table
+ idx
);
5351 entry_1
= tswap32(lp
[0]);
5352 entry_2
= tswap32(lp
[1]);
5354 read_exec_only
= ((entry_2
>> 9) & 1) ^ 1;
5355 contents
= (entry_2
>> 10) & 3;
5356 seg_not_present
= ((entry_2
>> 15) & 1) ^ 1;
5357 seg_32bit
= (entry_2
>> 22) & 1;
5358 limit_in_pages
= (entry_2
>> 23) & 1;
5359 useable
= (entry_2
>> 20) & 1;
5363 lm
= (entry_2
>> 21) & 1;
5365 flags
= (seg_32bit
<< 0) | (contents
<< 1) |
5366 (read_exec_only
<< 3) | (limit_in_pages
<< 4) |
5367 (seg_not_present
<< 5) | (useable
<< 6) | (lm
<< 7);
5368 limit
= (entry_1
& 0xffff) | (entry_2
& 0xf0000);
5369 base_addr
= (entry_1
>> 16) |
5370 (entry_2
& 0xff000000) |
5371 ((entry_2
& 0xff) << 16);
5372 target_ldt_info
->base_addr
= tswapal(base_addr
);
5373 target_ldt_info
->limit
= tswap32(limit
);
5374 target_ldt_info
->flags
= tswap32(flags
);
5375 unlock_user_struct(target_ldt_info
, ptr
, 1);
5378 #endif /* TARGET_I386 && TARGET_ABI32 */
5380 #ifndef TARGET_ABI32
5381 abi_long
do_arch_prctl(CPUX86State
*env
, int code
, abi_ulong addr
)
5388 case TARGET_ARCH_SET_GS
:
5389 case TARGET_ARCH_SET_FS
:
5390 if (code
== TARGET_ARCH_SET_GS
)
5394 cpu_x86_load_seg(env
, idx
, 0);
5395 env
->segs
[idx
].base
= addr
;
5397 case TARGET_ARCH_GET_GS
:
5398 case TARGET_ARCH_GET_FS
:
5399 if (code
== TARGET_ARCH_GET_GS
)
5403 val
= env
->segs
[idx
].base
;
5404 if (put_user(val
, addr
, abi_ulong
))
5405 ret
= -TARGET_EFAULT
;
5408 ret
= -TARGET_EINVAL
;
5415 #endif /* defined(TARGET_I386) */
5417 #define NEW_STACK_SIZE 0x40000
5420 static pthread_mutex_t clone_lock
= PTHREAD_MUTEX_INITIALIZER
;
5423 pthread_mutex_t mutex
;
5424 pthread_cond_t cond
;
5427 abi_ulong child_tidptr
;
5428 abi_ulong parent_tidptr
;
5432 static void *clone_func(void *arg
)
5434 new_thread_info
*info
= arg
;
5439 rcu_register_thread();
5440 tcg_register_thread();
5442 cpu
= ENV_GET_CPU(env
);
5444 ts
= (TaskState
*)cpu
->opaque
;
5445 info
->tid
= gettid();
5447 if (info
->child_tidptr
)
5448 put_user_u32(info
->tid
, info
->child_tidptr
);
5449 if (info
->parent_tidptr
)
5450 put_user_u32(info
->tid
, info
->parent_tidptr
);
5451 /* Enable signals. */
5452 sigprocmask(SIG_SETMASK
, &info
->sigmask
, NULL
);
5453 /* Signal to the parent that we're ready. */
5454 pthread_mutex_lock(&info
->mutex
);
5455 pthread_cond_broadcast(&info
->cond
);
5456 pthread_mutex_unlock(&info
->mutex
);
5457 /* Wait until the parent has finished initializing the tls state. */
5458 pthread_mutex_lock(&clone_lock
);
5459 pthread_mutex_unlock(&clone_lock
);
5465 /* do_fork() Must return host values and target errnos (unlike most
5466 do_*() functions). */
5467 static int do_fork(CPUArchState
*env
, unsigned int flags
, abi_ulong newsp
,
5468 abi_ulong parent_tidptr
, target_ulong newtls
,
5469 abi_ulong child_tidptr
)
5471 CPUState
*cpu
= ENV_GET_CPU(env
);
5475 CPUArchState
*new_env
;
5478 flags
&= ~CLONE_IGNORED_FLAGS
;
5480 /* Emulate vfork() with fork() */
5481 if (flags
& CLONE_VFORK
)
5482 flags
&= ~(CLONE_VFORK
| CLONE_VM
);
5484 if (flags
& CLONE_VM
) {
5485 TaskState
*parent_ts
= (TaskState
*)cpu
->opaque
;
5486 new_thread_info info
;
5487 pthread_attr_t attr
;
5489 if (((flags
& CLONE_THREAD_FLAGS
) != CLONE_THREAD_FLAGS
) ||
5490 (flags
& CLONE_INVALID_THREAD_FLAGS
)) {
5491 return -TARGET_EINVAL
;
5494 ts
= g_new0(TaskState
, 1);
5495 init_task_state(ts
);
5497 /* Grab a mutex so that thread setup appears atomic. */
5498 pthread_mutex_lock(&clone_lock
);
5500 /* we create a new CPU instance. */
5501 new_env
= cpu_copy(env
);
5502 /* Init regs that differ from the parent. */
5503 cpu_clone_regs(new_env
, newsp
);
5504 new_cpu
= ENV_GET_CPU(new_env
);
5505 new_cpu
->opaque
= ts
;
5506 ts
->bprm
= parent_ts
->bprm
;
5507 ts
->info
= parent_ts
->info
;
5508 ts
->signal_mask
= parent_ts
->signal_mask
;
5510 if (flags
& CLONE_CHILD_CLEARTID
) {
5511 ts
->child_tidptr
= child_tidptr
;
5514 if (flags
& CLONE_SETTLS
) {
5515 cpu_set_tls (new_env
, newtls
);
5518 memset(&info
, 0, sizeof(info
));
5519 pthread_mutex_init(&info
.mutex
, NULL
);
5520 pthread_mutex_lock(&info
.mutex
);
5521 pthread_cond_init(&info
.cond
, NULL
);
5523 if (flags
& CLONE_CHILD_SETTID
) {
5524 info
.child_tidptr
= child_tidptr
;
5526 if (flags
& CLONE_PARENT_SETTID
) {
5527 info
.parent_tidptr
= parent_tidptr
;
5530 ret
= pthread_attr_init(&attr
);
5531 ret
= pthread_attr_setstacksize(&attr
, NEW_STACK_SIZE
);
5532 ret
= pthread_attr_setdetachstate(&attr
, PTHREAD_CREATE_DETACHED
);
5533 /* It is not safe to deliver signals until the child has finished
5534 initializing, so temporarily block all signals. */
5535 sigfillset(&sigmask
);
5536 sigprocmask(SIG_BLOCK
, &sigmask
, &info
.sigmask
);
5538 /* If this is our first additional thread, we need to ensure we
5539 * generate code for parallel execution and flush old translations.
5541 if (!parallel_cpus
) {
5542 parallel_cpus
= true;
5546 ret
= pthread_create(&info
.thread
, &attr
, clone_func
, &info
);
5547 /* TODO: Free new CPU state if thread creation failed. */
5549 sigprocmask(SIG_SETMASK
, &info
.sigmask
, NULL
);
5550 pthread_attr_destroy(&attr
);
5552 /* Wait for the child to initialize. */
5553 pthread_cond_wait(&info
.cond
, &info
.mutex
);
5558 pthread_mutex_unlock(&info
.mutex
);
5559 pthread_cond_destroy(&info
.cond
);
5560 pthread_mutex_destroy(&info
.mutex
);
5561 pthread_mutex_unlock(&clone_lock
);
5563 /* if no CLONE_VM, we consider it is a fork */
5564 if (flags
& CLONE_INVALID_FORK_FLAGS
) {
5565 return -TARGET_EINVAL
;
5568 /* We can't support custom termination signals */
5569 if ((flags
& CSIGNAL
) != TARGET_SIGCHLD
) {
5570 return -TARGET_EINVAL
;
5573 if (block_signals()) {
5574 return -TARGET_ERESTARTSYS
;
5580 /* Child Process. */
5581 cpu_clone_regs(env
, newsp
);
5583 /* There is a race condition here. The parent process could
5584 theoretically read the TID in the child process before the child
5585 tid is set. This would require using either ptrace
5586 (not implemented) or having *_tidptr to point at a shared memory
5587 mapping. We can't repeat the spinlock hack used above because
5588 the child process gets its own copy of the lock. */
5589 if (flags
& CLONE_CHILD_SETTID
)
5590 put_user_u32(gettid(), child_tidptr
);
5591 if (flags
& CLONE_PARENT_SETTID
)
5592 put_user_u32(gettid(), parent_tidptr
);
5593 ts
= (TaskState
*)cpu
->opaque
;
5594 if (flags
& CLONE_SETTLS
)
5595 cpu_set_tls (env
, newtls
);
5596 if (flags
& CLONE_CHILD_CLEARTID
)
5597 ts
->child_tidptr
= child_tidptr
;
5605 /* warning : doesn't handle linux specific flags... */
5606 static int target_to_host_fcntl_cmd(int cmd
)
5611 case TARGET_F_DUPFD
:
5612 case TARGET_F_GETFD
:
5613 case TARGET_F_SETFD
:
5614 case TARGET_F_GETFL
:
5615 case TARGET_F_SETFL
:
5618 case TARGET_F_GETLK
:
5621 case TARGET_F_SETLK
:
5624 case TARGET_F_SETLKW
:
5627 case TARGET_F_GETOWN
:
5630 case TARGET_F_SETOWN
:
5633 case TARGET_F_GETSIG
:
5636 case TARGET_F_SETSIG
:
5639 #if TARGET_ABI_BITS == 32
5640 case TARGET_F_GETLK64
:
5643 case TARGET_F_SETLK64
:
5646 case TARGET_F_SETLKW64
:
5650 case TARGET_F_SETLEASE
:
5653 case TARGET_F_GETLEASE
:
5656 #ifdef F_DUPFD_CLOEXEC
5657 case TARGET_F_DUPFD_CLOEXEC
:
5658 ret
= F_DUPFD_CLOEXEC
;
5661 case TARGET_F_NOTIFY
:
5665 case TARGET_F_GETOWN_EX
:
5670 case TARGET_F_SETOWN_EX
:
5675 case TARGET_F_SETPIPE_SZ
:
5678 case TARGET_F_GETPIPE_SZ
:
5683 ret
= -TARGET_EINVAL
;
5687 #if defined(__powerpc64__)
5688 /* On PPC64, glibc headers has the F_*LK* defined to 12, 13 and 14 and
5689 * is not supported by kernel. The glibc fcntl call actually adjusts
5690 * them to 5, 6 and 7 before making the syscall(). Since we make the
5691 * syscall directly, adjust to what is supported by the kernel.
5693 if (ret
>= F_GETLK64
&& ret
<= F_SETLKW64
) {
5694 ret
-= F_GETLK64
- 5;
5701 #define FLOCK_TRANSTBL \
5703 TRANSTBL_CONVERT(F_RDLCK); \
5704 TRANSTBL_CONVERT(F_WRLCK); \
5705 TRANSTBL_CONVERT(F_UNLCK); \
5706 TRANSTBL_CONVERT(F_EXLCK); \
5707 TRANSTBL_CONVERT(F_SHLCK); \
5710 static int target_to_host_flock(int type
)
5712 #define TRANSTBL_CONVERT(a) case TARGET_##a: return a
5714 #undef TRANSTBL_CONVERT
5715 return -TARGET_EINVAL
;
5718 static int host_to_target_flock(int type
)
5720 #define TRANSTBL_CONVERT(a) case a: return TARGET_##a
5722 #undef TRANSTBL_CONVERT
5723 /* if we don't know how to convert the value coming
5724 * from the host we copy to the target field as-is
5729 static inline abi_long
copy_from_user_flock(struct flock64
*fl
,
5730 abi_ulong target_flock_addr
)
5732 struct target_flock
*target_fl
;
5735 if (!lock_user_struct(VERIFY_READ
, target_fl
, target_flock_addr
, 1)) {
5736 return -TARGET_EFAULT
;
5739 __get_user(l_type
, &target_fl
->l_type
);
5740 l_type
= target_to_host_flock(l_type
);
5744 fl
->l_type
= l_type
;
5745 __get_user(fl
->l_whence
, &target_fl
->l_whence
);
5746 __get_user(fl
->l_start
, &target_fl
->l_start
);
5747 __get_user(fl
->l_len
, &target_fl
->l_len
);
5748 __get_user(fl
->l_pid
, &target_fl
->l_pid
);
5749 unlock_user_struct(target_fl
, target_flock_addr
, 0);
5753 static inline abi_long
copy_to_user_flock(abi_ulong target_flock_addr
,
5754 const struct flock64
*fl
)
5756 struct target_flock
*target_fl
;
5759 if (!lock_user_struct(VERIFY_WRITE
, target_fl
, target_flock_addr
, 0)) {
5760 return -TARGET_EFAULT
;
5763 l_type
= host_to_target_flock(fl
->l_type
);
5764 __put_user(l_type
, &target_fl
->l_type
);
5765 __put_user(fl
->l_whence
, &target_fl
->l_whence
);
5766 __put_user(fl
->l_start
, &target_fl
->l_start
);
5767 __put_user(fl
->l_len
, &target_fl
->l_len
);
5768 __put_user(fl
->l_pid
, &target_fl
->l_pid
);
5769 unlock_user_struct(target_fl
, target_flock_addr
, 1);
5773 typedef abi_long
from_flock64_fn(struct flock64
*fl
, abi_ulong target_addr
);
5774 typedef abi_long
to_flock64_fn(abi_ulong target_addr
, const struct flock64
*fl
);
5776 #if defined(TARGET_ARM) && TARGET_ABI_BITS == 32
5777 static inline abi_long
copy_from_user_oabi_flock64(struct flock64
*fl
,
5778 abi_ulong target_flock_addr
)
5780 struct target_oabi_flock64
*target_fl
;
5783 if (!lock_user_struct(VERIFY_READ
, target_fl
, target_flock_addr
, 1)) {
5784 return -TARGET_EFAULT
;
5787 __get_user(l_type
, &target_fl
->l_type
);
5788 l_type
= target_to_host_flock(l_type
);
5792 fl
->l_type
= l_type
;
5793 __get_user(fl
->l_whence
, &target_fl
->l_whence
);
5794 __get_user(fl
->l_start
, &target_fl
->l_start
);
5795 __get_user(fl
->l_len
, &target_fl
->l_len
);
5796 __get_user(fl
->l_pid
, &target_fl
->l_pid
);
5797 unlock_user_struct(target_fl
, target_flock_addr
, 0);
5801 static inline abi_long
copy_to_user_oabi_flock64(abi_ulong target_flock_addr
,
5802 const struct flock64
*fl
)
5804 struct target_oabi_flock64
*target_fl
;
5807 if (!lock_user_struct(VERIFY_WRITE
, target_fl
, target_flock_addr
, 0)) {
5808 return -TARGET_EFAULT
;
5811 l_type
= host_to_target_flock(fl
->l_type
);
5812 __put_user(l_type
, &target_fl
->l_type
);
5813 __put_user(fl
->l_whence
, &target_fl
->l_whence
);
5814 __put_user(fl
->l_start
, &target_fl
->l_start
);
5815 __put_user(fl
->l_len
, &target_fl
->l_len
);
5816 __put_user(fl
->l_pid
, &target_fl
->l_pid
);
5817 unlock_user_struct(target_fl
, target_flock_addr
, 1);
5822 static inline abi_long
copy_from_user_flock64(struct flock64
*fl
,
5823 abi_ulong target_flock_addr
)
5825 struct target_flock64
*target_fl
;
5828 if (!lock_user_struct(VERIFY_READ
, target_fl
, target_flock_addr
, 1)) {
5829 return -TARGET_EFAULT
;
5832 __get_user(l_type
, &target_fl
->l_type
);
5833 l_type
= target_to_host_flock(l_type
);
5837 fl
->l_type
= l_type
;
5838 __get_user(fl
->l_whence
, &target_fl
->l_whence
);
5839 __get_user(fl
->l_start
, &target_fl
->l_start
);
5840 __get_user(fl
->l_len
, &target_fl
->l_len
);
5841 __get_user(fl
->l_pid
, &target_fl
->l_pid
);
5842 unlock_user_struct(target_fl
, target_flock_addr
, 0);
5846 static inline abi_long
copy_to_user_flock64(abi_ulong target_flock_addr
,
5847 const struct flock64
*fl
)
5849 struct target_flock64
*target_fl
;
5852 if (!lock_user_struct(VERIFY_WRITE
, target_fl
, target_flock_addr
, 0)) {
5853 return -TARGET_EFAULT
;
5856 l_type
= host_to_target_flock(fl
->l_type
);
5857 __put_user(l_type
, &target_fl
->l_type
);
5858 __put_user(fl
->l_whence
, &target_fl
->l_whence
);
5859 __put_user(fl
->l_start
, &target_fl
->l_start
);
5860 __put_user(fl
->l_len
, &target_fl
->l_len
);
5861 __put_user(fl
->l_pid
, &target_fl
->l_pid
);
5862 unlock_user_struct(target_fl
, target_flock_addr
, 1);
5866 static abi_long
do_fcntl(int fd
, int cmd
, abi_ulong arg
)
5868 struct flock64 fl64
;
5870 struct f_owner_ex fox
;
5871 struct target_f_owner_ex
*target_fox
;
5874 int host_cmd
= target_to_host_fcntl_cmd(cmd
);
5876 if (host_cmd
== -TARGET_EINVAL
)
5880 case TARGET_F_GETLK
:
5881 ret
= copy_from_user_flock(&fl64
, arg
);
5885 ret
= get_errno(safe_fcntl(fd
, host_cmd
, &fl64
));
5887 ret
= copy_to_user_flock(arg
, &fl64
);
5891 case TARGET_F_SETLK
:
5892 case TARGET_F_SETLKW
:
5893 ret
= copy_from_user_flock(&fl64
, arg
);
5897 ret
= get_errno(safe_fcntl(fd
, host_cmd
, &fl64
));
5900 case TARGET_F_GETLK64
:
5901 ret
= copy_from_user_flock64(&fl64
, arg
);
5905 ret
= get_errno(safe_fcntl(fd
, host_cmd
, &fl64
));
5907 ret
= copy_to_user_flock64(arg
, &fl64
);
5910 case TARGET_F_SETLK64
:
5911 case TARGET_F_SETLKW64
:
5912 ret
= copy_from_user_flock64(&fl64
, arg
);
5916 ret
= get_errno(safe_fcntl(fd
, host_cmd
, &fl64
));
5919 case TARGET_F_GETFL
:
5920 ret
= get_errno(safe_fcntl(fd
, host_cmd
, arg
));
5922 ret
= host_to_target_bitmask(ret
, fcntl_flags_tbl
);
5926 case TARGET_F_SETFL
:
5927 ret
= get_errno(safe_fcntl(fd
, host_cmd
,
5928 target_to_host_bitmask(arg
,
5933 case TARGET_F_GETOWN_EX
:
5934 ret
= get_errno(safe_fcntl(fd
, host_cmd
, &fox
));
5936 if (!lock_user_struct(VERIFY_WRITE
, target_fox
, arg
, 0))
5937 return -TARGET_EFAULT
;
5938 target_fox
->type
= tswap32(fox
.type
);
5939 target_fox
->pid
= tswap32(fox
.pid
);
5940 unlock_user_struct(target_fox
, arg
, 1);
5946 case TARGET_F_SETOWN_EX
:
5947 if (!lock_user_struct(VERIFY_READ
, target_fox
, arg
, 1))
5948 return -TARGET_EFAULT
;
5949 fox
.type
= tswap32(target_fox
->type
);
5950 fox
.pid
= tswap32(target_fox
->pid
);
5951 unlock_user_struct(target_fox
, arg
, 0);
5952 ret
= get_errno(safe_fcntl(fd
, host_cmd
, &fox
));
5956 case TARGET_F_SETOWN
:
5957 case TARGET_F_GETOWN
:
5958 case TARGET_F_SETSIG
:
5959 case TARGET_F_GETSIG
:
5960 case TARGET_F_SETLEASE
:
5961 case TARGET_F_GETLEASE
:
5962 case TARGET_F_SETPIPE_SZ
:
5963 case TARGET_F_GETPIPE_SZ
:
5964 ret
= get_errno(safe_fcntl(fd
, host_cmd
, arg
));
5968 ret
= get_errno(safe_fcntl(fd
, cmd
, arg
));
5976 static inline int high2lowuid(int uid
)
5984 static inline int high2lowgid(int gid
)
5992 static inline int low2highuid(int uid
)
5994 if ((int16_t)uid
== -1)
6000 static inline int low2highgid(int gid
)
6002 if ((int16_t)gid
== -1)
6007 static inline int tswapid(int id
)
6012 #define put_user_id(x, gaddr) put_user_u16(x, gaddr)
6014 #else /* !USE_UID16 */
6015 static inline int high2lowuid(int uid
)
6019 static inline int high2lowgid(int gid
)
6023 static inline int low2highuid(int uid
)
6027 static inline int low2highgid(int gid
)
6031 static inline int tswapid(int id
)
6036 #define put_user_id(x, gaddr) put_user_u32(x, gaddr)
6038 #endif /* USE_UID16 */
6040 /* We must do direct syscalls for setting UID/GID, because we want to
6041 * implement the Linux system call semantics of "change only for this thread",
6042 * not the libc/POSIX semantics of "change for all threads in process".
6043 * (See http://ewontfix.com/17/ for more details.)
6044 * We use the 32-bit version of the syscalls if present; if it is not
6045 * then either the host architecture supports 32-bit UIDs natively with
6046 * the standard syscall, or the 16-bit UID is the best we can do.
6048 #ifdef __NR_setuid32
6049 #define __NR_sys_setuid __NR_setuid32
6051 #define __NR_sys_setuid __NR_setuid
6053 #ifdef __NR_setgid32
6054 #define __NR_sys_setgid __NR_setgid32
6056 #define __NR_sys_setgid __NR_setgid
6058 #ifdef __NR_setresuid32
6059 #define __NR_sys_setresuid __NR_setresuid32
6061 #define __NR_sys_setresuid __NR_setresuid
6063 #ifdef __NR_setresgid32
6064 #define __NR_sys_setresgid __NR_setresgid32
6066 #define __NR_sys_setresgid __NR_setresgid
6069 _syscall1(int, sys_setuid
, uid_t
, uid
)
6070 _syscall1(int, sys_setgid
, gid_t
, gid
)
6071 _syscall3(int, sys_setresuid
, uid_t
, ruid
, uid_t
, euid
, uid_t
, suid
)
6072 _syscall3(int, sys_setresgid
, gid_t
, rgid
, gid_t
, egid
, gid_t
, sgid
)
6074 void syscall_init(void)
6077 const argtype
*arg_type
;
6081 thunk_init(STRUCT_MAX
);
6083 #define STRUCT(name, ...) thunk_register_struct(STRUCT_ ## name, #name, struct_ ## name ## _def);
6084 #define STRUCT_SPECIAL(name) thunk_register_struct_direct(STRUCT_ ## name, #name, &struct_ ## name ## _def);
6085 #include "syscall_types.h"
6087 #undef STRUCT_SPECIAL
6089 /* Build target_to_host_errno_table[] table from
6090 * host_to_target_errno_table[]. */
6091 for (i
= 0; i
< ERRNO_TABLE_SIZE
; i
++) {
6092 target_to_host_errno_table
[host_to_target_errno_table
[i
]] = i
;
6095 /* we patch the ioctl size if necessary. We rely on the fact that
6096 no ioctl has all the bits at '1' in the size field */
6098 while (ie
->target_cmd
!= 0) {
6099 if (((ie
->target_cmd
>> TARGET_IOC_SIZESHIFT
) & TARGET_IOC_SIZEMASK
) ==
6100 TARGET_IOC_SIZEMASK
) {
6101 arg_type
= ie
->arg_type
;
6102 if (arg_type
[0] != TYPE_PTR
) {
6103 fprintf(stderr
, "cannot patch size for ioctl 0x%x\n",
6108 size
= thunk_type_size(arg_type
, 0);
6109 ie
->target_cmd
= (ie
->target_cmd
&
6110 ~(TARGET_IOC_SIZEMASK
<< TARGET_IOC_SIZESHIFT
)) |
6111 (size
<< TARGET_IOC_SIZESHIFT
);
6114 /* automatic consistency check if same arch */
6115 #if (defined(__i386__) && defined(TARGET_I386) && defined(TARGET_ABI32)) || \
6116 (defined(__x86_64__) && defined(TARGET_X86_64))
6117 if (unlikely(ie
->target_cmd
!= ie
->host_cmd
)) {
6118 fprintf(stderr
, "ERROR: ioctl(%s): target=0x%x host=0x%x\n",
6119 ie
->name
, ie
->target_cmd
, ie
->host_cmd
);
6126 #if TARGET_ABI_BITS == 32
6127 static inline uint64_t target_offset64(uint32_t word0
, uint32_t word1
)
6129 #ifdef TARGET_WORDS_BIGENDIAN
6130 return ((uint64_t)word0
<< 32) | word1
;
6132 return ((uint64_t)word1
<< 32) | word0
;
6135 #else /* TARGET_ABI_BITS == 32 */
6136 static inline uint64_t target_offset64(uint64_t word0
, uint64_t word1
)
6140 #endif /* TARGET_ABI_BITS != 32 */
6142 #ifdef TARGET_NR_truncate64
6143 static inline abi_long
target_truncate64(void *cpu_env
, const char *arg1
,
6148 if (regpairs_aligned(cpu_env
, TARGET_NR_truncate64
)) {
6152 return get_errno(truncate64(arg1
, target_offset64(arg2
, arg3
)));
6156 #ifdef TARGET_NR_ftruncate64
6157 static inline abi_long
target_ftruncate64(void *cpu_env
, abi_long arg1
,
6162 if (regpairs_aligned(cpu_env
, TARGET_NR_ftruncate64
)) {
6166 return get_errno(ftruncate64(arg1
, target_offset64(arg2
, arg3
)));
6170 static inline abi_long
target_to_host_timespec(struct timespec
*host_ts
,
6171 abi_ulong target_addr
)
6173 struct target_timespec
*target_ts
;
6175 if (!lock_user_struct(VERIFY_READ
, target_ts
, target_addr
, 1))
6176 return -TARGET_EFAULT
;
6177 __get_user(host_ts
->tv_sec
, &target_ts
->tv_sec
);
6178 __get_user(host_ts
->tv_nsec
, &target_ts
->tv_nsec
);
6179 unlock_user_struct(target_ts
, target_addr
, 0);
6183 static inline abi_long
host_to_target_timespec(abi_ulong target_addr
,
6184 struct timespec
*host_ts
)
6186 struct target_timespec
*target_ts
;
6188 if (!lock_user_struct(VERIFY_WRITE
, target_ts
, target_addr
, 0))
6189 return -TARGET_EFAULT
;
6190 __put_user(host_ts
->tv_sec
, &target_ts
->tv_sec
);
6191 __put_user(host_ts
->tv_nsec
, &target_ts
->tv_nsec
);
6192 unlock_user_struct(target_ts
, target_addr
, 1);
6196 static inline abi_long
target_to_host_itimerspec(struct itimerspec
*host_itspec
,
6197 abi_ulong target_addr
)
6199 struct target_itimerspec
*target_itspec
;
6201 if (!lock_user_struct(VERIFY_READ
, target_itspec
, target_addr
, 1)) {
6202 return -TARGET_EFAULT
;
6205 host_itspec
->it_interval
.tv_sec
=
6206 tswapal(target_itspec
->it_interval
.tv_sec
);
6207 host_itspec
->it_interval
.tv_nsec
=
6208 tswapal(target_itspec
->it_interval
.tv_nsec
);
6209 host_itspec
->it_value
.tv_sec
= tswapal(target_itspec
->it_value
.tv_sec
);
6210 host_itspec
->it_value
.tv_nsec
= tswapal(target_itspec
->it_value
.tv_nsec
);
6212 unlock_user_struct(target_itspec
, target_addr
, 1);
6216 static inline abi_long
host_to_target_itimerspec(abi_ulong target_addr
,
6217 struct itimerspec
*host_its
)
6219 struct target_itimerspec
*target_itspec
;
6221 if (!lock_user_struct(VERIFY_WRITE
, target_itspec
, target_addr
, 0)) {
6222 return -TARGET_EFAULT
;
6225 target_itspec
->it_interval
.tv_sec
= tswapal(host_its
->it_interval
.tv_sec
);
6226 target_itspec
->it_interval
.tv_nsec
= tswapal(host_its
->it_interval
.tv_nsec
);
6228 target_itspec
->it_value
.tv_sec
= tswapal(host_its
->it_value
.tv_sec
);
6229 target_itspec
->it_value
.tv_nsec
= tswapal(host_its
->it_value
.tv_nsec
);
6231 unlock_user_struct(target_itspec
, target_addr
, 0);
6235 static inline abi_long
target_to_host_timex(struct timex
*host_tx
,
6236 abi_long target_addr
)
6238 struct target_timex
*target_tx
;
6240 if (!lock_user_struct(VERIFY_READ
, target_tx
, target_addr
, 1)) {
6241 return -TARGET_EFAULT
;
6244 __get_user(host_tx
->modes
, &target_tx
->modes
);
6245 __get_user(host_tx
->offset
, &target_tx
->offset
);
6246 __get_user(host_tx
->freq
, &target_tx
->freq
);
6247 __get_user(host_tx
->maxerror
, &target_tx
->maxerror
);
6248 __get_user(host_tx
->esterror
, &target_tx
->esterror
);
6249 __get_user(host_tx
->status
, &target_tx
->status
);
6250 __get_user(host_tx
->constant
, &target_tx
->constant
);
6251 __get_user(host_tx
->precision
, &target_tx
->precision
);
6252 __get_user(host_tx
->tolerance
, &target_tx
->tolerance
);
6253 __get_user(host_tx
->time
.tv_sec
, &target_tx
->time
.tv_sec
);
6254 __get_user(host_tx
->time
.tv_usec
, &target_tx
->time
.tv_usec
);
6255 __get_user(host_tx
->tick
, &target_tx
->tick
);
6256 __get_user(host_tx
->ppsfreq
, &target_tx
->ppsfreq
);
6257 __get_user(host_tx
->jitter
, &target_tx
->jitter
);
6258 __get_user(host_tx
->shift
, &target_tx
->shift
);
6259 __get_user(host_tx
->stabil
, &target_tx
->stabil
);
6260 __get_user(host_tx
->jitcnt
, &target_tx
->jitcnt
);
6261 __get_user(host_tx
->calcnt
, &target_tx
->calcnt
);
6262 __get_user(host_tx
->errcnt
, &target_tx
->errcnt
);
6263 __get_user(host_tx
->stbcnt
, &target_tx
->stbcnt
);
6264 __get_user(host_tx
->tai
, &target_tx
->tai
);
6266 unlock_user_struct(target_tx
, target_addr
, 0);
6270 static inline abi_long
host_to_target_timex(abi_long target_addr
,
6271 struct timex
*host_tx
)
6273 struct target_timex
*target_tx
;
6275 if (!lock_user_struct(VERIFY_WRITE
, target_tx
, target_addr
, 0)) {
6276 return -TARGET_EFAULT
;
6279 __put_user(host_tx
->modes
, &target_tx
->modes
);
6280 __put_user(host_tx
->offset
, &target_tx
->offset
);
6281 __put_user(host_tx
->freq
, &target_tx
->freq
);
6282 __put_user(host_tx
->maxerror
, &target_tx
->maxerror
);
6283 __put_user(host_tx
->esterror
, &target_tx
->esterror
);
6284 __put_user(host_tx
->status
, &target_tx
->status
);
6285 __put_user(host_tx
->constant
, &target_tx
->constant
);
6286 __put_user(host_tx
->precision
, &target_tx
->precision
);
6287 __put_user(host_tx
->tolerance
, &target_tx
->tolerance
);
6288 __put_user(host_tx
->time
.tv_sec
, &target_tx
->time
.tv_sec
);
6289 __put_user(host_tx
->time
.tv_usec
, &target_tx
->time
.tv_usec
);
6290 __put_user(host_tx
->tick
, &target_tx
->tick
);
6291 __put_user(host_tx
->ppsfreq
, &target_tx
->ppsfreq
);
6292 __put_user(host_tx
->jitter
, &target_tx
->jitter
);
6293 __put_user(host_tx
->shift
, &target_tx
->shift
);
6294 __put_user(host_tx
->stabil
, &target_tx
->stabil
);
6295 __put_user(host_tx
->jitcnt
, &target_tx
->jitcnt
);
6296 __put_user(host_tx
->calcnt
, &target_tx
->calcnt
);
6297 __put_user(host_tx
->errcnt
, &target_tx
->errcnt
);
6298 __put_user(host_tx
->stbcnt
, &target_tx
->stbcnt
);
6299 __put_user(host_tx
->tai
, &target_tx
->tai
);
6301 unlock_user_struct(target_tx
, target_addr
, 1);
6306 static inline abi_long
target_to_host_sigevent(struct sigevent
*host_sevp
,
6307 abi_ulong target_addr
)
6309 struct target_sigevent
*target_sevp
;
6311 if (!lock_user_struct(VERIFY_READ
, target_sevp
, target_addr
, 1)) {
6312 return -TARGET_EFAULT
;
6315 /* This union is awkward on 64 bit systems because it has a 32 bit
6316 * integer and a pointer in it; we follow the conversion approach
6317 * used for handling sigval types in signal.c so the guest should get
6318 * the correct value back even if we did a 64 bit byteswap and it's
6319 * using the 32 bit integer.
6321 host_sevp
->sigev_value
.sival_ptr
=
6322 (void *)(uintptr_t)tswapal(target_sevp
->sigev_value
.sival_ptr
);
6323 host_sevp
->sigev_signo
=
6324 target_to_host_signal(tswap32(target_sevp
->sigev_signo
));
6325 host_sevp
->sigev_notify
= tswap32(target_sevp
->sigev_notify
);
6326 host_sevp
->_sigev_un
._tid
= tswap32(target_sevp
->_sigev_un
._tid
);
6328 unlock_user_struct(target_sevp
, target_addr
, 1);
6332 #if defined(TARGET_NR_mlockall)
6333 static inline int target_to_host_mlockall_arg(int arg
)
6337 if (arg
& TARGET_MLOCKALL_MCL_CURRENT
) {
6338 result
|= MCL_CURRENT
;
6340 if (arg
& TARGET_MLOCKALL_MCL_FUTURE
) {
6341 result
|= MCL_FUTURE
;
6347 #if (defined(TARGET_NR_stat64) || defined(TARGET_NR_lstat64) || \
6348 defined(TARGET_NR_fstat64) || defined(TARGET_NR_fstatat64) || \
6349 defined(TARGET_NR_newfstatat))
6350 static inline abi_long
host_to_target_stat64(void *cpu_env
,
6351 abi_ulong target_addr
,
6352 struct stat
*host_st
)
6354 #if defined(TARGET_ARM) && defined(TARGET_ABI32)
6355 if (((CPUARMState
*)cpu_env
)->eabi
) {
6356 struct target_eabi_stat64
*target_st
;
6358 if (!lock_user_struct(VERIFY_WRITE
, target_st
, target_addr
, 0))
6359 return -TARGET_EFAULT
;
6360 memset(target_st
, 0, sizeof(struct target_eabi_stat64
));
6361 __put_user(host_st
->st_dev
, &target_st
->st_dev
);
6362 __put_user(host_st
->st_ino
, &target_st
->st_ino
);
6363 #ifdef TARGET_STAT64_HAS_BROKEN_ST_INO
6364 __put_user(host_st
->st_ino
, &target_st
->__st_ino
);
6366 __put_user(host_st
->st_mode
, &target_st
->st_mode
);
6367 __put_user(host_st
->st_nlink
, &target_st
->st_nlink
);
6368 __put_user(host_st
->st_uid
, &target_st
->st_uid
);
6369 __put_user(host_st
->st_gid
, &target_st
->st_gid
);
6370 __put_user(host_st
->st_rdev
, &target_st
->st_rdev
);
6371 __put_user(host_st
->st_size
, &target_st
->st_size
);
6372 __put_user(host_st
->st_blksize
, &target_st
->st_blksize
);
6373 __put_user(host_st
->st_blocks
, &target_st
->st_blocks
);
6374 __put_user(host_st
->st_atime
, &target_st
->target_st_atime
);
6375 __put_user(host_st
->st_mtime
, &target_st
->target_st_mtime
);
6376 __put_user(host_st
->st_ctime
, &target_st
->target_st_ctime
);
6377 unlock_user_struct(target_st
, target_addr
, 1);
6381 #if defined(TARGET_HAS_STRUCT_STAT64)
6382 struct target_stat64
*target_st
;
6384 struct target_stat
*target_st
;
6387 if (!lock_user_struct(VERIFY_WRITE
, target_st
, target_addr
, 0))
6388 return -TARGET_EFAULT
;
6389 memset(target_st
, 0, sizeof(*target_st
));
6390 __put_user(host_st
->st_dev
, &target_st
->st_dev
);
6391 __put_user(host_st
->st_ino
, &target_st
->st_ino
);
6392 #ifdef TARGET_STAT64_HAS_BROKEN_ST_INO
6393 __put_user(host_st
->st_ino
, &target_st
->__st_ino
);
6395 __put_user(host_st
->st_mode
, &target_st
->st_mode
);
6396 __put_user(host_st
->st_nlink
, &target_st
->st_nlink
);
6397 __put_user(host_st
->st_uid
, &target_st
->st_uid
);
6398 __put_user(host_st
->st_gid
, &target_st
->st_gid
);
6399 __put_user(host_st
->st_rdev
, &target_st
->st_rdev
);
6400 /* XXX: better use of kernel struct */
6401 __put_user(host_st
->st_size
, &target_st
->st_size
);
6402 __put_user(host_st
->st_blksize
, &target_st
->st_blksize
);
6403 __put_user(host_st
->st_blocks
, &target_st
->st_blocks
);
6404 __put_user(host_st
->st_atime
, &target_st
->target_st_atime
);
6405 __put_user(host_st
->st_mtime
, &target_st
->target_st_mtime
);
6406 __put_user(host_st
->st_ctime
, &target_st
->target_st_ctime
);
6407 unlock_user_struct(target_st
, target_addr
, 1);
6414 /* ??? Using host futex calls even when target atomic operations
6415 are not really atomic probably breaks things. However implementing
6416 futexes locally would make futexes shared between multiple processes
6417 tricky. However they're probably useless because guest atomic
6418 operations won't work either. */
6419 static int do_futex(target_ulong uaddr
, int op
, int val
, target_ulong timeout
,
6420 target_ulong uaddr2
, int val3
)
6422 struct timespec ts
, *pts
;
6425 /* ??? We assume FUTEX_* constants are the same on both host
6427 #ifdef FUTEX_CMD_MASK
6428 base_op
= op
& FUTEX_CMD_MASK
;
6434 case FUTEX_WAIT_BITSET
:
6437 target_to_host_timespec(pts
, timeout
);
6441 return get_errno(safe_futex(g2h(uaddr
), op
, tswap32(val
),
6444 return get_errno(safe_futex(g2h(uaddr
), op
, val
, NULL
, NULL
, 0));
6446 return get_errno(safe_futex(g2h(uaddr
), op
, val
, NULL
, NULL
, 0));
6448 case FUTEX_CMP_REQUEUE
:
6450 /* For FUTEX_REQUEUE, FUTEX_CMP_REQUEUE, and FUTEX_WAKE_OP, the
6451 TIMEOUT parameter is interpreted as a uint32_t by the kernel.
6452 But the prototype takes a `struct timespec *'; insert casts
6453 to satisfy the compiler. We do not need to tswap TIMEOUT
6454 since it's not compared to guest memory. */
6455 pts
= (struct timespec
*)(uintptr_t) timeout
;
6456 return get_errno(safe_futex(g2h(uaddr
), op
, val
, pts
,
6458 (base_op
== FUTEX_CMP_REQUEUE
6462 return -TARGET_ENOSYS
;
6465 #if defined(TARGET_NR_name_to_handle_at) && defined(CONFIG_OPEN_BY_HANDLE)
6466 static abi_long
do_name_to_handle_at(abi_long dirfd
, abi_long pathname
,
6467 abi_long handle
, abi_long mount_id
,
6470 struct file_handle
*target_fh
;
6471 struct file_handle
*fh
;
6475 unsigned int size
, total_size
;
6477 if (get_user_s32(size
, handle
)) {
6478 return -TARGET_EFAULT
;
6481 name
= lock_user_string(pathname
);
6483 return -TARGET_EFAULT
;
6486 total_size
= sizeof(struct file_handle
) + size
;
6487 target_fh
= lock_user(VERIFY_WRITE
, handle
, total_size
, 0);
6489 unlock_user(name
, pathname
, 0);
6490 return -TARGET_EFAULT
;
6493 fh
= g_malloc0(total_size
);
6494 fh
->handle_bytes
= size
;
6496 ret
= get_errno(name_to_handle_at(dirfd
, path(name
), fh
, &mid
, flags
));
6497 unlock_user(name
, pathname
, 0);
6499 /* man name_to_handle_at(2):
6500 * Other than the use of the handle_bytes field, the caller should treat
6501 * the file_handle structure as an opaque data type
6504 memcpy(target_fh
, fh
, total_size
);
6505 target_fh
->handle_bytes
= tswap32(fh
->handle_bytes
);
6506 target_fh
->handle_type
= tswap32(fh
->handle_type
);
6508 unlock_user(target_fh
, handle
, total_size
);
6510 if (put_user_s32(mid
, mount_id
)) {
6511 return -TARGET_EFAULT
;
6519 #if defined(TARGET_NR_open_by_handle_at) && defined(CONFIG_OPEN_BY_HANDLE)
6520 static abi_long
do_open_by_handle_at(abi_long mount_fd
, abi_long handle
,
6523 struct file_handle
*target_fh
;
6524 struct file_handle
*fh
;
6525 unsigned int size
, total_size
;
6528 if (get_user_s32(size
, handle
)) {
6529 return -TARGET_EFAULT
;
6532 total_size
= sizeof(struct file_handle
) + size
;
6533 target_fh
= lock_user(VERIFY_READ
, handle
, total_size
, 1);
6535 return -TARGET_EFAULT
;
6538 fh
= g_memdup(target_fh
, total_size
);
6539 fh
->handle_bytes
= size
;
6540 fh
->handle_type
= tswap32(target_fh
->handle_type
);
6542 ret
= get_errno(open_by_handle_at(mount_fd
, fh
,
6543 target_to_host_bitmask(flags
, fcntl_flags_tbl
)));
6547 unlock_user(target_fh
, handle
, total_size
);
6553 #if defined(TARGET_NR_signalfd) || defined(TARGET_NR_signalfd4)
6555 static abi_long
do_signalfd4(int fd
, abi_long mask
, int flags
)
6558 target_sigset_t
*target_mask
;
6562 if (flags
& ~(TARGET_O_NONBLOCK
| TARGET_O_CLOEXEC
)) {
6563 return -TARGET_EINVAL
;
6565 if (!lock_user_struct(VERIFY_READ
, target_mask
, mask
, 1)) {
6566 return -TARGET_EFAULT
;
6569 target_to_host_sigset(&host_mask
, target_mask
);
6571 host_flags
= target_to_host_bitmask(flags
, fcntl_flags_tbl
);
6573 ret
= get_errno(signalfd(fd
, &host_mask
, host_flags
));
6575 fd_trans_register(ret
, &target_signalfd_trans
);
6578 unlock_user_struct(target_mask
, mask
, 0);
6584 /* Map host to target signal numbers for the wait family of syscalls.
6585 Assume all other status bits are the same. */
6586 int host_to_target_waitstatus(int status
)
6588 if (WIFSIGNALED(status
)) {
6589 return host_to_target_signal(WTERMSIG(status
)) | (status
& ~0x7f);
6591 if (WIFSTOPPED(status
)) {
6592 return (host_to_target_signal(WSTOPSIG(status
)) << 8)
6598 static int open_self_cmdline(void *cpu_env
, int fd
)
6600 CPUState
*cpu
= ENV_GET_CPU((CPUArchState
*)cpu_env
);
6601 struct linux_binprm
*bprm
= ((TaskState
*)cpu
->opaque
)->bprm
;
6604 for (i
= 0; i
< bprm
->argc
; i
++) {
6605 size_t len
= strlen(bprm
->argv
[i
]) + 1;
6607 if (write(fd
, bprm
->argv
[i
], len
) != len
) {
6615 static int open_self_maps(void *cpu_env
, int fd
)
6617 CPUState
*cpu
= ENV_GET_CPU((CPUArchState
*)cpu_env
);
6618 TaskState
*ts
= cpu
->opaque
;
6624 fp
= fopen("/proc/self/maps", "r");
6629 while ((read
= getline(&line
, &len
, fp
)) != -1) {
6630 int fields
, dev_maj
, dev_min
, inode
;
6631 uint64_t min
, max
, offset
;
6632 char flag_r
, flag_w
, flag_x
, flag_p
;
6633 char path
[512] = "";
6634 fields
= sscanf(line
, "%"PRIx64
"-%"PRIx64
" %c%c%c%c %"PRIx64
" %x:%x %d"
6635 " %512s", &min
, &max
, &flag_r
, &flag_w
, &flag_x
,
6636 &flag_p
, &offset
, &dev_maj
, &dev_min
, &inode
, path
);
6638 if ((fields
< 10) || (fields
> 11)) {
6641 if (h2g_valid(min
)) {
6642 int flags
= page_get_flags(h2g(min
));
6643 max
= h2g_valid(max
- 1) ? max
: (uintptr_t)g2h(GUEST_ADDR_MAX
) + 1;
6644 if (page_check_range(h2g(min
), max
- min
, flags
) == -1) {
6647 if (h2g(min
) == ts
->info
->stack_limit
) {
6648 pstrcpy(path
, sizeof(path
), " [stack]");
6650 dprintf(fd
, TARGET_ABI_FMT_ptr
"-" TARGET_ABI_FMT_ptr
6651 " %c%c%c%c %08" PRIx64
" %02x:%02x %d %s%s\n",
6652 h2g(min
), h2g(max
- 1) + 1, flag_r
, flag_w
,
6653 flag_x
, flag_p
, offset
, dev_maj
, dev_min
, inode
,
6654 path
[0] ? " " : "", path
);
6664 static int open_self_stat(void *cpu_env
, int fd
)
6666 CPUState
*cpu
= ENV_GET_CPU((CPUArchState
*)cpu_env
);
6667 TaskState
*ts
= cpu
->opaque
;
6668 abi_ulong start_stack
= ts
->info
->start_stack
;
6671 for (i
= 0; i
< 44; i
++) {
6679 snprintf(buf
, sizeof(buf
), "%"PRId64
" ", val
);
6680 } else if (i
== 1) {
6682 snprintf(buf
, sizeof(buf
), "(%s) ", ts
->bprm
->argv
[0]);
6683 } else if (i
== 27) {
6686 snprintf(buf
, sizeof(buf
), "%"PRId64
" ", val
);
6688 /* for the rest, there is MasterCard */
6689 snprintf(buf
, sizeof(buf
), "0%c", i
== 43 ? '\n' : ' ');
6693 if (write(fd
, buf
, len
) != len
) {
6701 static int open_self_auxv(void *cpu_env
, int fd
)
6703 CPUState
*cpu
= ENV_GET_CPU((CPUArchState
*)cpu_env
);
6704 TaskState
*ts
= cpu
->opaque
;
6705 abi_ulong auxv
= ts
->info
->saved_auxv
;
6706 abi_ulong len
= ts
->info
->auxv_len
;
6710 * Auxiliary vector is stored in target process stack.
6711 * read in whole auxv vector and copy it to file
6713 ptr
= lock_user(VERIFY_READ
, auxv
, len
, 0);
6717 r
= write(fd
, ptr
, len
);
6724 lseek(fd
, 0, SEEK_SET
);
6725 unlock_user(ptr
, auxv
, len
);
6731 static int is_proc_myself(const char *filename
, const char *entry
)
6733 if (!strncmp(filename
, "/proc/", strlen("/proc/"))) {
6734 filename
+= strlen("/proc/");
6735 if (!strncmp(filename
, "self/", strlen("self/"))) {
6736 filename
+= strlen("self/");
6737 } else if (*filename
>= '1' && *filename
<= '9') {
6739 snprintf(myself
, sizeof(myself
), "%d/", getpid());
6740 if (!strncmp(filename
, myself
, strlen(myself
))) {
6741 filename
+= strlen(myself
);
6748 if (!strcmp(filename
, entry
)) {
6755 #if defined(HOST_WORDS_BIGENDIAN) != defined(TARGET_WORDS_BIGENDIAN)
6756 static int is_proc(const char *filename
, const char *entry
)
6758 return strcmp(filename
, entry
) == 0;
6761 static int open_net_route(void *cpu_env
, int fd
)
6768 fp
= fopen("/proc/net/route", "r");
6775 read
= getline(&line
, &len
, fp
);
6776 dprintf(fd
, "%s", line
);
6780 while ((read
= getline(&line
, &len
, fp
)) != -1) {
6782 uint32_t dest
, gw
, mask
;
6783 unsigned int flags
, refcnt
, use
, metric
, mtu
, window
, irtt
;
6786 fields
= sscanf(line
,
6787 "%s\t%08x\t%08x\t%04x\t%d\t%d\t%d\t%08x\t%d\t%u\t%u\n",
6788 iface
, &dest
, &gw
, &flags
, &refcnt
, &use
, &metric
,
6789 &mask
, &mtu
, &window
, &irtt
);
6793 dprintf(fd
, "%s\t%08x\t%08x\t%04x\t%d\t%d\t%d\t%08x\t%d\t%u\t%u\n",
6794 iface
, tswap32(dest
), tswap32(gw
), flags
, refcnt
, use
,
6795 metric
, tswap32(mask
), mtu
, window
, irtt
);
6805 static int do_openat(void *cpu_env
, int dirfd
, const char *pathname
, int flags
, mode_t mode
)
6808 const char *filename
;
6809 int (*fill
)(void *cpu_env
, int fd
);
6810 int (*cmp
)(const char *s1
, const char *s2
);
6812 const struct fake_open
*fake_open
;
6813 static const struct fake_open fakes
[] = {
6814 { "maps", open_self_maps
, is_proc_myself
},
6815 { "stat", open_self_stat
, is_proc_myself
},
6816 { "auxv", open_self_auxv
, is_proc_myself
},
6817 { "cmdline", open_self_cmdline
, is_proc_myself
},
6818 #if defined(HOST_WORDS_BIGENDIAN) != defined(TARGET_WORDS_BIGENDIAN)
6819 { "/proc/net/route", open_net_route
, is_proc
},
6821 { NULL
, NULL
, NULL
}
6824 if (is_proc_myself(pathname
, "exe")) {
6825 int execfd
= qemu_getauxval(AT_EXECFD
);
6826 return execfd
? execfd
: safe_openat(dirfd
, exec_path
, flags
, mode
);
6829 for (fake_open
= fakes
; fake_open
->filename
; fake_open
++) {
6830 if (fake_open
->cmp(pathname
, fake_open
->filename
)) {
6835 if (fake_open
->filename
) {
6837 char filename
[PATH_MAX
];
6840 /* create temporary file to map stat to */
6841 tmpdir
= getenv("TMPDIR");
6844 snprintf(filename
, sizeof(filename
), "%s/qemu-open.XXXXXX", tmpdir
);
6845 fd
= mkstemp(filename
);
6851 if ((r
= fake_open
->fill(cpu_env
, fd
))) {
6857 lseek(fd
, 0, SEEK_SET
);
6862 return safe_openat(dirfd
, path(pathname
), flags
, mode
);
6865 #define TIMER_MAGIC 0x0caf0000
6866 #define TIMER_MAGIC_MASK 0xffff0000
6868 /* Convert QEMU provided timer ID back to internal 16bit index format */
6869 static target_timer_t
get_timer_id(abi_long arg
)
6871 target_timer_t timerid
= arg
;
6873 if ((timerid
& TIMER_MAGIC_MASK
) != TIMER_MAGIC
) {
6874 return -TARGET_EINVAL
;
6879 if (timerid
>= ARRAY_SIZE(g_posix_timers
)) {
6880 return -TARGET_EINVAL
;
6886 static int target_to_host_cpu_mask(unsigned long *host_mask
,
6888 abi_ulong target_addr
,
6891 unsigned target_bits
= sizeof(abi_ulong
) * 8;
6892 unsigned host_bits
= sizeof(*host_mask
) * 8;
6893 abi_ulong
*target_mask
;
6896 assert(host_size
>= target_size
);
6898 target_mask
= lock_user(VERIFY_READ
, target_addr
, target_size
, 1);
6900 return -TARGET_EFAULT
;
6902 memset(host_mask
, 0, host_size
);
6904 for (i
= 0 ; i
< target_size
/ sizeof(abi_ulong
); i
++) {
6905 unsigned bit
= i
* target_bits
;
6908 __get_user(val
, &target_mask
[i
]);
6909 for (j
= 0; j
< target_bits
; j
++, bit
++) {
6910 if (val
& (1UL << j
)) {
6911 host_mask
[bit
/ host_bits
] |= 1UL << (bit
% host_bits
);
6916 unlock_user(target_mask
, target_addr
, 0);
6920 static int host_to_target_cpu_mask(const unsigned long *host_mask
,
6922 abi_ulong target_addr
,
6925 unsigned target_bits
= sizeof(abi_ulong
) * 8;
6926 unsigned host_bits
= sizeof(*host_mask
) * 8;
6927 abi_ulong
*target_mask
;
6930 assert(host_size
>= target_size
);
6932 target_mask
= lock_user(VERIFY_WRITE
, target_addr
, target_size
, 0);
6934 return -TARGET_EFAULT
;
6937 for (i
= 0 ; i
< target_size
/ sizeof(abi_ulong
); i
++) {
6938 unsigned bit
= i
* target_bits
;
6941 for (j
= 0; j
< target_bits
; j
++, bit
++) {
6942 if (host_mask
[bit
/ host_bits
] & (1UL << (bit
% host_bits
))) {
6946 __put_user(val
, &target_mask
[i
]);
6949 unlock_user(target_mask
, target_addr
, target_size
);
6953 /* This is an internal helper for do_syscall so that it is easier
6954 * to have a single return point, so that actions, such as logging
6955 * of syscall results, can be performed.
6956 * All errnos that do_syscall() returns must be -TARGET_<errcode>.
6958 static abi_long
do_syscall1(void *cpu_env
, int num
, abi_long arg1
,
6959 abi_long arg2
, abi_long arg3
, abi_long arg4
,
6960 abi_long arg5
, abi_long arg6
, abi_long arg7
,
6963 CPUState
*cpu
= ENV_GET_CPU(cpu_env
);
6965 #if defined(TARGET_NR_stat) || defined(TARGET_NR_stat64) \
6966 || defined(TARGET_NR_lstat) || defined(TARGET_NR_lstat64) \
6967 || defined(TARGET_NR_fstat) || defined(TARGET_NR_fstat64)
6970 #if defined(TARGET_NR_statfs) || defined(TARGET_NR_statfs64) \
6971 || defined(TARGET_NR_fstatfs)
6977 case TARGET_NR_exit
:
6978 /* In old applications this may be used to implement _exit(2).
6979 However in threaded applictions it is used for thread termination,
6980 and _exit_group is used for application termination.
6981 Do thread termination if we have more then one thread. */
6983 if (block_signals()) {
6984 return -TARGET_ERESTARTSYS
;
6989 if (CPU_NEXT(first_cpu
)) {
6992 /* Remove the CPU from the list. */
6993 QTAILQ_REMOVE_RCU(&cpus
, cpu
, node
);
6998 if (ts
->child_tidptr
) {
6999 put_user_u32(0, ts
->child_tidptr
);
7000 sys_futex(g2h(ts
->child_tidptr
), FUTEX_WAKE
, INT_MAX
,
7004 object_unref(OBJECT(cpu
));
7006 rcu_unregister_thread();
7011 preexit_cleanup(cpu_env
, arg1
);
7013 return 0; /* avoid warning */
7014 case TARGET_NR_read
:
7015 if (arg2
== 0 && arg3
== 0) {
7016 return get_errno(safe_read(arg1
, 0, 0));
7018 if (!(p
= lock_user(VERIFY_WRITE
, arg2
, arg3
, 0)))
7019 return -TARGET_EFAULT
;
7020 ret
= get_errno(safe_read(arg1
, p
, arg3
));
7022 fd_trans_host_to_target_data(arg1
)) {
7023 ret
= fd_trans_host_to_target_data(arg1
)(p
, ret
);
7025 unlock_user(p
, arg2
, ret
);
7028 case TARGET_NR_write
:
7029 if (arg2
== 0 && arg3
== 0) {
7030 return get_errno(safe_write(arg1
, 0, 0));
7032 if (!(p
= lock_user(VERIFY_READ
, arg2
, arg3
, 1)))
7033 return -TARGET_EFAULT
;
7034 if (fd_trans_target_to_host_data(arg1
)) {
7035 void *copy
= g_malloc(arg3
);
7036 memcpy(copy
, p
, arg3
);
7037 ret
= fd_trans_target_to_host_data(arg1
)(copy
, arg3
);
7039 ret
= get_errno(safe_write(arg1
, copy
, ret
));
7043 ret
= get_errno(safe_write(arg1
, p
, arg3
));
7045 unlock_user(p
, arg2
, 0);
7048 #ifdef TARGET_NR_open
7049 case TARGET_NR_open
:
7050 if (!(p
= lock_user_string(arg1
)))
7051 return -TARGET_EFAULT
;
7052 ret
= get_errno(do_openat(cpu_env
, AT_FDCWD
, p
,
7053 target_to_host_bitmask(arg2
, fcntl_flags_tbl
),
7055 fd_trans_unregister(ret
);
7056 unlock_user(p
, arg1
, 0);
7059 case TARGET_NR_openat
:
7060 if (!(p
= lock_user_string(arg2
)))
7061 return -TARGET_EFAULT
;
7062 ret
= get_errno(do_openat(cpu_env
, arg1
, p
,
7063 target_to_host_bitmask(arg3
, fcntl_flags_tbl
),
7065 fd_trans_unregister(ret
);
7066 unlock_user(p
, arg2
, 0);
7068 #if defined(TARGET_NR_name_to_handle_at) && defined(CONFIG_OPEN_BY_HANDLE)
7069 case TARGET_NR_name_to_handle_at
:
7070 ret
= do_name_to_handle_at(arg1
, arg2
, arg3
, arg4
, arg5
);
7073 #if defined(TARGET_NR_open_by_handle_at) && defined(CONFIG_OPEN_BY_HANDLE)
7074 case TARGET_NR_open_by_handle_at
:
7075 ret
= do_open_by_handle_at(arg1
, arg2
, arg3
);
7076 fd_trans_unregister(ret
);
7079 case TARGET_NR_close
:
7080 fd_trans_unregister(arg1
);
7081 return get_errno(close(arg1
));
7084 return do_brk(arg1
);
7085 #ifdef TARGET_NR_fork
7086 case TARGET_NR_fork
:
7087 return get_errno(do_fork(cpu_env
, TARGET_SIGCHLD
, 0, 0, 0, 0));
7089 #ifdef TARGET_NR_waitpid
7090 case TARGET_NR_waitpid
:
7093 ret
= get_errno(safe_wait4(arg1
, &status
, arg3
, 0));
7094 if (!is_error(ret
) && arg2
&& ret
7095 && put_user_s32(host_to_target_waitstatus(status
), arg2
))
7096 return -TARGET_EFAULT
;
7100 #ifdef TARGET_NR_waitid
7101 case TARGET_NR_waitid
:
7105 ret
= get_errno(safe_waitid(arg1
, arg2
, &info
, arg4
, NULL
));
7106 if (!is_error(ret
) && arg3
&& info
.si_pid
!= 0) {
7107 if (!(p
= lock_user(VERIFY_WRITE
, arg3
, sizeof(target_siginfo_t
), 0)))
7108 return -TARGET_EFAULT
;
7109 host_to_target_siginfo(p
, &info
);
7110 unlock_user(p
, arg3
, sizeof(target_siginfo_t
));
7115 #ifdef TARGET_NR_creat /* not on alpha */
7116 case TARGET_NR_creat
:
7117 if (!(p
= lock_user_string(arg1
)))
7118 return -TARGET_EFAULT
;
7119 ret
= get_errno(creat(p
, arg2
));
7120 fd_trans_unregister(ret
);
7121 unlock_user(p
, arg1
, 0);
7124 #ifdef TARGET_NR_link
7125 case TARGET_NR_link
:
7128 p
= lock_user_string(arg1
);
7129 p2
= lock_user_string(arg2
);
7131 ret
= -TARGET_EFAULT
;
7133 ret
= get_errno(link(p
, p2
));
7134 unlock_user(p2
, arg2
, 0);
7135 unlock_user(p
, arg1
, 0);
7139 #if defined(TARGET_NR_linkat)
7140 case TARGET_NR_linkat
:
7144 return -TARGET_EFAULT
;
7145 p
= lock_user_string(arg2
);
7146 p2
= lock_user_string(arg4
);
7148 ret
= -TARGET_EFAULT
;
7150 ret
= get_errno(linkat(arg1
, p
, arg3
, p2
, arg5
));
7151 unlock_user(p
, arg2
, 0);
7152 unlock_user(p2
, arg4
, 0);
7156 #ifdef TARGET_NR_unlink
7157 case TARGET_NR_unlink
:
7158 if (!(p
= lock_user_string(arg1
)))
7159 return -TARGET_EFAULT
;
7160 ret
= get_errno(unlink(p
));
7161 unlock_user(p
, arg1
, 0);
7164 #if defined(TARGET_NR_unlinkat)
7165 case TARGET_NR_unlinkat
:
7166 if (!(p
= lock_user_string(arg2
)))
7167 return -TARGET_EFAULT
;
7168 ret
= get_errno(unlinkat(arg1
, p
, arg3
));
7169 unlock_user(p
, arg2
, 0);
7172 case TARGET_NR_execve
:
7174 char **argp
, **envp
;
7177 abi_ulong guest_argp
;
7178 abi_ulong guest_envp
;
7185 for (gp
= guest_argp
; gp
; gp
+= sizeof(abi_ulong
)) {
7186 if (get_user_ual(addr
, gp
))
7187 return -TARGET_EFAULT
;
7194 for (gp
= guest_envp
; gp
; gp
+= sizeof(abi_ulong
)) {
7195 if (get_user_ual(addr
, gp
))
7196 return -TARGET_EFAULT
;
7202 argp
= g_new0(char *, argc
+ 1);
7203 envp
= g_new0(char *, envc
+ 1);
7205 for (gp
= guest_argp
, q
= argp
; gp
;
7206 gp
+= sizeof(abi_ulong
), q
++) {
7207 if (get_user_ual(addr
, gp
))
7211 if (!(*q
= lock_user_string(addr
)))
7213 total_size
+= strlen(*q
) + 1;
7217 for (gp
= guest_envp
, q
= envp
; gp
;
7218 gp
+= sizeof(abi_ulong
), q
++) {
7219 if (get_user_ual(addr
, gp
))
7223 if (!(*q
= lock_user_string(addr
)))
7225 total_size
+= strlen(*q
) + 1;
7229 if (!(p
= lock_user_string(arg1
)))
7231 /* Although execve() is not an interruptible syscall it is
7232 * a special case where we must use the safe_syscall wrapper:
7233 * if we allow a signal to happen before we make the host
7234 * syscall then we will 'lose' it, because at the point of
7235 * execve the process leaves QEMU's control. So we use the
7236 * safe syscall wrapper to ensure that we either take the
7237 * signal as a guest signal, or else it does not happen
7238 * before the execve completes and makes it the other
7239 * program's problem.
7241 ret
= get_errno(safe_execve(p
, argp
, envp
));
7242 unlock_user(p
, arg1
, 0);
7247 ret
= -TARGET_EFAULT
;
7250 for (gp
= guest_argp
, q
= argp
; *q
;
7251 gp
+= sizeof(abi_ulong
), q
++) {
7252 if (get_user_ual(addr
, gp
)
7255 unlock_user(*q
, addr
, 0);
7257 for (gp
= guest_envp
, q
= envp
; *q
;
7258 gp
+= sizeof(abi_ulong
), q
++) {
7259 if (get_user_ual(addr
, gp
)
7262 unlock_user(*q
, addr
, 0);
7269 case TARGET_NR_chdir
:
7270 if (!(p
= lock_user_string(arg1
)))
7271 return -TARGET_EFAULT
;
7272 ret
= get_errno(chdir(p
));
7273 unlock_user(p
, arg1
, 0);
7275 #ifdef TARGET_NR_time
7276 case TARGET_NR_time
:
7279 ret
= get_errno(time(&host_time
));
7282 && put_user_sal(host_time
, arg1
))
7283 return -TARGET_EFAULT
;
7287 #ifdef TARGET_NR_mknod
7288 case TARGET_NR_mknod
:
7289 if (!(p
= lock_user_string(arg1
)))
7290 return -TARGET_EFAULT
;
7291 ret
= get_errno(mknod(p
, arg2
, arg3
));
7292 unlock_user(p
, arg1
, 0);
7295 #if defined(TARGET_NR_mknodat)
7296 case TARGET_NR_mknodat
:
7297 if (!(p
= lock_user_string(arg2
)))
7298 return -TARGET_EFAULT
;
7299 ret
= get_errno(mknodat(arg1
, p
, arg3
, arg4
));
7300 unlock_user(p
, arg2
, 0);
7303 #ifdef TARGET_NR_chmod
7304 case TARGET_NR_chmod
:
7305 if (!(p
= lock_user_string(arg1
)))
7306 return -TARGET_EFAULT
;
7307 ret
= get_errno(chmod(p
, arg2
));
7308 unlock_user(p
, arg1
, 0);
7311 #ifdef TARGET_NR_lseek
7312 case TARGET_NR_lseek
:
7313 return get_errno(lseek(arg1
, arg2
, arg3
));
7315 #if defined(TARGET_NR_getxpid) && defined(TARGET_ALPHA)
7316 /* Alpha specific */
7317 case TARGET_NR_getxpid
:
7318 ((CPUAlphaState
*)cpu_env
)->ir
[IR_A4
] = getppid();
7319 return get_errno(getpid());
7321 #ifdef TARGET_NR_getpid
7322 case TARGET_NR_getpid
:
7323 return get_errno(getpid());
7325 case TARGET_NR_mount
:
7327 /* need to look at the data field */
7331 p
= lock_user_string(arg1
);
7333 return -TARGET_EFAULT
;
7339 p2
= lock_user_string(arg2
);
7342 unlock_user(p
, arg1
, 0);
7344 return -TARGET_EFAULT
;
7348 p3
= lock_user_string(arg3
);
7351 unlock_user(p
, arg1
, 0);
7353 unlock_user(p2
, arg2
, 0);
7354 return -TARGET_EFAULT
;
7360 /* FIXME - arg5 should be locked, but it isn't clear how to
7361 * do that since it's not guaranteed to be a NULL-terminated
7365 ret
= mount(p
, p2
, p3
, (unsigned long)arg4
, NULL
);
7367 ret
= mount(p
, p2
, p3
, (unsigned long)arg4
, g2h(arg5
));
7369 ret
= get_errno(ret
);
7372 unlock_user(p
, arg1
, 0);
7374 unlock_user(p2
, arg2
, 0);
7376 unlock_user(p3
, arg3
, 0);
7380 #ifdef TARGET_NR_umount
7381 case TARGET_NR_umount
:
7382 if (!(p
= lock_user_string(arg1
)))
7383 return -TARGET_EFAULT
;
7384 ret
= get_errno(umount(p
));
7385 unlock_user(p
, arg1
, 0);
7388 #ifdef TARGET_NR_stime /* not on alpha */
7389 case TARGET_NR_stime
:
7392 if (get_user_sal(host_time
, arg1
))
7393 return -TARGET_EFAULT
;
7394 return get_errno(stime(&host_time
));
7397 #ifdef TARGET_NR_alarm /* not on alpha */
7398 case TARGET_NR_alarm
:
7401 #ifdef TARGET_NR_pause /* not on alpha */
7402 case TARGET_NR_pause
:
7403 if (!block_signals()) {
7404 sigsuspend(&((TaskState
*)cpu
->opaque
)->signal_mask
);
7406 return -TARGET_EINTR
;
7408 #ifdef TARGET_NR_utime
7409 case TARGET_NR_utime
:
7411 struct utimbuf tbuf
, *host_tbuf
;
7412 struct target_utimbuf
*target_tbuf
;
7414 if (!lock_user_struct(VERIFY_READ
, target_tbuf
, arg2
, 1))
7415 return -TARGET_EFAULT
;
7416 tbuf
.actime
= tswapal(target_tbuf
->actime
);
7417 tbuf
.modtime
= tswapal(target_tbuf
->modtime
);
7418 unlock_user_struct(target_tbuf
, arg2
, 0);
7423 if (!(p
= lock_user_string(arg1
)))
7424 return -TARGET_EFAULT
;
7425 ret
= get_errno(utime(p
, host_tbuf
));
7426 unlock_user(p
, arg1
, 0);
7430 #ifdef TARGET_NR_utimes
7431 case TARGET_NR_utimes
:
7433 struct timeval
*tvp
, tv
[2];
7435 if (copy_from_user_timeval(&tv
[0], arg2
)
7436 || copy_from_user_timeval(&tv
[1],
7437 arg2
+ sizeof(struct target_timeval
)))
7438 return -TARGET_EFAULT
;
7443 if (!(p
= lock_user_string(arg1
)))
7444 return -TARGET_EFAULT
;
7445 ret
= get_errno(utimes(p
, tvp
));
7446 unlock_user(p
, arg1
, 0);
7450 #if defined(TARGET_NR_futimesat)
7451 case TARGET_NR_futimesat
:
7453 struct timeval
*tvp
, tv
[2];
7455 if (copy_from_user_timeval(&tv
[0], arg3
)
7456 || copy_from_user_timeval(&tv
[1],
7457 arg3
+ sizeof(struct target_timeval
)))
7458 return -TARGET_EFAULT
;
7463 if (!(p
= lock_user_string(arg2
))) {
7464 return -TARGET_EFAULT
;
7466 ret
= get_errno(futimesat(arg1
, path(p
), tvp
));
7467 unlock_user(p
, arg2
, 0);
7471 #ifdef TARGET_NR_access
7472 case TARGET_NR_access
:
7473 if (!(p
= lock_user_string(arg1
))) {
7474 return -TARGET_EFAULT
;
7476 ret
= get_errno(access(path(p
), arg2
));
7477 unlock_user(p
, arg1
, 0);
7480 #if defined(TARGET_NR_faccessat) && defined(__NR_faccessat)
7481 case TARGET_NR_faccessat
:
7482 if (!(p
= lock_user_string(arg2
))) {
7483 return -TARGET_EFAULT
;
7485 ret
= get_errno(faccessat(arg1
, p
, arg3
, 0));
7486 unlock_user(p
, arg2
, 0);
7489 #ifdef TARGET_NR_nice /* not on alpha */
7490 case TARGET_NR_nice
:
7491 return get_errno(nice(arg1
));
7493 case TARGET_NR_sync
:
7496 #if defined(TARGET_NR_syncfs) && defined(CONFIG_SYNCFS)
7497 case TARGET_NR_syncfs
:
7498 return get_errno(syncfs(arg1
));
7500 case TARGET_NR_kill
:
7501 return get_errno(safe_kill(arg1
, target_to_host_signal(arg2
)));
7502 #ifdef TARGET_NR_rename
7503 case TARGET_NR_rename
:
7506 p
= lock_user_string(arg1
);
7507 p2
= lock_user_string(arg2
);
7509 ret
= -TARGET_EFAULT
;
7511 ret
= get_errno(rename(p
, p2
));
7512 unlock_user(p2
, arg2
, 0);
7513 unlock_user(p
, arg1
, 0);
7517 #if defined(TARGET_NR_renameat)
7518 case TARGET_NR_renameat
:
7521 p
= lock_user_string(arg2
);
7522 p2
= lock_user_string(arg4
);
7524 ret
= -TARGET_EFAULT
;
7526 ret
= get_errno(renameat(arg1
, p
, arg3
, p2
));
7527 unlock_user(p2
, arg4
, 0);
7528 unlock_user(p
, arg2
, 0);
7532 #if defined(TARGET_NR_renameat2)
7533 case TARGET_NR_renameat2
:
7536 p
= lock_user_string(arg2
);
7537 p2
= lock_user_string(arg4
);
7539 ret
= -TARGET_EFAULT
;
7541 ret
= get_errno(sys_renameat2(arg1
, p
, arg3
, p2
, arg5
));
7543 unlock_user(p2
, arg4
, 0);
7544 unlock_user(p
, arg2
, 0);
7548 #ifdef TARGET_NR_mkdir
7549 case TARGET_NR_mkdir
:
7550 if (!(p
= lock_user_string(arg1
)))
7551 return -TARGET_EFAULT
;
7552 ret
= get_errno(mkdir(p
, arg2
));
7553 unlock_user(p
, arg1
, 0);
7556 #if defined(TARGET_NR_mkdirat)
7557 case TARGET_NR_mkdirat
:
7558 if (!(p
= lock_user_string(arg2
)))
7559 return -TARGET_EFAULT
;
7560 ret
= get_errno(mkdirat(arg1
, p
, arg3
));
7561 unlock_user(p
, arg2
, 0);
7564 #ifdef TARGET_NR_rmdir
7565 case TARGET_NR_rmdir
:
7566 if (!(p
= lock_user_string(arg1
)))
7567 return -TARGET_EFAULT
;
7568 ret
= get_errno(rmdir(p
));
7569 unlock_user(p
, arg1
, 0);
7573 ret
= get_errno(dup(arg1
));
7575 fd_trans_dup(arg1
, ret
);
7578 #ifdef TARGET_NR_pipe
7579 case TARGET_NR_pipe
:
7580 return do_pipe(cpu_env
, arg1
, 0, 0);
7582 #ifdef TARGET_NR_pipe2
7583 case TARGET_NR_pipe2
:
7584 return do_pipe(cpu_env
, arg1
,
7585 target_to_host_bitmask(arg2
, fcntl_flags_tbl
), 1);
7587 case TARGET_NR_times
:
7589 struct target_tms
*tmsp
;
7591 ret
= get_errno(times(&tms
));
7593 tmsp
= lock_user(VERIFY_WRITE
, arg1
, sizeof(struct target_tms
), 0);
7595 return -TARGET_EFAULT
;
7596 tmsp
->tms_utime
= tswapal(host_to_target_clock_t(tms
.tms_utime
));
7597 tmsp
->tms_stime
= tswapal(host_to_target_clock_t(tms
.tms_stime
));
7598 tmsp
->tms_cutime
= tswapal(host_to_target_clock_t(tms
.tms_cutime
));
7599 tmsp
->tms_cstime
= tswapal(host_to_target_clock_t(tms
.tms_cstime
));
7602 ret
= host_to_target_clock_t(ret
);
7605 case TARGET_NR_acct
:
7607 ret
= get_errno(acct(NULL
));
7609 if (!(p
= lock_user_string(arg1
))) {
7610 return -TARGET_EFAULT
;
7612 ret
= get_errno(acct(path(p
)));
7613 unlock_user(p
, arg1
, 0);
7616 #ifdef TARGET_NR_umount2
7617 case TARGET_NR_umount2
:
7618 if (!(p
= lock_user_string(arg1
)))
7619 return -TARGET_EFAULT
;
7620 ret
= get_errno(umount2(p
, arg2
));
7621 unlock_user(p
, arg1
, 0);
7624 case TARGET_NR_ioctl
:
7625 return do_ioctl(arg1
, arg2
, arg3
);
7626 #ifdef TARGET_NR_fcntl
7627 case TARGET_NR_fcntl
:
7628 return do_fcntl(arg1
, arg2
, arg3
);
7630 case TARGET_NR_setpgid
:
7631 return get_errno(setpgid(arg1
, arg2
));
7632 case TARGET_NR_umask
:
7633 return get_errno(umask(arg1
));
7634 case TARGET_NR_chroot
:
7635 if (!(p
= lock_user_string(arg1
)))
7636 return -TARGET_EFAULT
;
7637 ret
= get_errno(chroot(p
));
7638 unlock_user(p
, arg1
, 0);
7640 #ifdef TARGET_NR_dup2
7641 case TARGET_NR_dup2
:
7642 ret
= get_errno(dup2(arg1
, arg2
));
7644 fd_trans_dup(arg1
, arg2
);
7648 #if defined(CONFIG_DUP3) && defined(TARGET_NR_dup3)
7649 case TARGET_NR_dup3
:
7653 if ((arg3
& ~TARGET_O_CLOEXEC
) != 0) {
7656 host_flags
= target_to_host_bitmask(arg3
, fcntl_flags_tbl
);
7657 ret
= get_errno(dup3(arg1
, arg2
, host_flags
));
7659 fd_trans_dup(arg1
, arg2
);
7664 #ifdef TARGET_NR_getppid /* not on alpha */
7665 case TARGET_NR_getppid
:
7666 return get_errno(getppid());
7668 #ifdef TARGET_NR_getpgrp
7669 case TARGET_NR_getpgrp
:
7670 return get_errno(getpgrp());
7672 case TARGET_NR_setsid
:
7673 return get_errno(setsid());
7674 #ifdef TARGET_NR_sigaction
7675 case TARGET_NR_sigaction
:
7677 #if defined(TARGET_ALPHA)
7678 struct target_sigaction act
, oact
, *pact
= 0;
7679 struct target_old_sigaction
*old_act
;
7681 if (!lock_user_struct(VERIFY_READ
, old_act
, arg2
, 1))
7682 return -TARGET_EFAULT
;
7683 act
._sa_handler
= old_act
->_sa_handler
;
7684 target_siginitset(&act
.sa_mask
, old_act
->sa_mask
);
7685 act
.sa_flags
= old_act
->sa_flags
;
7686 act
.sa_restorer
= 0;
7687 unlock_user_struct(old_act
, arg2
, 0);
7690 ret
= get_errno(do_sigaction(arg1
, pact
, &oact
));
7691 if (!is_error(ret
) && arg3
) {
7692 if (!lock_user_struct(VERIFY_WRITE
, old_act
, arg3
, 0))
7693 return -TARGET_EFAULT
;
7694 old_act
->_sa_handler
= oact
._sa_handler
;
7695 old_act
->sa_mask
= oact
.sa_mask
.sig
[0];
7696 old_act
->sa_flags
= oact
.sa_flags
;
7697 unlock_user_struct(old_act
, arg3
, 1);
7699 #elif defined(TARGET_MIPS)
7700 struct target_sigaction act
, oact
, *pact
, *old_act
;
7703 if (!lock_user_struct(VERIFY_READ
, old_act
, arg2
, 1))
7704 return -TARGET_EFAULT
;
7705 act
._sa_handler
= old_act
->_sa_handler
;
7706 target_siginitset(&act
.sa_mask
, old_act
->sa_mask
.sig
[0]);
7707 act
.sa_flags
= old_act
->sa_flags
;
7708 unlock_user_struct(old_act
, arg2
, 0);
7714 ret
= get_errno(do_sigaction(arg1
, pact
, &oact
));
7716 if (!is_error(ret
) && arg3
) {
7717 if (!lock_user_struct(VERIFY_WRITE
, old_act
, arg3
, 0))
7718 return -TARGET_EFAULT
;
7719 old_act
->_sa_handler
= oact
._sa_handler
;
7720 old_act
->sa_flags
= oact
.sa_flags
;
7721 old_act
->sa_mask
.sig
[0] = oact
.sa_mask
.sig
[0];
7722 old_act
->sa_mask
.sig
[1] = 0;
7723 old_act
->sa_mask
.sig
[2] = 0;
7724 old_act
->sa_mask
.sig
[3] = 0;
7725 unlock_user_struct(old_act
, arg3
, 1);
7728 struct target_old_sigaction
*old_act
;
7729 struct target_sigaction act
, oact
, *pact
;
7731 if (!lock_user_struct(VERIFY_READ
, old_act
, arg2
, 1))
7732 return -TARGET_EFAULT
;
7733 act
._sa_handler
= old_act
->_sa_handler
;
7734 target_siginitset(&act
.sa_mask
, old_act
->sa_mask
);
7735 act
.sa_flags
= old_act
->sa_flags
;
7736 act
.sa_restorer
= old_act
->sa_restorer
;
7737 #ifdef TARGET_ARCH_HAS_KA_RESTORER
7738 act
.ka_restorer
= 0;
7740 unlock_user_struct(old_act
, arg2
, 0);
7745 ret
= get_errno(do_sigaction(arg1
, pact
, &oact
));
7746 if (!is_error(ret
) && arg3
) {
7747 if (!lock_user_struct(VERIFY_WRITE
, old_act
, arg3
, 0))
7748 return -TARGET_EFAULT
;
7749 old_act
->_sa_handler
= oact
._sa_handler
;
7750 old_act
->sa_mask
= oact
.sa_mask
.sig
[0];
7751 old_act
->sa_flags
= oact
.sa_flags
;
7752 old_act
->sa_restorer
= oact
.sa_restorer
;
7753 unlock_user_struct(old_act
, arg3
, 1);
7759 case TARGET_NR_rt_sigaction
:
7761 #if defined(TARGET_ALPHA)
7762 /* For Alpha and SPARC this is a 5 argument syscall, with
7763 * a 'restorer' parameter which must be copied into the
7764 * sa_restorer field of the sigaction struct.
7765 * For Alpha that 'restorer' is arg5; for SPARC it is arg4,
7766 * and arg5 is the sigsetsize.
7767 * Alpha also has a separate rt_sigaction struct that it uses
7768 * here; SPARC uses the usual sigaction struct.
7770 struct target_rt_sigaction
*rt_act
;
7771 struct target_sigaction act
, oact
, *pact
= 0;
7773 if (arg4
!= sizeof(target_sigset_t
)) {
7774 return -TARGET_EINVAL
;
7777 if (!lock_user_struct(VERIFY_READ
, rt_act
, arg2
, 1))
7778 return -TARGET_EFAULT
;
7779 act
._sa_handler
= rt_act
->_sa_handler
;
7780 act
.sa_mask
= rt_act
->sa_mask
;
7781 act
.sa_flags
= rt_act
->sa_flags
;
7782 act
.sa_restorer
= arg5
;
7783 unlock_user_struct(rt_act
, arg2
, 0);
7786 ret
= get_errno(do_sigaction(arg1
, pact
, &oact
));
7787 if (!is_error(ret
) && arg3
) {
7788 if (!lock_user_struct(VERIFY_WRITE
, rt_act
, arg3
, 0))
7789 return -TARGET_EFAULT
;
7790 rt_act
->_sa_handler
= oact
._sa_handler
;
7791 rt_act
->sa_mask
= oact
.sa_mask
;
7792 rt_act
->sa_flags
= oact
.sa_flags
;
7793 unlock_user_struct(rt_act
, arg3
, 1);
7797 target_ulong restorer
= arg4
;
7798 target_ulong sigsetsize
= arg5
;
7800 target_ulong sigsetsize
= arg4
;
7802 struct target_sigaction
*act
;
7803 struct target_sigaction
*oact
;
7805 if (sigsetsize
!= sizeof(target_sigset_t
)) {
7806 return -TARGET_EINVAL
;
7809 if (!lock_user_struct(VERIFY_READ
, act
, arg2
, 1)) {
7810 return -TARGET_EFAULT
;
7812 #ifdef TARGET_ARCH_HAS_KA_RESTORER
7813 act
->ka_restorer
= restorer
;
7819 if (!lock_user_struct(VERIFY_WRITE
, oact
, arg3
, 0)) {
7820 ret
= -TARGET_EFAULT
;
7821 goto rt_sigaction_fail
;
7825 ret
= get_errno(do_sigaction(arg1
, act
, oact
));
7828 unlock_user_struct(act
, arg2
, 0);
7830 unlock_user_struct(oact
, arg3
, 1);
7834 #ifdef TARGET_NR_sgetmask /* not on alpha */
7835 case TARGET_NR_sgetmask
:
7838 abi_ulong target_set
;
7839 ret
= do_sigprocmask(0, NULL
, &cur_set
);
7841 host_to_target_old_sigset(&target_set
, &cur_set
);
7847 #ifdef TARGET_NR_ssetmask /* not on alpha */
7848 case TARGET_NR_ssetmask
:
7851 abi_ulong target_set
= arg1
;
7852 target_to_host_old_sigset(&set
, &target_set
);
7853 ret
= do_sigprocmask(SIG_SETMASK
, &set
, &oset
);
7855 host_to_target_old_sigset(&target_set
, &oset
);
7861 #ifdef TARGET_NR_sigprocmask
7862 case TARGET_NR_sigprocmask
:
7864 #if defined(TARGET_ALPHA)
7865 sigset_t set
, oldset
;
7870 case TARGET_SIG_BLOCK
:
7873 case TARGET_SIG_UNBLOCK
:
7876 case TARGET_SIG_SETMASK
:
7880 return -TARGET_EINVAL
;
7883 target_to_host_old_sigset(&set
, &mask
);
7885 ret
= do_sigprocmask(how
, &set
, &oldset
);
7886 if (!is_error(ret
)) {
7887 host_to_target_old_sigset(&mask
, &oldset
);
7889 ((CPUAlphaState
*)cpu_env
)->ir
[IR_V0
] = 0; /* force no error */
7892 sigset_t set
, oldset
, *set_ptr
;
7897 case TARGET_SIG_BLOCK
:
7900 case TARGET_SIG_UNBLOCK
:
7903 case TARGET_SIG_SETMASK
:
7907 return -TARGET_EINVAL
;
7909 if (!(p
= lock_user(VERIFY_READ
, arg2
, sizeof(target_sigset_t
), 1)))
7910 return -TARGET_EFAULT
;
7911 target_to_host_old_sigset(&set
, p
);
7912 unlock_user(p
, arg2
, 0);
7918 ret
= do_sigprocmask(how
, set_ptr
, &oldset
);
7919 if (!is_error(ret
) && arg3
) {
7920 if (!(p
= lock_user(VERIFY_WRITE
, arg3
, sizeof(target_sigset_t
), 0)))
7921 return -TARGET_EFAULT
;
7922 host_to_target_old_sigset(p
, &oldset
);
7923 unlock_user(p
, arg3
, sizeof(target_sigset_t
));
7929 case TARGET_NR_rt_sigprocmask
:
7932 sigset_t set
, oldset
, *set_ptr
;
7934 if (arg4
!= sizeof(target_sigset_t
)) {
7935 return -TARGET_EINVAL
;
7940 case TARGET_SIG_BLOCK
:
7943 case TARGET_SIG_UNBLOCK
:
7946 case TARGET_SIG_SETMASK
:
7950 return -TARGET_EINVAL
;
7952 if (!(p
= lock_user(VERIFY_READ
, arg2
, sizeof(target_sigset_t
), 1)))
7953 return -TARGET_EFAULT
;
7954 target_to_host_sigset(&set
, p
);
7955 unlock_user(p
, arg2
, 0);
7961 ret
= do_sigprocmask(how
, set_ptr
, &oldset
);
7962 if (!is_error(ret
) && arg3
) {
7963 if (!(p
= lock_user(VERIFY_WRITE
, arg3
, sizeof(target_sigset_t
), 0)))
7964 return -TARGET_EFAULT
;
7965 host_to_target_sigset(p
, &oldset
);
7966 unlock_user(p
, arg3
, sizeof(target_sigset_t
));
7970 #ifdef TARGET_NR_sigpending
7971 case TARGET_NR_sigpending
:
7974 ret
= get_errno(sigpending(&set
));
7975 if (!is_error(ret
)) {
7976 if (!(p
= lock_user(VERIFY_WRITE
, arg1
, sizeof(target_sigset_t
), 0)))
7977 return -TARGET_EFAULT
;
7978 host_to_target_old_sigset(p
, &set
);
7979 unlock_user(p
, arg1
, sizeof(target_sigset_t
));
7984 case TARGET_NR_rt_sigpending
:
7988 /* Yes, this check is >, not != like most. We follow the kernel's
7989 * logic and it does it like this because it implements
7990 * NR_sigpending through the same code path, and in that case
7991 * the old_sigset_t is smaller in size.
7993 if (arg2
> sizeof(target_sigset_t
)) {
7994 return -TARGET_EINVAL
;
7997 ret
= get_errno(sigpending(&set
));
7998 if (!is_error(ret
)) {
7999 if (!(p
= lock_user(VERIFY_WRITE
, arg1
, sizeof(target_sigset_t
), 0)))
8000 return -TARGET_EFAULT
;
8001 host_to_target_sigset(p
, &set
);
8002 unlock_user(p
, arg1
, sizeof(target_sigset_t
));
8006 #ifdef TARGET_NR_sigsuspend
8007 case TARGET_NR_sigsuspend
:
8009 TaskState
*ts
= cpu
->opaque
;
8010 #if defined(TARGET_ALPHA)
8011 abi_ulong mask
= arg1
;
8012 target_to_host_old_sigset(&ts
->sigsuspend_mask
, &mask
);
8014 if (!(p
= lock_user(VERIFY_READ
, arg1
, sizeof(target_sigset_t
), 1)))
8015 return -TARGET_EFAULT
;
8016 target_to_host_old_sigset(&ts
->sigsuspend_mask
, p
);
8017 unlock_user(p
, arg1
, 0);
8019 ret
= get_errno(safe_rt_sigsuspend(&ts
->sigsuspend_mask
,
8021 if (ret
!= -TARGET_ERESTARTSYS
) {
8022 ts
->in_sigsuspend
= 1;
8027 case TARGET_NR_rt_sigsuspend
:
8029 TaskState
*ts
= cpu
->opaque
;
8031 if (arg2
!= sizeof(target_sigset_t
)) {
8032 return -TARGET_EINVAL
;
8034 if (!(p
= lock_user(VERIFY_READ
, arg1
, sizeof(target_sigset_t
), 1)))
8035 return -TARGET_EFAULT
;
8036 target_to_host_sigset(&ts
->sigsuspend_mask
, p
);
8037 unlock_user(p
, arg1
, 0);
8038 ret
= get_errno(safe_rt_sigsuspend(&ts
->sigsuspend_mask
,
8040 if (ret
!= -TARGET_ERESTARTSYS
) {
8041 ts
->in_sigsuspend
= 1;
8045 case TARGET_NR_rt_sigtimedwait
:
8048 struct timespec uts
, *puts
;
8051 if (arg4
!= sizeof(target_sigset_t
)) {
8052 return -TARGET_EINVAL
;
8055 if (!(p
= lock_user(VERIFY_READ
, arg1
, sizeof(target_sigset_t
), 1)))
8056 return -TARGET_EFAULT
;
8057 target_to_host_sigset(&set
, p
);
8058 unlock_user(p
, arg1
, 0);
8061 target_to_host_timespec(puts
, arg3
);
8065 ret
= get_errno(safe_rt_sigtimedwait(&set
, &uinfo
, puts
,
8067 if (!is_error(ret
)) {
8069 p
= lock_user(VERIFY_WRITE
, arg2
, sizeof(target_siginfo_t
),
8072 return -TARGET_EFAULT
;
8074 host_to_target_siginfo(p
, &uinfo
);
8075 unlock_user(p
, arg2
, sizeof(target_siginfo_t
));
8077 ret
= host_to_target_signal(ret
);
8081 case TARGET_NR_rt_sigqueueinfo
:
8085 p
= lock_user(VERIFY_READ
, arg3
, sizeof(target_siginfo_t
), 1);
8087 return -TARGET_EFAULT
;
8089 target_to_host_siginfo(&uinfo
, p
);
8090 unlock_user(p
, arg3
, 0);
8091 ret
= get_errno(sys_rt_sigqueueinfo(arg1
, arg2
, &uinfo
));
8094 case TARGET_NR_rt_tgsigqueueinfo
:
8098 p
= lock_user(VERIFY_READ
, arg4
, sizeof(target_siginfo_t
), 1);
8100 return -TARGET_EFAULT
;
8102 target_to_host_siginfo(&uinfo
, p
);
8103 unlock_user(p
, arg4
, 0);
8104 ret
= get_errno(sys_rt_tgsigqueueinfo(arg1
, arg2
, arg3
, &uinfo
));
8107 #ifdef TARGET_NR_sigreturn
8108 case TARGET_NR_sigreturn
:
8109 if (block_signals()) {
8110 return -TARGET_ERESTARTSYS
;
8112 return do_sigreturn(cpu_env
);
8114 case TARGET_NR_rt_sigreturn
:
8115 if (block_signals()) {
8116 return -TARGET_ERESTARTSYS
;
8118 return do_rt_sigreturn(cpu_env
);
8119 case TARGET_NR_sethostname
:
8120 if (!(p
= lock_user_string(arg1
)))
8121 return -TARGET_EFAULT
;
8122 ret
= get_errno(sethostname(p
, arg2
));
8123 unlock_user(p
, arg1
, 0);
8125 #ifdef TARGET_NR_setrlimit
8126 case TARGET_NR_setrlimit
:
8128 int resource
= target_to_host_resource(arg1
);
8129 struct target_rlimit
*target_rlim
;
8131 if (!lock_user_struct(VERIFY_READ
, target_rlim
, arg2
, 1))
8132 return -TARGET_EFAULT
;
8133 rlim
.rlim_cur
= target_to_host_rlim(target_rlim
->rlim_cur
);
8134 rlim
.rlim_max
= target_to_host_rlim(target_rlim
->rlim_max
);
8135 unlock_user_struct(target_rlim
, arg2
, 0);
8137 * If we just passed through resource limit settings for memory then
8138 * they would also apply to QEMU's own allocations, and QEMU will
8139 * crash or hang or die if its allocations fail. Ideally we would
8140 * track the guest allocations in QEMU and apply the limits ourselves.
8141 * For now, just tell the guest the call succeeded but don't actually
8144 if (resource
!= RLIMIT_AS
&&
8145 resource
!= RLIMIT_DATA
&&
8146 resource
!= RLIMIT_STACK
) {
8147 return get_errno(setrlimit(resource
, &rlim
));
8153 #ifdef TARGET_NR_getrlimit
8154 case TARGET_NR_getrlimit
:
8156 int resource
= target_to_host_resource(arg1
);
8157 struct target_rlimit
*target_rlim
;
8160 ret
= get_errno(getrlimit(resource
, &rlim
));
8161 if (!is_error(ret
)) {
8162 if (!lock_user_struct(VERIFY_WRITE
, target_rlim
, arg2
, 0))
8163 return -TARGET_EFAULT
;
8164 target_rlim
->rlim_cur
= host_to_target_rlim(rlim
.rlim_cur
);
8165 target_rlim
->rlim_max
= host_to_target_rlim(rlim
.rlim_max
);
8166 unlock_user_struct(target_rlim
, arg2
, 1);
8171 case TARGET_NR_getrusage
:
8173 struct rusage rusage
;
8174 ret
= get_errno(getrusage(arg1
, &rusage
));
8175 if (!is_error(ret
)) {
8176 ret
= host_to_target_rusage(arg2
, &rusage
);
8180 case TARGET_NR_gettimeofday
:
8183 ret
= get_errno(gettimeofday(&tv
, NULL
));
8184 if (!is_error(ret
)) {
8185 if (copy_to_user_timeval(arg1
, &tv
))
8186 return -TARGET_EFAULT
;
8190 case TARGET_NR_settimeofday
:
8192 struct timeval tv
, *ptv
= NULL
;
8193 struct timezone tz
, *ptz
= NULL
;
8196 if (copy_from_user_timeval(&tv
, arg1
)) {
8197 return -TARGET_EFAULT
;
8203 if (copy_from_user_timezone(&tz
, arg2
)) {
8204 return -TARGET_EFAULT
;
8209 return get_errno(settimeofday(ptv
, ptz
));
8211 #if defined(TARGET_NR_select)
8212 case TARGET_NR_select
:
8213 #if defined(TARGET_WANT_NI_OLD_SELECT)
8214 /* some architectures used to have old_select here
8215 * but now ENOSYS it.
8217 ret
= -TARGET_ENOSYS
;
8218 #elif defined(TARGET_WANT_OLD_SYS_SELECT)
8219 ret
= do_old_select(arg1
);
8221 ret
= do_select(arg1
, arg2
, arg3
, arg4
, arg5
);
8225 #ifdef TARGET_NR_pselect6
8226 case TARGET_NR_pselect6
:
8228 abi_long rfd_addr
, wfd_addr
, efd_addr
, n
, ts_addr
;
8229 fd_set rfds
, wfds
, efds
;
8230 fd_set
*rfds_ptr
, *wfds_ptr
, *efds_ptr
;
8231 struct timespec ts
, *ts_ptr
;
8234 * The 6th arg is actually two args smashed together,
8235 * so we cannot use the C library.
8243 abi_ulong arg_sigset
, arg_sigsize
, *arg7
;
8244 target_sigset_t
*target_sigset
;
8252 ret
= copy_from_user_fdset_ptr(&rfds
, &rfds_ptr
, rfd_addr
, n
);
8256 ret
= copy_from_user_fdset_ptr(&wfds
, &wfds_ptr
, wfd_addr
, n
);
8260 ret
= copy_from_user_fdset_ptr(&efds
, &efds_ptr
, efd_addr
, n
);
8266 * This takes a timespec, and not a timeval, so we cannot
8267 * use the do_select() helper ...
8270 if (target_to_host_timespec(&ts
, ts_addr
)) {
8271 return -TARGET_EFAULT
;
8278 /* Extract the two packed args for the sigset */
8281 sig
.size
= SIGSET_T_SIZE
;
8283 arg7
= lock_user(VERIFY_READ
, arg6
, sizeof(*arg7
) * 2, 1);
8285 return -TARGET_EFAULT
;
8287 arg_sigset
= tswapal(arg7
[0]);
8288 arg_sigsize
= tswapal(arg7
[1]);
8289 unlock_user(arg7
, arg6
, 0);
8293 if (arg_sigsize
!= sizeof(*target_sigset
)) {
8294 /* Like the kernel, we enforce correct size sigsets */
8295 return -TARGET_EINVAL
;
8297 target_sigset
= lock_user(VERIFY_READ
, arg_sigset
,
8298 sizeof(*target_sigset
), 1);
8299 if (!target_sigset
) {
8300 return -TARGET_EFAULT
;
8302 target_to_host_sigset(&set
, target_sigset
);
8303 unlock_user(target_sigset
, arg_sigset
, 0);
8311 ret
= get_errno(safe_pselect6(n
, rfds_ptr
, wfds_ptr
, efds_ptr
,
8314 if (!is_error(ret
)) {
8315 if (rfd_addr
&& copy_to_user_fdset(rfd_addr
, &rfds
, n
))
8316 return -TARGET_EFAULT
;
8317 if (wfd_addr
&& copy_to_user_fdset(wfd_addr
, &wfds
, n
))
8318 return -TARGET_EFAULT
;
8319 if (efd_addr
&& copy_to_user_fdset(efd_addr
, &efds
, n
))
8320 return -TARGET_EFAULT
;
8322 if (ts_addr
&& host_to_target_timespec(ts_addr
, &ts
))
8323 return -TARGET_EFAULT
;
8328 #ifdef TARGET_NR_symlink
8329 case TARGET_NR_symlink
:
8332 p
= lock_user_string(arg1
);
8333 p2
= lock_user_string(arg2
);
8335 ret
= -TARGET_EFAULT
;
8337 ret
= get_errno(symlink(p
, p2
));
8338 unlock_user(p2
, arg2
, 0);
8339 unlock_user(p
, arg1
, 0);
8343 #if defined(TARGET_NR_symlinkat)
8344 case TARGET_NR_symlinkat
:
8347 p
= lock_user_string(arg1
);
8348 p2
= lock_user_string(arg3
);
8350 ret
= -TARGET_EFAULT
;
8352 ret
= get_errno(symlinkat(p
, arg2
, p2
));
8353 unlock_user(p2
, arg3
, 0);
8354 unlock_user(p
, arg1
, 0);
8358 #ifdef TARGET_NR_readlink
8359 case TARGET_NR_readlink
:
8362 p
= lock_user_string(arg1
);
8363 p2
= lock_user(VERIFY_WRITE
, arg2
, arg3
, 0);
8365 ret
= -TARGET_EFAULT
;
8367 /* Short circuit this for the magic exe check. */
8368 ret
= -TARGET_EINVAL
;
8369 } else if (is_proc_myself((const char *)p
, "exe")) {
8370 char real
[PATH_MAX
], *temp
;
8371 temp
= realpath(exec_path
, real
);
8372 /* Return value is # of bytes that we wrote to the buffer. */
8374 ret
= get_errno(-1);
8376 /* Don't worry about sign mismatch as earlier mapping
8377 * logic would have thrown a bad address error. */
8378 ret
= MIN(strlen(real
), arg3
);
8379 /* We cannot NUL terminate the string. */
8380 memcpy(p2
, real
, ret
);
8383 ret
= get_errno(readlink(path(p
), p2
, arg3
));
8385 unlock_user(p2
, arg2
, ret
);
8386 unlock_user(p
, arg1
, 0);
8390 #if defined(TARGET_NR_readlinkat)
8391 case TARGET_NR_readlinkat
:
8394 p
= lock_user_string(arg2
);
8395 p2
= lock_user(VERIFY_WRITE
, arg3
, arg4
, 0);
8397 ret
= -TARGET_EFAULT
;
8398 } else if (is_proc_myself((const char *)p
, "exe")) {
8399 char real
[PATH_MAX
], *temp
;
8400 temp
= realpath(exec_path
, real
);
8401 ret
= temp
== NULL
? get_errno(-1) : strlen(real
) ;
8402 snprintf((char *)p2
, arg4
, "%s", real
);
8404 ret
= get_errno(readlinkat(arg1
, path(p
), p2
, arg4
));
8406 unlock_user(p2
, arg3
, ret
);
8407 unlock_user(p
, arg2
, 0);
8411 #ifdef TARGET_NR_swapon
8412 case TARGET_NR_swapon
:
8413 if (!(p
= lock_user_string(arg1
)))
8414 return -TARGET_EFAULT
;
8415 ret
= get_errno(swapon(p
, arg2
));
8416 unlock_user(p
, arg1
, 0);
8419 case TARGET_NR_reboot
:
8420 if (arg3
== LINUX_REBOOT_CMD_RESTART2
) {
8421 /* arg4 must be ignored in all other cases */
8422 p
= lock_user_string(arg4
);
8424 return -TARGET_EFAULT
;
8426 ret
= get_errno(reboot(arg1
, arg2
, arg3
, p
));
8427 unlock_user(p
, arg4
, 0);
8429 ret
= get_errno(reboot(arg1
, arg2
, arg3
, NULL
));
8432 #ifdef TARGET_NR_mmap
8433 case TARGET_NR_mmap
:
8434 #if (defined(TARGET_I386) && defined(TARGET_ABI32)) || \
8435 (defined(TARGET_ARM) && defined(TARGET_ABI32)) || \
8436 defined(TARGET_M68K) || defined(TARGET_CRIS) || defined(TARGET_MICROBLAZE) \
8437 || defined(TARGET_S390X)
8440 abi_ulong v1
, v2
, v3
, v4
, v5
, v6
;
8441 if (!(v
= lock_user(VERIFY_READ
, arg1
, 6 * sizeof(abi_ulong
), 1)))
8442 return -TARGET_EFAULT
;
8449 unlock_user(v
, arg1
, 0);
8450 ret
= get_errno(target_mmap(v1
, v2
, v3
,
8451 target_to_host_bitmask(v4
, mmap_flags_tbl
),
8455 ret
= get_errno(target_mmap(arg1
, arg2
, arg3
,
8456 target_to_host_bitmask(arg4
, mmap_flags_tbl
),
8462 #ifdef TARGET_NR_mmap2
8463 case TARGET_NR_mmap2
:
8465 #define MMAP_SHIFT 12
8467 ret
= target_mmap(arg1
, arg2
, arg3
,
8468 target_to_host_bitmask(arg4
, mmap_flags_tbl
),
8469 arg5
, arg6
<< MMAP_SHIFT
);
8470 return get_errno(ret
);
8472 case TARGET_NR_munmap
:
8473 return get_errno(target_munmap(arg1
, arg2
));
8474 case TARGET_NR_mprotect
:
8476 TaskState
*ts
= cpu
->opaque
;
8477 /* Special hack to detect libc making the stack executable. */
8478 if ((arg3
& PROT_GROWSDOWN
)
8479 && arg1
>= ts
->info
->stack_limit
8480 && arg1
<= ts
->info
->start_stack
) {
8481 arg3
&= ~PROT_GROWSDOWN
;
8482 arg2
= arg2
+ arg1
- ts
->info
->stack_limit
;
8483 arg1
= ts
->info
->stack_limit
;
8486 return get_errno(target_mprotect(arg1
, arg2
, arg3
));
8487 #ifdef TARGET_NR_mremap
8488 case TARGET_NR_mremap
:
8489 return get_errno(target_mremap(arg1
, arg2
, arg3
, arg4
, arg5
));
8491 /* ??? msync/mlock/munlock are broken for softmmu. */
8492 #ifdef TARGET_NR_msync
8493 case TARGET_NR_msync
:
8494 return get_errno(msync(g2h(arg1
), arg2
, arg3
));
8496 #ifdef TARGET_NR_mlock
8497 case TARGET_NR_mlock
:
8498 return get_errno(mlock(g2h(arg1
), arg2
));
8500 #ifdef TARGET_NR_munlock
8501 case TARGET_NR_munlock
:
8502 return get_errno(munlock(g2h(arg1
), arg2
));
8504 #ifdef TARGET_NR_mlockall
8505 case TARGET_NR_mlockall
:
8506 return get_errno(mlockall(target_to_host_mlockall_arg(arg1
)));
8508 #ifdef TARGET_NR_munlockall
8509 case TARGET_NR_munlockall
:
8510 return get_errno(munlockall());
8512 #ifdef TARGET_NR_truncate
8513 case TARGET_NR_truncate
:
8514 if (!(p
= lock_user_string(arg1
)))
8515 return -TARGET_EFAULT
;
8516 ret
= get_errno(truncate(p
, arg2
));
8517 unlock_user(p
, arg1
, 0);
8520 #ifdef TARGET_NR_ftruncate
8521 case TARGET_NR_ftruncate
:
8522 return get_errno(ftruncate(arg1
, arg2
));
8524 case TARGET_NR_fchmod
:
8525 return get_errno(fchmod(arg1
, arg2
));
8526 #if defined(TARGET_NR_fchmodat)
8527 case TARGET_NR_fchmodat
:
8528 if (!(p
= lock_user_string(arg2
)))
8529 return -TARGET_EFAULT
;
8530 ret
= get_errno(fchmodat(arg1
, p
, arg3
, 0));
8531 unlock_user(p
, arg2
, 0);
8534 case TARGET_NR_getpriority
:
8535 /* Note that negative values are valid for getpriority, so we must
8536 differentiate based on errno settings. */
8538 ret
= getpriority(arg1
, arg2
);
8539 if (ret
== -1 && errno
!= 0) {
8540 return -host_to_target_errno(errno
);
8543 /* Return value is the unbiased priority. Signal no error. */
8544 ((CPUAlphaState
*)cpu_env
)->ir
[IR_V0
] = 0;
8546 /* Return value is a biased priority to avoid negative numbers. */
8550 case TARGET_NR_setpriority
:
8551 return get_errno(setpriority(arg1
, arg2
, arg3
));
8552 #ifdef TARGET_NR_statfs
8553 case TARGET_NR_statfs
:
8554 if (!(p
= lock_user_string(arg1
))) {
8555 return -TARGET_EFAULT
;
8557 ret
= get_errno(statfs(path(p
), &stfs
));
8558 unlock_user(p
, arg1
, 0);
8560 if (!is_error(ret
)) {
8561 struct target_statfs
*target_stfs
;
8563 if (!lock_user_struct(VERIFY_WRITE
, target_stfs
, arg2
, 0))
8564 return -TARGET_EFAULT
;
8565 __put_user(stfs
.f_type
, &target_stfs
->f_type
);
8566 __put_user(stfs
.f_bsize
, &target_stfs
->f_bsize
);
8567 __put_user(stfs
.f_blocks
, &target_stfs
->f_blocks
);
8568 __put_user(stfs
.f_bfree
, &target_stfs
->f_bfree
);
8569 __put_user(stfs
.f_bavail
, &target_stfs
->f_bavail
);
8570 __put_user(stfs
.f_files
, &target_stfs
->f_files
);
8571 __put_user(stfs
.f_ffree
, &target_stfs
->f_ffree
);
8572 __put_user(stfs
.f_fsid
.__val
[0], &target_stfs
->f_fsid
.val
[0]);
8573 __put_user(stfs
.f_fsid
.__val
[1], &target_stfs
->f_fsid
.val
[1]);
8574 __put_user(stfs
.f_namelen
, &target_stfs
->f_namelen
);
8575 __put_user(stfs
.f_frsize
, &target_stfs
->f_frsize
);
8576 #ifdef _STATFS_F_FLAGS
8577 __put_user(stfs
.f_flags
, &target_stfs
->f_flags
);
8579 __put_user(0, &target_stfs
->f_flags
);
8581 memset(target_stfs
->f_spare
, 0, sizeof(target_stfs
->f_spare
));
8582 unlock_user_struct(target_stfs
, arg2
, 1);
8586 #ifdef TARGET_NR_fstatfs
8587 case TARGET_NR_fstatfs
:
8588 ret
= get_errno(fstatfs(arg1
, &stfs
));
8589 goto convert_statfs
;
8591 #ifdef TARGET_NR_statfs64
8592 case TARGET_NR_statfs64
:
8593 if (!(p
= lock_user_string(arg1
))) {
8594 return -TARGET_EFAULT
;
8596 ret
= get_errno(statfs(path(p
), &stfs
));
8597 unlock_user(p
, arg1
, 0);
8599 if (!is_error(ret
)) {
8600 struct target_statfs64
*target_stfs
;
8602 if (!lock_user_struct(VERIFY_WRITE
, target_stfs
, arg3
, 0))
8603 return -TARGET_EFAULT
;
8604 __put_user(stfs
.f_type
, &target_stfs
->f_type
);
8605 __put_user(stfs
.f_bsize
, &target_stfs
->f_bsize
);
8606 __put_user(stfs
.f_blocks
, &target_stfs
->f_blocks
);
8607 __put_user(stfs
.f_bfree
, &target_stfs
->f_bfree
);
8608 __put_user(stfs
.f_bavail
, &target_stfs
->f_bavail
);
8609 __put_user(stfs
.f_files
, &target_stfs
->f_files
);
8610 __put_user(stfs
.f_ffree
, &target_stfs
->f_ffree
);
8611 __put_user(stfs
.f_fsid
.__val
[0], &target_stfs
->f_fsid
.val
[0]);
8612 __put_user(stfs
.f_fsid
.__val
[1], &target_stfs
->f_fsid
.val
[1]);
8613 __put_user(stfs
.f_namelen
, &target_stfs
->f_namelen
);
8614 __put_user(stfs
.f_frsize
, &target_stfs
->f_frsize
);
8615 memset(target_stfs
->f_spare
, 0, sizeof(target_stfs
->f_spare
));
8616 unlock_user_struct(target_stfs
, arg3
, 1);
8619 case TARGET_NR_fstatfs64
:
8620 ret
= get_errno(fstatfs(arg1
, &stfs
));
8621 goto convert_statfs64
;
8623 #ifdef TARGET_NR_socketcall
8624 case TARGET_NR_socketcall
:
8625 return do_socketcall(arg1
, arg2
);
8627 #ifdef TARGET_NR_accept
8628 case TARGET_NR_accept
:
8629 return do_accept4(arg1
, arg2
, arg3
, 0);
8631 #ifdef TARGET_NR_accept4
8632 case TARGET_NR_accept4
:
8633 return do_accept4(arg1
, arg2
, arg3
, arg4
);
8635 #ifdef TARGET_NR_bind
8636 case TARGET_NR_bind
:
8637 return do_bind(arg1
, arg2
, arg3
);
8639 #ifdef TARGET_NR_connect
8640 case TARGET_NR_connect
:
8641 return do_connect(arg1
, arg2
, arg3
);
8643 #ifdef TARGET_NR_getpeername
8644 case TARGET_NR_getpeername
:
8645 return do_getpeername(arg1
, arg2
, arg3
);
8647 #ifdef TARGET_NR_getsockname
8648 case TARGET_NR_getsockname
:
8649 return do_getsockname(arg1
, arg2
, arg3
);
8651 #ifdef TARGET_NR_getsockopt
8652 case TARGET_NR_getsockopt
:
8653 return do_getsockopt(arg1
, arg2
, arg3
, arg4
, arg5
);
8655 #ifdef TARGET_NR_listen
8656 case TARGET_NR_listen
:
8657 return get_errno(listen(arg1
, arg2
));
8659 #ifdef TARGET_NR_recv
8660 case TARGET_NR_recv
:
8661 return do_recvfrom(arg1
, arg2
, arg3
, arg4
, 0, 0);
8663 #ifdef TARGET_NR_recvfrom
8664 case TARGET_NR_recvfrom
:
8665 return do_recvfrom(arg1
, arg2
, arg3
, arg4
, arg5
, arg6
);
8667 #ifdef TARGET_NR_recvmsg
8668 case TARGET_NR_recvmsg
:
8669 return do_sendrecvmsg(arg1
, arg2
, arg3
, 0);
8671 #ifdef TARGET_NR_send
8672 case TARGET_NR_send
:
8673 return do_sendto(arg1
, arg2
, arg3
, arg4
, 0, 0);
8675 #ifdef TARGET_NR_sendmsg
8676 case TARGET_NR_sendmsg
:
8677 return do_sendrecvmsg(arg1
, arg2
, arg3
, 1);
8679 #ifdef TARGET_NR_sendmmsg
8680 case TARGET_NR_sendmmsg
:
8681 return do_sendrecvmmsg(arg1
, arg2
, arg3
, arg4
, 1);
8682 case TARGET_NR_recvmmsg
:
8683 return do_sendrecvmmsg(arg1
, arg2
, arg3
, arg4
, 0);
8685 #ifdef TARGET_NR_sendto
8686 case TARGET_NR_sendto
:
8687 return do_sendto(arg1
, arg2
, arg3
, arg4
, arg5
, arg6
);
8689 #ifdef TARGET_NR_shutdown
8690 case TARGET_NR_shutdown
:
8691 return get_errno(shutdown(arg1
, arg2
));
8693 #if defined(TARGET_NR_getrandom) && defined(__NR_getrandom)
8694 case TARGET_NR_getrandom
:
8695 p
= lock_user(VERIFY_WRITE
, arg1
, arg2
, 0);
8697 return -TARGET_EFAULT
;
8699 ret
= get_errno(getrandom(p
, arg2
, arg3
));
8700 unlock_user(p
, arg1
, ret
);
8703 #ifdef TARGET_NR_socket
8704 case TARGET_NR_socket
:
8705 return do_socket(arg1
, arg2
, arg3
);
8707 #ifdef TARGET_NR_socketpair
8708 case TARGET_NR_socketpair
:
8709 return do_socketpair(arg1
, arg2
, arg3
, arg4
);
8711 #ifdef TARGET_NR_setsockopt
8712 case TARGET_NR_setsockopt
:
8713 return do_setsockopt(arg1
, arg2
, arg3
, arg4
, (socklen_t
) arg5
);
8715 #if defined(TARGET_NR_syslog)
8716 case TARGET_NR_syslog
:
8721 case TARGET_SYSLOG_ACTION_CLOSE
: /* Close log */
8722 case TARGET_SYSLOG_ACTION_OPEN
: /* Open log */
8723 case TARGET_SYSLOG_ACTION_CLEAR
: /* Clear ring buffer */
8724 case TARGET_SYSLOG_ACTION_CONSOLE_OFF
: /* Disable logging */
8725 case TARGET_SYSLOG_ACTION_CONSOLE_ON
: /* Enable logging */
8726 case TARGET_SYSLOG_ACTION_CONSOLE_LEVEL
: /* Set messages level */
8727 case TARGET_SYSLOG_ACTION_SIZE_UNREAD
: /* Number of chars */
8728 case TARGET_SYSLOG_ACTION_SIZE_BUFFER
: /* Size of the buffer */
8729 return get_errno(sys_syslog((int)arg1
, NULL
, (int)arg3
));
8730 case TARGET_SYSLOG_ACTION_READ
: /* Read from log */
8731 case TARGET_SYSLOG_ACTION_READ_CLEAR
: /* Read/clear msgs */
8732 case TARGET_SYSLOG_ACTION_READ_ALL
: /* Read last messages */
8735 return -TARGET_EINVAL
;
8740 p
= lock_user(VERIFY_WRITE
, arg2
, arg3
, 0);
8742 return -TARGET_EFAULT
;
8744 ret
= get_errno(sys_syslog((int)arg1
, p
, (int)arg3
));
8745 unlock_user(p
, arg2
, arg3
);
8749 return -TARGET_EINVAL
;
8754 case TARGET_NR_setitimer
:
8756 struct itimerval value
, ovalue
, *pvalue
;
8760 if (copy_from_user_timeval(&pvalue
->it_interval
, arg2
)
8761 || copy_from_user_timeval(&pvalue
->it_value
,
8762 arg2
+ sizeof(struct target_timeval
)))
8763 return -TARGET_EFAULT
;
8767 ret
= get_errno(setitimer(arg1
, pvalue
, &ovalue
));
8768 if (!is_error(ret
) && arg3
) {
8769 if (copy_to_user_timeval(arg3
,
8770 &ovalue
.it_interval
)
8771 || copy_to_user_timeval(arg3
+ sizeof(struct target_timeval
),
8773 return -TARGET_EFAULT
;
8777 case TARGET_NR_getitimer
:
8779 struct itimerval value
;
8781 ret
= get_errno(getitimer(arg1
, &value
));
8782 if (!is_error(ret
) && arg2
) {
8783 if (copy_to_user_timeval(arg2
,
8785 || copy_to_user_timeval(arg2
+ sizeof(struct target_timeval
),
8787 return -TARGET_EFAULT
;
8791 #ifdef TARGET_NR_stat
8792 case TARGET_NR_stat
:
8793 if (!(p
= lock_user_string(arg1
))) {
8794 return -TARGET_EFAULT
;
8796 ret
= get_errno(stat(path(p
), &st
));
8797 unlock_user(p
, arg1
, 0);
8800 #ifdef TARGET_NR_lstat
8801 case TARGET_NR_lstat
:
8802 if (!(p
= lock_user_string(arg1
))) {
8803 return -TARGET_EFAULT
;
8805 ret
= get_errno(lstat(path(p
), &st
));
8806 unlock_user(p
, arg1
, 0);
8809 #ifdef TARGET_NR_fstat
8810 case TARGET_NR_fstat
:
8812 ret
= get_errno(fstat(arg1
, &st
));
8813 #if defined(TARGET_NR_stat) || defined(TARGET_NR_lstat)
8816 if (!is_error(ret
)) {
8817 struct target_stat
*target_st
;
8819 if (!lock_user_struct(VERIFY_WRITE
, target_st
, arg2
, 0))
8820 return -TARGET_EFAULT
;
8821 memset(target_st
, 0, sizeof(*target_st
));
8822 __put_user(st
.st_dev
, &target_st
->st_dev
);
8823 __put_user(st
.st_ino
, &target_st
->st_ino
);
8824 __put_user(st
.st_mode
, &target_st
->st_mode
);
8825 __put_user(st
.st_uid
, &target_st
->st_uid
);
8826 __put_user(st
.st_gid
, &target_st
->st_gid
);
8827 __put_user(st
.st_nlink
, &target_st
->st_nlink
);
8828 __put_user(st
.st_rdev
, &target_st
->st_rdev
);
8829 __put_user(st
.st_size
, &target_st
->st_size
);
8830 __put_user(st
.st_blksize
, &target_st
->st_blksize
);
8831 __put_user(st
.st_blocks
, &target_st
->st_blocks
);
8832 __put_user(st
.st_atime
, &target_st
->target_st_atime
);
8833 __put_user(st
.st_mtime
, &target_st
->target_st_mtime
);
8834 __put_user(st
.st_ctime
, &target_st
->target_st_ctime
);
8835 unlock_user_struct(target_st
, arg2
, 1);
8840 case TARGET_NR_vhangup
:
8841 return get_errno(vhangup());
8842 #ifdef TARGET_NR_syscall
8843 case TARGET_NR_syscall
:
8844 return do_syscall(cpu_env
, arg1
& 0xffff, arg2
, arg3
, arg4
, arg5
,
8845 arg6
, arg7
, arg8
, 0);
8847 case TARGET_NR_wait4
:
8850 abi_long status_ptr
= arg2
;
8851 struct rusage rusage
, *rusage_ptr
;
8852 abi_ulong target_rusage
= arg4
;
8853 abi_long rusage_err
;
8855 rusage_ptr
= &rusage
;
8858 ret
= get_errno(safe_wait4(arg1
, &status
, arg3
, rusage_ptr
));
8859 if (!is_error(ret
)) {
8860 if (status_ptr
&& ret
) {
8861 status
= host_to_target_waitstatus(status
);
8862 if (put_user_s32(status
, status_ptr
))
8863 return -TARGET_EFAULT
;
8865 if (target_rusage
) {
8866 rusage_err
= host_to_target_rusage(target_rusage
, &rusage
);
8874 #ifdef TARGET_NR_swapoff
8875 case TARGET_NR_swapoff
:
8876 if (!(p
= lock_user_string(arg1
)))
8877 return -TARGET_EFAULT
;
8878 ret
= get_errno(swapoff(p
));
8879 unlock_user(p
, arg1
, 0);
8882 case TARGET_NR_sysinfo
:
8884 struct target_sysinfo
*target_value
;
8885 struct sysinfo value
;
8886 ret
= get_errno(sysinfo(&value
));
8887 if (!is_error(ret
) && arg1
)
8889 if (!lock_user_struct(VERIFY_WRITE
, target_value
, arg1
, 0))
8890 return -TARGET_EFAULT
;
8891 __put_user(value
.uptime
, &target_value
->uptime
);
8892 __put_user(value
.loads
[0], &target_value
->loads
[0]);
8893 __put_user(value
.loads
[1], &target_value
->loads
[1]);
8894 __put_user(value
.loads
[2], &target_value
->loads
[2]);
8895 __put_user(value
.totalram
, &target_value
->totalram
);
8896 __put_user(value
.freeram
, &target_value
->freeram
);
8897 __put_user(value
.sharedram
, &target_value
->sharedram
);
8898 __put_user(value
.bufferram
, &target_value
->bufferram
);
8899 __put_user(value
.totalswap
, &target_value
->totalswap
);
8900 __put_user(value
.freeswap
, &target_value
->freeswap
);
8901 __put_user(value
.procs
, &target_value
->procs
);
8902 __put_user(value
.totalhigh
, &target_value
->totalhigh
);
8903 __put_user(value
.freehigh
, &target_value
->freehigh
);
8904 __put_user(value
.mem_unit
, &target_value
->mem_unit
);
8905 unlock_user_struct(target_value
, arg1
, 1);
8909 #ifdef TARGET_NR_ipc
8911 return do_ipc(cpu_env
, arg1
, arg2
, arg3
, arg4
, arg5
, arg6
);
8913 #ifdef TARGET_NR_semget
8914 case TARGET_NR_semget
:
8915 return get_errno(semget(arg1
, arg2
, arg3
));
8917 #ifdef TARGET_NR_semop
8918 case TARGET_NR_semop
:
8919 return do_semop(arg1
, arg2
, arg3
);
8921 #ifdef TARGET_NR_semctl
8922 case TARGET_NR_semctl
:
8923 return do_semctl(arg1
, arg2
, arg3
, arg4
);
8925 #ifdef TARGET_NR_msgctl
8926 case TARGET_NR_msgctl
:
8927 return do_msgctl(arg1
, arg2
, arg3
);
8929 #ifdef TARGET_NR_msgget
8930 case TARGET_NR_msgget
:
8931 return get_errno(msgget(arg1
, arg2
));
8933 #ifdef TARGET_NR_msgrcv
8934 case TARGET_NR_msgrcv
:
8935 return do_msgrcv(arg1
, arg2
, arg3
, arg4
, arg5
);
8937 #ifdef TARGET_NR_msgsnd
8938 case TARGET_NR_msgsnd
:
8939 return do_msgsnd(arg1
, arg2
, arg3
, arg4
);
8941 #ifdef TARGET_NR_shmget
8942 case TARGET_NR_shmget
:
8943 return get_errno(shmget(arg1
, arg2
, arg3
));
8945 #ifdef TARGET_NR_shmctl
8946 case TARGET_NR_shmctl
:
8947 return do_shmctl(arg1
, arg2
, arg3
);
8949 #ifdef TARGET_NR_shmat
8950 case TARGET_NR_shmat
:
8951 return do_shmat(cpu_env
, arg1
, arg2
, arg3
);
8953 #ifdef TARGET_NR_shmdt
8954 case TARGET_NR_shmdt
:
8955 return do_shmdt(arg1
);
8957 case TARGET_NR_fsync
:
8958 return get_errno(fsync(arg1
));
8959 case TARGET_NR_clone
:
8960 /* Linux manages to have three different orderings for its
8961 * arguments to clone(); the BACKWARDS and BACKWARDS2 defines
8962 * match the kernel's CONFIG_CLONE_* settings.
8963 * Microblaze is further special in that it uses a sixth
8964 * implicit argument to clone for the TLS pointer.
8966 #if defined(TARGET_MICROBLAZE)
8967 ret
= get_errno(do_fork(cpu_env
, arg1
, arg2
, arg4
, arg6
, arg5
));
8968 #elif defined(TARGET_CLONE_BACKWARDS)
8969 ret
= get_errno(do_fork(cpu_env
, arg1
, arg2
, arg3
, arg4
, arg5
));
8970 #elif defined(TARGET_CLONE_BACKWARDS2)
8971 ret
= get_errno(do_fork(cpu_env
, arg2
, arg1
, arg3
, arg5
, arg4
));
8973 ret
= get_errno(do_fork(cpu_env
, arg1
, arg2
, arg3
, arg5
, arg4
));
8976 #ifdef __NR_exit_group
8977 /* new thread calls */
8978 case TARGET_NR_exit_group
:
8979 preexit_cleanup(cpu_env
, arg1
);
8980 return get_errno(exit_group(arg1
));
8982 case TARGET_NR_setdomainname
:
8983 if (!(p
= lock_user_string(arg1
)))
8984 return -TARGET_EFAULT
;
8985 ret
= get_errno(setdomainname(p
, arg2
));
8986 unlock_user(p
, arg1
, 0);
8988 case TARGET_NR_uname
:
8989 /* no need to transcode because we use the linux syscall */
8991 struct new_utsname
* buf
;
8993 if (!lock_user_struct(VERIFY_WRITE
, buf
, arg1
, 0))
8994 return -TARGET_EFAULT
;
8995 ret
= get_errno(sys_uname(buf
));
8996 if (!is_error(ret
)) {
8997 /* Overwrite the native machine name with whatever is being
8999 g_strlcpy(buf
->machine
, cpu_to_uname_machine(cpu_env
),
9000 sizeof(buf
->machine
));
9001 /* Allow the user to override the reported release. */
9002 if (qemu_uname_release
&& *qemu_uname_release
) {
9003 g_strlcpy(buf
->release
, qemu_uname_release
,
9004 sizeof(buf
->release
));
9007 unlock_user_struct(buf
, arg1
, 1);
9011 case TARGET_NR_modify_ldt
:
9012 return do_modify_ldt(cpu_env
, arg1
, arg2
, arg3
);
9013 #if !defined(TARGET_X86_64)
9014 case TARGET_NR_vm86
:
9015 return do_vm86(cpu_env
, arg1
, arg2
);
9018 case TARGET_NR_adjtimex
:
9020 struct timex host_buf
;
9022 if (target_to_host_timex(&host_buf
, arg1
) != 0) {
9023 return -TARGET_EFAULT
;
9025 ret
= get_errno(adjtimex(&host_buf
));
9026 if (!is_error(ret
)) {
9027 if (host_to_target_timex(arg1
, &host_buf
) != 0) {
9028 return -TARGET_EFAULT
;
9033 #if defined(TARGET_NR_clock_adjtime) && defined(CONFIG_CLOCK_ADJTIME)
9034 case TARGET_NR_clock_adjtime
:
9036 struct timex htx
, *phtx
= &htx
;
9038 if (target_to_host_timex(phtx
, arg2
) != 0) {
9039 return -TARGET_EFAULT
;
9041 ret
= get_errno(clock_adjtime(arg1
, phtx
));
9042 if (!is_error(ret
) && phtx
) {
9043 if (host_to_target_timex(arg2
, phtx
) != 0) {
9044 return -TARGET_EFAULT
;
9050 case TARGET_NR_getpgid
:
9051 return get_errno(getpgid(arg1
));
9052 case TARGET_NR_fchdir
:
9053 return get_errno(fchdir(arg1
));
9054 case TARGET_NR_personality
:
9055 return get_errno(personality(arg1
));
9056 #ifdef TARGET_NR__llseek /* Not on alpha */
9057 case TARGET_NR__llseek
:
9060 #if !defined(__NR_llseek)
9061 res
= lseek(arg1
, ((uint64_t)arg2
<< 32) | (abi_ulong
)arg3
, arg5
);
9063 ret
= get_errno(res
);
9068 ret
= get_errno(_llseek(arg1
, arg2
, arg3
, &res
, arg5
));
9070 if ((ret
== 0) && put_user_s64(res
, arg4
)) {
9071 return -TARGET_EFAULT
;
9076 #ifdef TARGET_NR_getdents
9077 case TARGET_NR_getdents
:
9078 #ifdef EMULATE_GETDENTS_WITH_GETDENTS
9079 #if TARGET_ABI_BITS == 32 && HOST_LONG_BITS == 64
9081 struct target_dirent
*target_dirp
;
9082 struct linux_dirent
*dirp
;
9083 abi_long count
= arg3
;
9085 dirp
= g_try_malloc(count
);
9087 return -TARGET_ENOMEM
;
9090 ret
= get_errno(sys_getdents(arg1
, dirp
, count
));
9091 if (!is_error(ret
)) {
9092 struct linux_dirent
*de
;
9093 struct target_dirent
*tde
;
9095 int reclen
, treclen
;
9096 int count1
, tnamelen
;
9100 if (!(target_dirp
= lock_user(VERIFY_WRITE
, arg2
, count
, 0)))
9101 return -TARGET_EFAULT
;
9104 reclen
= de
->d_reclen
;
9105 tnamelen
= reclen
- offsetof(struct linux_dirent
, d_name
);
9106 assert(tnamelen
>= 0);
9107 treclen
= tnamelen
+ offsetof(struct target_dirent
, d_name
);
9108 assert(count1
+ treclen
<= count
);
9109 tde
->d_reclen
= tswap16(treclen
);
9110 tde
->d_ino
= tswapal(de
->d_ino
);
9111 tde
->d_off
= tswapal(de
->d_off
);
9112 memcpy(tde
->d_name
, de
->d_name
, tnamelen
);
9113 de
= (struct linux_dirent
*)((char *)de
+ reclen
);
9115 tde
= (struct target_dirent
*)((char *)tde
+ treclen
);
9119 unlock_user(target_dirp
, arg2
, ret
);
9125 struct linux_dirent
*dirp
;
9126 abi_long count
= arg3
;
9128 if (!(dirp
= lock_user(VERIFY_WRITE
, arg2
, count
, 0)))
9129 return -TARGET_EFAULT
;
9130 ret
= get_errno(sys_getdents(arg1
, dirp
, count
));
9131 if (!is_error(ret
)) {
9132 struct linux_dirent
*de
;
9137 reclen
= de
->d_reclen
;
9140 de
->d_reclen
= tswap16(reclen
);
9141 tswapls(&de
->d_ino
);
9142 tswapls(&de
->d_off
);
9143 de
= (struct linux_dirent
*)((char *)de
+ reclen
);
9147 unlock_user(dirp
, arg2
, ret
);
9151 /* Implement getdents in terms of getdents64 */
9153 struct linux_dirent64
*dirp
;
9154 abi_long count
= arg3
;
9156 dirp
= lock_user(VERIFY_WRITE
, arg2
, count
, 0);
9158 return -TARGET_EFAULT
;
9160 ret
= get_errno(sys_getdents64(arg1
, dirp
, count
));
9161 if (!is_error(ret
)) {
9162 /* Convert the dirent64 structs to target dirent. We do this
9163 * in-place, since we can guarantee that a target_dirent is no
9164 * larger than a dirent64; however this means we have to be
9165 * careful to read everything before writing in the new format.
9167 struct linux_dirent64
*de
;
9168 struct target_dirent
*tde
;
9173 tde
= (struct target_dirent
*)dirp
;
9175 int namelen
, treclen
;
9176 int reclen
= de
->d_reclen
;
9177 uint64_t ino
= de
->d_ino
;
9178 int64_t off
= de
->d_off
;
9179 uint8_t type
= de
->d_type
;
9181 namelen
= strlen(de
->d_name
);
9182 treclen
= offsetof(struct target_dirent
, d_name
)
9184 treclen
= QEMU_ALIGN_UP(treclen
, sizeof(abi_long
));
9186 memmove(tde
->d_name
, de
->d_name
, namelen
+ 1);
9187 tde
->d_ino
= tswapal(ino
);
9188 tde
->d_off
= tswapal(off
);
9189 tde
->d_reclen
= tswap16(treclen
);
9190 /* The target_dirent type is in what was formerly a padding
9191 * byte at the end of the structure:
9193 *(((char *)tde
) + treclen
- 1) = type
;
9195 de
= (struct linux_dirent64
*)((char *)de
+ reclen
);
9196 tde
= (struct target_dirent
*)((char *)tde
+ treclen
);
9202 unlock_user(dirp
, arg2
, ret
);
9206 #endif /* TARGET_NR_getdents */
9207 #if defined(TARGET_NR_getdents64) && defined(__NR_getdents64)
9208 case TARGET_NR_getdents64
:
9210 struct linux_dirent64
*dirp
;
9211 abi_long count
= arg3
;
9212 if (!(dirp
= lock_user(VERIFY_WRITE
, arg2
, count
, 0)))
9213 return -TARGET_EFAULT
;
9214 ret
= get_errno(sys_getdents64(arg1
, dirp
, count
));
9215 if (!is_error(ret
)) {
9216 struct linux_dirent64
*de
;
9221 reclen
= de
->d_reclen
;
9224 de
->d_reclen
= tswap16(reclen
);
9225 tswap64s((uint64_t *)&de
->d_ino
);
9226 tswap64s((uint64_t *)&de
->d_off
);
9227 de
= (struct linux_dirent64
*)((char *)de
+ reclen
);
9231 unlock_user(dirp
, arg2
, ret
);
9234 #endif /* TARGET_NR_getdents64 */
9235 #if defined(TARGET_NR__newselect)
9236 case TARGET_NR__newselect
:
9237 return do_select(arg1
, arg2
, arg3
, arg4
, arg5
);
9239 #if defined(TARGET_NR_poll) || defined(TARGET_NR_ppoll)
9240 # ifdef TARGET_NR_poll
9241 case TARGET_NR_poll
:
9243 # ifdef TARGET_NR_ppoll
9244 case TARGET_NR_ppoll
:
9247 struct target_pollfd
*target_pfd
;
9248 unsigned int nfds
= arg2
;
9255 if (nfds
> (INT_MAX
/ sizeof(struct target_pollfd
))) {
9256 return -TARGET_EINVAL
;
9259 target_pfd
= lock_user(VERIFY_WRITE
, arg1
,
9260 sizeof(struct target_pollfd
) * nfds
, 1);
9262 return -TARGET_EFAULT
;
9265 pfd
= alloca(sizeof(struct pollfd
) * nfds
);
9266 for (i
= 0; i
< nfds
; i
++) {
9267 pfd
[i
].fd
= tswap32(target_pfd
[i
].fd
);
9268 pfd
[i
].events
= tswap16(target_pfd
[i
].events
);
9273 # ifdef TARGET_NR_ppoll
9274 case TARGET_NR_ppoll
:
9276 struct timespec _timeout_ts
, *timeout_ts
= &_timeout_ts
;
9277 target_sigset_t
*target_set
;
9278 sigset_t _set
, *set
= &_set
;
9281 if (target_to_host_timespec(timeout_ts
, arg3
)) {
9282 unlock_user(target_pfd
, arg1
, 0);
9283 return -TARGET_EFAULT
;
9290 if (arg5
!= sizeof(target_sigset_t
)) {
9291 unlock_user(target_pfd
, arg1
, 0);
9292 return -TARGET_EINVAL
;
9295 target_set
= lock_user(VERIFY_READ
, arg4
, sizeof(target_sigset_t
), 1);
9297 unlock_user(target_pfd
, arg1
, 0);
9298 return -TARGET_EFAULT
;
9300 target_to_host_sigset(set
, target_set
);
9305 ret
= get_errno(safe_ppoll(pfd
, nfds
, timeout_ts
,
9306 set
, SIGSET_T_SIZE
));
9308 if (!is_error(ret
) && arg3
) {
9309 host_to_target_timespec(arg3
, timeout_ts
);
9312 unlock_user(target_set
, arg4
, 0);
9317 # ifdef TARGET_NR_poll
9318 case TARGET_NR_poll
:
9320 struct timespec ts
, *pts
;
9323 /* Convert ms to secs, ns */
9324 ts
.tv_sec
= arg3
/ 1000;
9325 ts
.tv_nsec
= (arg3
% 1000) * 1000000LL;
9328 /* -ve poll() timeout means "infinite" */
9331 ret
= get_errno(safe_ppoll(pfd
, nfds
, pts
, NULL
, 0));
9336 g_assert_not_reached();
9339 if (!is_error(ret
)) {
9340 for(i
= 0; i
< nfds
; i
++) {
9341 target_pfd
[i
].revents
= tswap16(pfd
[i
].revents
);
9344 unlock_user(target_pfd
, arg1
, sizeof(struct target_pollfd
) * nfds
);
9348 case TARGET_NR_flock
:
9349 /* NOTE: the flock constant seems to be the same for every
9351 return get_errno(safe_flock(arg1
, arg2
));
9352 case TARGET_NR_readv
:
9354 struct iovec
*vec
= lock_iovec(VERIFY_WRITE
, arg2
, arg3
, 0);
9356 ret
= get_errno(safe_readv(arg1
, vec
, arg3
));
9357 unlock_iovec(vec
, arg2
, arg3
, 1);
9359 ret
= -host_to_target_errno(errno
);
9363 case TARGET_NR_writev
:
9365 struct iovec
*vec
= lock_iovec(VERIFY_READ
, arg2
, arg3
, 1);
9367 ret
= get_errno(safe_writev(arg1
, vec
, arg3
));
9368 unlock_iovec(vec
, arg2
, arg3
, 0);
9370 ret
= -host_to_target_errno(errno
);
9374 #if defined(TARGET_NR_preadv)
9375 case TARGET_NR_preadv
:
9377 struct iovec
*vec
= lock_iovec(VERIFY_WRITE
, arg2
, arg3
, 0);
9379 unsigned long low
, high
;
9381 target_to_host_low_high(arg4
, arg5
, &low
, &high
);
9382 ret
= get_errno(safe_preadv(arg1
, vec
, arg3
, low
, high
));
9383 unlock_iovec(vec
, arg2
, arg3
, 1);
9385 ret
= -host_to_target_errno(errno
);
9390 #if defined(TARGET_NR_pwritev)
9391 case TARGET_NR_pwritev
:
9393 struct iovec
*vec
= lock_iovec(VERIFY_READ
, arg2
, arg3
, 1);
9395 unsigned long low
, high
;
9397 target_to_host_low_high(arg4
, arg5
, &low
, &high
);
9398 ret
= get_errno(safe_pwritev(arg1
, vec
, arg3
, low
, high
));
9399 unlock_iovec(vec
, arg2
, arg3
, 0);
9401 ret
= -host_to_target_errno(errno
);
9406 case TARGET_NR_getsid
:
9407 return get_errno(getsid(arg1
));
9408 #if defined(TARGET_NR_fdatasync) /* Not on alpha (osf_datasync ?) */
9409 case TARGET_NR_fdatasync
:
9410 return get_errno(fdatasync(arg1
));
9412 #ifdef TARGET_NR__sysctl
9413 case TARGET_NR__sysctl
:
9414 /* We don't implement this, but ENOTDIR is always a safe
9416 return -TARGET_ENOTDIR
;
9418 case TARGET_NR_sched_getaffinity
:
9420 unsigned int mask_size
;
9421 unsigned long *mask
;
9424 * sched_getaffinity needs multiples of ulong, so need to take
9425 * care of mismatches between target ulong and host ulong sizes.
9427 if (arg2
& (sizeof(abi_ulong
) - 1)) {
9428 return -TARGET_EINVAL
;
9430 mask_size
= (arg2
+ (sizeof(*mask
) - 1)) & ~(sizeof(*mask
) - 1);
9432 mask
= alloca(mask_size
);
9433 memset(mask
, 0, mask_size
);
9434 ret
= get_errno(sys_sched_getaffinity(arg1
, mask_size
, mask
));
9436 if (!is_error(ret
)) {
9438 /* More data returned than the caller's buffer will fit.
9439 * This only happens if sizeof(abi_long) < sizeof(long)
9440 * and the caller passed us a buffer holding an odd number
9441 * of abi_longs. If the host kernel is actually using the
9442 * extra 4 bytes then fail EINVAL; otherwise we can just
9443 * ignore them and only copy the interesting part.
9445 int numcpus
= sysconf(_SC_NPROCESSORS_CONF
);
9446 if (numcpus
> arg2
* 8) {
9447 return -TARGET_EINVAL
;
9452 if (host_to_target_cpu_mask(mask
, mask_size
, arg3
, ret
)) {
9453 return -TARGET_EFAULT
;
9458 case TARGET_NR_sched_setaffinity
:
9460 unsigned int mask_size
;
9461 unsigned long *mask
;
9464 * sched_setaffinity needs multiples of ulong, so need to take
9465 * care of mismatches between target ulong and host ulong sizes.
9467 if (arg2
& (sizeof(abi_ulong
) - 1)) {
9468 return -TARGET_EINVAL
;
9470 mask_size
= (arg2
+ (sizeof(*mask
) - 1)) & ~(sizeof(*mask
) - 1);
9471 mask
= alloca(mask_size
);
9473 ret
= target_to_host_cpu_mask(mask
, mask_size
, arg3
, arg2
);
9478 return get_errno(sys_sched_setaffinity(arg1
, mask_size
, mask
));
9480 case TARGET_NR_getcpu
:
9483 ret
= get_errno(sys_getcpu(arg1
? &cpu
: NULL
,
9484 arg2
? &node
: NULL
,
9486 if (is_error(ret
)) {
9489 if (arg1
&& put_user_u32(cpu
, arg1
)) {
9490 return -TARGET_EFAULT
;
9492 if (arg2
&& put_user_u32(node
, arg2
)) {
9493 return -TARGET_EFAULT
;
9497 case TARGET_NR_sched_setparam
:
9499 struct sched_param
*target_schp
;
9500 struct sched_param schp
;
9503 return -TARGET_EINVAL
;
9505 if (!lock_user_struct(VERIFY_READ
, target_schp
, arg2
, 1))
9506 return -TARGET_EFAULT
;
9507 schp
.sched_priority
= tswap32(target_schp
->sched_priority
);
9508 unlock_user_struct(target_schp
, arg2
, 0);
9509 return get_errno(sched_setparam(arg1
, &schp
));
9511 case TARGET_NR_sched_getparam
:
9513 struct sched_param
*target_schp
;
9514 struct sched_param schp
;
9517 return -TARGET_EINVAL
;
9519 ret
= get_errno(sched_getparam(arg1
, &schp
));
9520 if (!is_error(ret
)) {
9521 if (!lock_user_struct(VERIFY_WRITE
, target_schp
, arg2
, 0))
9522 return -TARGET_EFAULT
;
9523 target_schp
->sched_priority
= tswap32(schp
.sched_priority
);
9524 unlock_user_struct(target_schp
, arg2
, 1);
9528 case TARGET_NR_sched_setscheduler
:
9530 struct sched_param
*target_schp
;
9531 struct sched_param schp
;
9533 return -TARGET_EINVAL
;
9535 if (!lock_user_struct(VERIFY_READ
, target_schp
, arg3
, 1))
9536 return -TARGET_EFAULT
;
9537 schp
.sched_priority
= tswap32(target_schp
->sched_priority
);
9538 unlock_user_struct(target_schp
, arg3
, 0);
9539 return get_errno(sched_setscheduler(arg1
, arg2
, &schp
));
9541 case TARGET_NR_sched_getscheduler
:
9542 return get_errno(sched_getscheduler(arg1
));
9543 case TARGET_NR_sched_yield
:
9544 return get_errno(sched_yield());
9545 case TARGET_NR_sched_get_priority_max
:
9546 return get_errno(sched_get_priority_max(arg1
));
9547 case TARGET_NR_sched_get_priority_min
:
9548 return get_errno(sched_get_priority_min(arg1
));
9549 case TARGET_NR_sched_rr_get_interval
:
9552 ret
= get_errno(sched_rr_get_interval(arg1
, &ts
));
9553 if (!is_error(ret
)) {
9554 ret
= host_to_target_timespec(arg2
, &ts
);
9558 case TARGET_NR_nanosleep
:
9560 struct timespec req
, rem
;
9561 target_to_host_timespec(&req
, arg1
);
9562 ret
= get_errno(safe_nanosleep(&req
, &rem
));
9563 if (is_error(ret
) && arg2
) {
9564 host_to_target_timespec(arg2
, &rem
);
9568 case TARGET_NR_prctl
:
9570 case PR_GET_PDEATHSIG
:
9573 ret
= get_errno(prctl(arg1
, &deathsig
, arg3
, arg4
, arg5
));
9574 if (!is_error(ret
) && arg2
9575 && put_user_ual(deathsig
, arg2
)) {
9576 return -TARGET_EFAULT
;
9583 void *name
= lock_user(VERIFY_WRITE
, arg2
, 16, 1);
9585 return -TARGET_EFAULT
;
9587 ret
= get_errno(prctl(arg1
, (unsigned long)name
,
9589 unlock_user(name
, arg2
, 16);
9594 void *name
= lock_user(VERIFY_READ
, arg2
, 16, 1);
9596 return -TARGET_EFAULT
;
9598 ret
= get_errno(prctl(arg1
, (unsigned long)name
,
9600 unlock_user(name
, arg2
, 0);
9605 case TARGET_PR_GET_FP_MODE
:
9607 CPUMIPSState
*env
= ((CPUMIPSState
*)cpu_env
);
9609 if (env
->CP0_Status
& (1 << CP0St_FR
)) {
9610 ret
|= TARGET_PR_FP_MODE_FR
;
9612 if (env
->CP0_Config5
& (1 << CP0C5_FRE
)) {
9613 ret
|= TARGET_PR_FP_MODE_FRE
;
9617 case TARGET_PR_SET_FP_MODE
:
9619 CPUMIPSState
*env
= ((CPUMIPSState
*)cpu_env
);
9620 bool old_fr
= env
->CP0_Status
& (1 << CP0St_FR
);
9621 bool old_fre
= env
->CP0_Config5
& (1 << CP0C5_FRE
);
9622 bool new_fr
= arg2
& TARGET_PR_FP_MODE_FR
;
9623 bool new_fre
= arg2
& TARGET_PR_FP_MODE_FRE
;
9625 const unsigned int known_bits
= TARGET_PR_FP_MODE_FR
|
9626 TARGET_PR_FP_MODE_FRE
;
9628 /* If nothing to change, return right away, successfully. */
9629 if (old_fr
== new_fr
&& old_fre
== new_fre
) {
9632 /* Check the value is valid */
9633 if (arg2
& ~known_bits
) {
9634 return -TARGET_EOPNOTSUPP
;
9636 /* Setting FRE without FR is not supported. */
9637 if (new_fre
&& !new_fr
) {
9638 return -TARGET_EOPNOTSUPP
;
9640 if (new_fr
&& !(env
->active_fpu
.fcr0
& (1 << FCR0_F64
))) {
9641 /* FR1 is not supported */
9642 return -TARGET_EOPNOTSUPP
;
9644 if (!new_fr
&& (env
->active_fpu
.fcr0
& (1 << FCR0_F64
))
9645 && !(env
->CP0_Status_rw_bitmask
& (1 << CP0St_FR
))) {
9646 /* cannot set FR=0 */
9647 return -TARGET_EOPNOTSUPP
;
9649 if (new_fre
&& !(env
->active_fpu
.fcr0
& (1 << FCR0_FREP
))) {
9650 /* Cannot set FRE=1 */
9651 return -TARGET_EOPNOTSUPP
;
9655 fpr_t
*fpr
= env
->active_fpu
.fpr
;
9656 for (i
= 0; i
< 32 ; i
+= 2) {
9657 if (!old_fr
&& new_fr
) {
9658 fpr
[i
].w
[!FP_ENDIAN_IDX
] = fpr
[i
+ 1].w
[FP_ENDIAN_IDX
];
9659 } else if (old_fr
&& !new_fr
) {
9660 fpr
[i
+ 1].w
[FP_ENDIAN_IDX
] = fpr
[i
].w
[!FP_ENDIAN_IDX
];
9665 env
->CP0_Status
|= (1 << CP0St_FR
);
9666 env
->hflags
|= MIPS_HFLAG_F64
;
9668 env
->CP0_Status
&= ~(1 << CP0St_FR
);
9669 env
->hflags
&= ~MIPS_HFLAG_F64
;
9672 env
->CP0_Config5
|= (1 << CP0C5_FRE
);
9673 if (env
->active_fpu
.fcr0
& (1 << FCR0_FREP
)) {
9674 env
->hflags
|= MIPS_HFLAG_FRE
;
9677 env
->CP0_Config5
&= ~(1 << CP0C5_FRE
);
9678 env
->hflags
&= ~MIPS_HFLAG_FRE
;
9684 #ifdef TARGET_AARCH64
9685 case TARGET_PR_SVE_SET_VL
:
9687 * We cannot support either PR_SVE_SET_VL_ONEXEC or
9688 * PR_SVE_VL_INHERIT. Note the kernel definition
9689 * of sve_vl_valid allows for VQ=512, i.e. VL=8192,
9690 * even though the current architectural maximum is VQ=16.
9692 ret
= -TARGET_EINVAL
;
9693 if (cpu_isar_feature(aa64_sve
, arm_env_get_cpu(cpu_env
))
9694 && arg2
>= 0 && arg2
<= 512 * 16 && !(arg2
& 15)) {
9695 CPUARMState
*env
= cpu_env
;
9696 ARMCPU
*cpu
= arm_env_get_cpu(env
);
9697 uint32_t vq
, old_vq
;
9699 old_vq
= (env
->vfp
.zcr_el
[1] & 0xf) + 1;
9700 vq
= MAX(arg2
/ 16, 1);
9701 vq
= MIN(vq
, cpu
->sve_max_vq
);
9704 aarch64_sve_narrow_vq(env
, vq
);
9706 env
->vfp
.zcr_el
[1] = vq
- 1;
9710 case TARGET_PR_SVE_GET_VL
:
9711 ret
= -TARGET_EINVAL
;
9713 ARMCPU
*cpu
= arm_env_get_cpu(cpu_env
);
9714 if (cpu_isar_feature(aa64_sve
, cpu
)) {
9715 ret
= ((cpu
->env
.vfp
.zcr_el
[1] & 0xf) + 1) * 16;
9719 case TARGET_PR_PAC_RESET_KEYS
:
9721 CPUARMState
*env
= cpu_env
;
9722 ARMCPU
*cpu
= arm_env_get_cpu(env
);
9724 if (arg3
|| arg4
|| arg5
) {
9725 return -TARGET_EINVAL
;
9727 if (cpu_isar_feature(aa64_pauth
, cpu
)) {
9728 int all
= (TARGET_PR_PAC_APIAKEY
| TARGET_PR_PAC_APIBKEY
|
9729 TARGET_PR_PAC_APDAKEY
| TARGET_PR_PAC_APDBKEY
|
9730 TARGET_PR_PAC_APGAKEY
);
9733 } else if (arg2
& ~all
) {
9734 return -TARGET_EINVAL
;
9736 if (arg2
& TARGET_PR_PAC_APIAKEY
) {
9737 arm_init_pauth_key(&env
->apia_key
);
9739 if (arg2
& TARGET_PR_PAC_APIBKEY
) {
9740 arm_init_pauth_key(&env
->apib_key
);
9742 if (arg2
& TARGET_PR_PAC_APDAKEY
) {
9743 arm_init_pauth_key(&env
->apda_key
);
9745 if (arg2
& TARGET_PR_PAC_APDBKEY
) {
9746 arm_init_pauth_key(&env
->apdb_key
);
9748 if (arg2
& TARGET_PR_PAC_APGAKEY
) {
9749 arm_init_pauth_key(&env
->apga_key
);
9754 return -TARGET_EINVAL
;
9755 #endif /* AARCH64 */
9756 case PR_GET_SECCOMP
:
9757 case PR_SET_SECCOMP
:
9758 /* Disable seccomp to prevent the target disabling syscalls we
9760 return -TARGET_EINVAL
;
9762 /* Most prctl options have no pointer arguments */
9763 return get_errno(prctl(arg1
, arg2
, arg3
, arg4
, arg5
));
9766 #ifdef TARGET_NR_arch_prctl
9767 case TARGET_NR_arch_prctl
:
9768 #if defined(TARGET_I386) && !defined(TARGET_ABI32)
9769 return do_arch_prctl(cpu_env
, arg1
, arg2
);
9774 #ifdef TARGET_NR_pread64
9775 case TARGET_NR_pread64
:
9776 if (regpairs_aligned(cpu_env
, num
)) {
9780 if (arg2
== 0 && arg3
== 0) {
9781 /* Special-case NULL buffer and zero length, which should succeed */
9784 p
= lock_user(VERIFY_WRITE
, arg2
, arg3
, 0);
9786 return -TARGET_EFAULT
;
9789 ret
= get_errno(pread64(arg1
, p
, arg3
, target_offset64(arg4
, arg5
)));
9790 unlock_user(p
, arg2
, ret
);
9792 case TARGET_NR_pwrite64
:
9793 if (regpairs_aligned(cpu_env
, num
)) {
9797 if (arg2
== 0 && arg3
== 0) {
9798 /* Special-case NULL buffer and zero length, which should succeed */
9801 p
= lock_user(VERIFY_READ
, arg2
, arg3
, 1);
9803 return -TARGET_EFAULT
;
9806 ret
= get_errno(pwrite64(arg1
, p
, arg3
, target_offset64(arg4
, arg5
)));
9807 unlock_user(p
, arg2
, 0);
9810 case TARGET_NR_getcwd
:
9811 if (!(p
= lock_user(VERIFY_WRITE
, arg1
, arg2
, 0)))
9812 return -TARGET_EFAULT
;
9813 ret
= get_errno(sys_getcwd1(p
, arg2
));
9814 unlock_user(p
, arg1
, ret
);
9816 case TARGET_NR_capget
:
9817 case TARGET_NR_capset
:
9819 struct target_user_cap_header
*target_header
;
9820 struct target_user_cap_data
*target_data
= NULL
;
9821 struct __user_cap_header_struct header
;
9822 struct __user_cap_data_struct data
[2];
9823 struct __user_cap_data_struct
*dataptr
= NULL
;
9824 int i
, target_datalen
;
9827 if (!lock_user_struct(VERIFY_WRITE
, target_header
, arg1
, 1)) {
9828 return -TARGET_EFAULT
;
9830 header
.version
= tswap32(target_header
->version
);
9831 header
.pid
= tswap32(target_header
->pid
);
9833 if (header
.version
!= _LINUX_CAPABILITY_VERSION
) {
9834 /* Version 2 and up takes pointer to two user_data structs */
9838 target_datalen
= sizeof(*target_data
) * data_items
;
9841 if (num
== TARGET_NR_capget
) {
9842 target_data
= lock_user(VERIFY_WRITE
, arg2
, target_datalen
, 0);
9844 target_data
= lock_user(VERIFY_READ
, arg2
, target_datalen
, 1);
9847 unlock_user_struct(target_header
, arg1
, 0);
9848 return -TARGET_EFAULT
;
9851 if (num
== TARGET_NR_capset
) {
9852 for (i
= 0; i
< data_items
; i
++) {
9853 data
[i
].effective
= tswap32(target_data
[i
].effective
);
9854 data
[i
].permitted
= tswap32(target_data
[i
].permitted
);
9855 data
[i
].inheritable
= tswap32(target_data
[i
].inheritable
);
9862 if (num
== TARGET_NR_capget
) {
9863 ret
= get_errno(capget(&header
, dataptr
));
9865 ret
= get_errno(capset(&header
, dataptr
));
9868 /* The kernel always updates version for both capget and capset */
9869 target_header
->version
= tswap32(header
.version
);
9870 unlock_user_struct(target_header
, arg1
, 1);
9873 if (num
== TARGET_NR_capget
) {
9874 for (i
= 0; i
< data_items
; i
++) {
9875 target_data
[i
].effective
= tswap32(data
[i
].effective
);
9876 target_data
[i
].permitted
= tswap32(data
[i
].permitted
);
9877 target_data
[i
].inheritable
= tswap32(data
[i
].inheritable
);
9879 unlock_user(target_data
, arg2
, target_datalen
);
9881 unlock_user(target_data
, arg2
, 0);
9886 case TARGET_NR_sigaltstack
:
9887 return do_sigaltstack(arg1
, arg2
,
9888 get_sp_from_cpustate((CPUArchState
*)cpu_env
));
9890 #ifdef CONFIG_SENDFILE
9891 #ifdef TARGET_NR_sendfile
9892 case TARGET_NR_sendfile
:
9897 ret
= get_user_sal(off
, arg3
);
9898 if (is_error(ret
)) {
9903 ret
= get_errno(sendfile(arg1
, arg2
, offp
, arg4
));
9904 if (!is_error(ret
) && arg3
) {
9905 abi_long ret2
= put_user_sal(off
, arg3
);
9906 if (is_error(ret2
)) {
9913 #ifdef TARGET_NR_sendfile64
9914 case TARGET_NR_sendfile64
:
9919 ret
= get_user_s64(off
, arg3
);
9920 if (is_error(ret
)) {
9925 ret
= get_errno(sendfile(arg1
, arg2
, offp
, arg4
));
9926 if (!is_error(ret
) && arg3
) {
9927 abi_long ret2
= put_user_s64(off
, arg3
);
9928 if (is_error(ret2
)) {
9936 #ifdef TARGET_NR_vfork
9937 case TARGET_NR_vfork
:
9938 return get_errno(do_fork(cpu_env
,
9939 CLONE_VFORK
| CLONE_VM
| TARGET_SIGCHLD
,
9942 #ifdef TARGET_NR_ugetrlimit
9943 case TARGET_NR_ugetrlimit
:
9946 int resource
= target_to_host_resource(arg1
);
9947 ret
= get_errno(getrlimit(resource
, &rlim
));
9948 if (!is_error(ret
)) {
9949 struct target_rlimit
*target_rlim
;
9950 if (!lock_user_struct(VERIFY_WRITE
, target_rlim
, arg2
, 0))
9951 return -TARGET_EFAULT
;
9952 target_rlim
->rlim_cur
= host_to_target_rlim(rlim
.rlim_cur
);
9953 target_rlim
->rlim_max
= host_to_target_rlim(rlim
.rlim_max
);
9954 unlock_user_struct(target_rlim
, arg2
, 1);
9959 #ifdef TARGET_NR_truncate64
9960 case TARGET_NR_truncate64
:
9961 if (!(p
= lock_user_string(arg1
)))
9962 return -TARGET_EFAULT
;
9963 ret
= target_truncate64(cpu_env
, p
, arg2
, arg3
, arg4
);
9964 unlock_user(p
, arg1
, 0);
9967 #ifdef TARGET_NR_ftruncate64
9968 case TARGET_NR_ftruncate64
:
9969 return target_ftruncate64(cpu_env
, arg1
, arg2
, arg3
, arg4
);
9971 #ifdef TARGET_NR_stat64
9972 case TARGET_NR_stat64
:
9973 if (!(p
= lock_user_string(arg1
))) {
9974 return -TARGET_EFAULT
;
9976 ret
= get_errno(stat(path(p
), &st
));
9977 unlock_user(p
, arg1
, 0);
9979 ret
= host_to_target_stat64(cpu_env
, arg2
, &st
);
9982 #ifdef TARGET_NR_lstat64
9983 case TARGET_NR_lstat64
:
9984 if (!(p
= lock_user_string(arg1
))) {
9985 return -TARGET_EFAULT
;
9987 ret
= get_errno(lstat(path(p
), &st
));
9988 unlock_user(p
, arg1
, 0);
9990 ret
= host_to_target_stat64(cpu_env
, arg2
, &st
);
9993 #ifdef TARGET_NR_fstat64
9994 case TARGET_NR_fstat64
:
9995 ret
= get_errno(fstat(arg1
, &st
));
9997 ret
= host_to_target_stat64(cpu_env
, arg2
, &st
);
10000 #if (defined(TARGET_NR_fstatat64) || defined(TARGET_NR_newfstatat))
10001 #ifdef TARGET_NR_fstatat64
10002 case TARGET_NR_fstatat64
:
10004 #ifdef TARGET_NR_newfstatat
10005 case TARGET_NR_newfstatat
:
10007 if (!(p
= lock_user_string(arg2
))) {
10008 return -TARGET_EFAULT
;
10010 ret
= get_errno(fstatat(arg1
, path(p
), &st
, arg4
));
10011 unlock_user(p
, arg2
, 0);
10012 if (!is_error(ret
))
10013 ret
= host_to_target_stat64(cpu_env
, arg3
, &st
);
10016 #ifdef TARGET_NR_lchown
10017 case TARGET_NR_lchown
:
10018 if (!(p
= lock_user_string(arg1
)))
10019 return -TARGET_EFAULT
;
10020 ret
= get_errno(lchown(p
, low2highuid(arg2
), low2highgid(arg3
)));
10021 unlock_user(p
, arg1
, 0);
10024 #ifdef TARGET_NR_getuid
10025 case TARGET_NR_getuid
:
10026 return get_errno(high2lowuid(getuid()));
10028 #ifdef TARGET_NR_getgid
10029 case TARGET_NR_getgid
:
10030 return get_errno(high2lowgid(getgid()));
10032 #ifdef TARGET_NR_geteuid
10033 case TARGET_NR_geteuid
:
10034 return get_errno(high2lowuid(geteuid()));
10036 #ifdef TARGET_NR_getegid
10037 case TARGET_NR_getegid
:
10038 return get_errno(high2lowgid(getegid()));
10040 case TARGET_NR_setreuid
:
10041 return get_errno(setreuid(low2highuid(arg1
), low2highuid(arg2
)));
10042 case TARGET_NR_setregid
:
10043 return get_errno(setregid(low2highgid(arg1
), low2highgid(arg2
)));
10044 case TARGET_NR_getgroups
:
10046 int gidsetsize
= arg1
;
10047 target_id
*target_grouplist
;
10051 grouplist
= alloca(gidsetsize
* sizeof(gid_t
));
10052 ret
= get_errno(getgroups(gidsetsize
, grouplist
));
10053 if (gidsetsize
== 0)
10055 if (!is_error(ret
)) {
10056 target_grouplist
= lock_user(VERIFY_WRITE
, arg2
, gidsetsize
* sizeof(target_id
), 0);
10057 if (!target_grouplist
)
10058 return -TARGET_EFAULT
;
10059 for(i
= 0;i
< ret
; i
++)
10060 target_grouplist
[i
] = tswapid(high2lowgid(grouplist
[i
]));
10061 unlock_user(target_grouplist
, arg2
, gidsetsize
* sizeof(target_id
));
10065 case TARGET_NR_setgroups
:
10067 int gidsetsize
= arg1
;
10068 target_id
*target_grouplist
;
10069 gid_t
*grouplist
= NULL
;
10072 grouplist
= alloca(gidsetsize
* sizeof(gid_t
));
10073 target_grouplist
= lock_user(VERIFY_READ
, arg2
, gidsetsize
* sizeof(target_id
), 1);
10074 if (!target_grouplist
) {
10075 return -TARGET_EFAULT
;
10077 for (i
= 0; i
< gidsetsize
; i
++) {
10078 grouplist
[i
] = low2highgid(tswapid(target_grouplist
[i
]));
10080 unlock_user(target_grouplist
, arg2
, 0);
10082 return get_errno(setgroups(gidsetsize
, grouplist
));
10084 case TARGET_NR_fchown
:
10085 return get_errno(fchown(arg1
, low2highuid(arg2
), low2highgid(arg3
)));
10086 #if defined(TARGET_NR_fchownat)
10087 case TARGET_NR_fchownat
:
10088 if (!(p
= lock_user_string(arg2
)))
10089 return -TARGET_EFAULT
;
10090 ret
= get_errno(fchownat(arg1
, p
, low2highuid(arg3
),
10091 low2highgid(arg4
), arg5
));
10092 unlock_user(p
, arg2
, 0);
10095 #ifdef TARGET_NR_setresuid
10096 case TARGET_NR_setresuid
:
10097 return get_errno(sys_setresuid(low2highuid(arg1
),
10099 low2highuid(arg3
)));
10101 #ifdef TARGET_NR_getresuid
10102 case TARGET_NR_getresuid
:
10104 uid_t ruid
, euid
, suid
;
10105 ret
= get_errno(getresuid(&ruid
, &euid
, &suid
));
10106 if (!is_error(ret
)) {
10107 if (put_user_id(high2lowuid(ruid
), arg1
)
10108 || put_user_id(high2lowuid(euid
), arg2
)
10109 || put_user_id(high2lowuid(suid
), arg3
))
10110 return -TARGET_EFAULT
;
10115 #ifdef TARGET_NR_getresgid
10116 case TARGET_NR_setresgid
:
10117 return get_errno(sys_setresgid(low2highgid(arg1
),
10119 low2highgid(arg3
)));
10121 #ifdef TARGET_NR_getresgid
10122 case TARGET_NR_getresgid
:
10124 gid_t rgid
, egid
, sgid
;
10125 ret
= get_errno(getresgid(&rgid
, &egid
, &sgid
));
10126 if (!is_error(ret
)) {
10127 if (put_user_id(high2lowgid(rgid
), arg1
)
10128 || put_user_id(high2lowgid(egid
), arg2
)
10129 || put_user_id(high2lowgid(sgid
), arg3
))
10130 return -TARGET_EFAULT
;
10135 #ifdef TARGET_NR_chown
10136 case TARGET_NR_chown
:
10137 if (!(p
= lock_user_string(arg1
)))
10138 return -TARGET_EFAULT
;
10139 ret
= get_errno(chown(p
, low2highuid(arg2
), low2highgid(arg3
)));
10140 unlock_user(p
, arg1
, 0);
10143 case TARGET_NR_setuid
:
10144 return get_errno(sys_setuid(low2highuid(arg1
)));
10145 case TARGET_NR_setgid
:
10146 return get_errno(sys_setgid(low2highgid(arg1
)));
10147 case TARGET_NR_setfsuid
:
10148 return get_errno(setfsuid(arg1
));
10149 case TARGET_NR_setfsgid
:
10150 return get_errno(setfsgid(arg1
));
10152 #ifdef TARGET_NR_lchown32
10153 case TARGET_NR_lchown32
:
10154 if (!(p
= lock_user_string(arg1
)))
10155 return -TARGET_EFAULT
;
10156 ret
= get_errno(lchown(p
, arg2
, arg3
));
10157 unlock_user(p
, arg1
, 0);
10160 #ifdef TARGET_NR_getuid32
10161 case TARGET_NR_getuid32
:
10162 return get_errno(getuid());
10165 #if defined(TARGET_NR_getxuid) && defined(TARGET_ALPHA)
10166 /* Alpha specific */
10167 case TARGET_NR_getxuid
:
10171 ((CPUAlphaState
*)cpu_env
)->ir
[IR_A4
]=euid
;
10173 return get_errno(getuid());
10175 #if defined(TARGET_NR_getxgid) && defined(TARGET_ALPHA)
10176 /* Alpha specific */
10177 case TARGET_NR_getxgid
:
10181 ((CPUAlphaState
*)cpu_env
)->ir
[IR_A4
]=egid
;
10183 return get_errno(getgid());
10185 #if defined(TARGET_NR_osf_getsysinfo) && defined(TARGET_ALPHA)
10186 /* Alpha specific */
10187 case TARGET_NR_osf_getsysinfo
:
10188 ret
= -TARGET_EOPNOTSUPP
;
10190 case TARGET_GSI_IEEE_FP_CONTROL
:
10192 uint64_t swcr
, fpcr
= cpu_alpha_load_fpcr (cpu_env
);
10194 /* Copied from linux ieee_fpcr_to_swcr. */
10195 swcr
= (fpcr
>> 35) & SWCR_STATUS_MASK
;
10196 swcr
|= (fpcr
>> 36) & SWCR_MAP_DMZ
;
10197 swcr
|= (~fpcr
>> 48) & (SWCR_TRAP_ENABLE_INV
10198 | SWCR_TRAP_ENABLE_DZE
10199 | SWCR_TRAP_ENABLE_OVF
);
10200 swcr
|= (~fpcr
>> 57) & (SWCR_TRAP_ENABLE_UNF
10201 | SWCR_TRAP_ENABLE_INE
);
10202 swcr
|= (fpcr
>> 47) & SWCR_MAP_UMZ
;
10203 swcr
|= (~fpcr
>> 41) & SWCR_TRAP_ENABLE_DNO
;
10205 if (put_user_u64 (swcr
, arg2
))
10206 return -TARGET_EFAULT
;
10211 /* case GSI_IEEE_STATE_AT_SIGNAL:
10212 -- Not implemented in linux kernel.
10214 -- Retrieves current unaligned access state; not much used.
10215 case GSI_PROC_TYPE:
10216 -- Retrieves implver information; surely not used.
10217 case GSI_GET_HWRPB:
10218 -- Grabs a copy of the HWRPB; surely not used.
10223 #if defined(TARGET_NR_osf_setsysinfo) && defined(TARGET_ALPHA)
10224 /* Alpha specific */
10225 case TARGET_NR_osf_setsysinfo
:
10226 ret
= -TARGET_EOPNOTSUPP
;
10228 case TARGET_SSI_IEEE_FP_CONTROL
:
10230 uint64_t swcr
, fpcr
, orig_fpcr
;
10232 if (get_user_u64 (swcr
, arg2
)) {
10233 return -TARGET_EFAULT
;
10235 orig_fpcr
= cpu_alpha_load_fpcr(cpu_env
);
10236 fpcr
= orig_fpcr
& FPCR_DYN_MASK
;
10238 /* Copied from linux ieee_swcr_to_fpcr. */
10239 fpcr
|= (swcr
& SWCR_STATUS_MASK
) << 35;
10240 fpcr
|= (swcr
& SWCR_MAP_DMZ
) << 36;
10241 fpcr
|= (~swcr
& (SWCR_TRAP_ENABLE_INV
10242 | SWCR_TRAP_ENABLE_DZE
10243 | SWCR_TRAP_ENABLE_OVF
)) << 48;
10244 fpcr
|= (~swcr
& (SWCR_TRAP_ENABLE_UNF
10245 | SWCR_TRAP_ENABLE_INE
)) << 57;
10246 fpcr
|= (swcr
& SWCR_MAP_UMZ
? FPCR_UNDZ
| FPCR_UNFD
: 0);
10247 fpcr
|= (~swcr
& SWCR_TRAP_ENABLE_DNO
) << 41;
10249 cpu_alpha_store_fpcr(cpu_env
, fpcr
);
10254 case TARGET_SSI_IEEE_RAISE_EXCEPTION
:
10256 uint64_t exc
, fpcr
, orig_fpcr
;
10259 if (get_user_u64(exc
, arg2
)) {
10260 return -TARGET_EFAULT
;
10263 orig_fpcr
= cpu_alpha_load_fpcr(cpu_env
);
10265 /* We only add to the exception status here. */
10266 fpcr
= orig_fpcr
| ((exc
& SWCR_STATUS_MASK
) << 35);
10268 cpu_alpha_store_fpcr(cpu_env
, fpcr
);
10271 /* Old exceptions are not signaled. */
10272 fpcr
&= ~(orig_fpcr
& FPCR_STATUS_MASK
);
10274 /* If any exceptions set by this call,
10275 and are unmasked, send a signal. */
10277 if ((fpcr
& (FPCR_INE
| FPCR_INED
)) == FPCR_INE
) {
10278 si_code
= TARGET_FPE_FLTRES
;
10280 if ((fpcr
& (FPCR_UNF
| FPCR_UNFD
)) == FPCR_UNF
) {
10281 si_code
= TARGET_FPE_FLTUND
;
10283 if ((fpcr
& (FPCR_OVF
| FPCR_OVFD
)) == FPCR_OVF
) {
10284 si_code
= TARGET_FPE_FLTOVF
;
10286 if ((fpcr
& (FPCR_DZE
| FPCR_DZED
)) == FPCR_DZE
) {
10287 si_code
= TARGET_FPE_FLTDIV
;
10289 if ((fpcr
& (FPCR_INV
| FPCR_INVD
)) == FPCR_INV
) {
10290 si_code
= TARGET_FPE_FLTINV
;
10292 if (si_code
!= 0) {
10293 target_siginfo_t info
;
10294 info
.si_signo
= SIGFPE
;
10296 info
.si_code
= si_code
;
10297 info
._sifields
._sigfault
._addr
10298 = ((CPUArchState
*)cpu_env
)->pc
;
10299 queue_signal((CPUArchState
*)cpu_env
, info
.si_signo
,
10300 QEMU_SI_FAULT
, &info
);
10305 /* case SSI_NVPAIRS:
10306 -- Used with SSIN_UACPROC to enable unaligned accesses.
10307 case SSI_IEEE_STATE_AT_SIGNAL:
10308 case SSI_IEEE_IGNORE_STATE_AT_SIGNAL:
10309 -- Not implemented in linux kernel
10314 #ifdef TARGET_NR_osf_sigprocmask
10315 /* Alpha specific. */
10316 case TARGET_NR_osf_sigprocmask
:
10320 sigset_t set
, oldset
;
10323 case TARGET_SIG_BLOCK
:
10326 case TARGET_SIG_UNBLOCK
:
10329 case TARGET_SIG_SETMASK
:
10333 return -TARGET_EINVAL
;
10336 target_to_host_old_sigset(&set
, &mask
);
10337 ret
= do_sigprocmask(how
, &set
, &oldset
);
10339 host_to_target_old_sigset(&mask
, &oldset
);
10346 #ifdef TARGET_NR_getgid32
10347 case TARGET_NR_getgid32
:
10348 return get_errno(getgid());
10350 #ifdef TARGET_NR_geteuid32
10351 case TARGET_NR_geteuid32
:
10352 return get_errno(geteuid());
10354 #ifdef TARGET_NR_getegid32
10355 case TARGET_NR_getegid32
:
10356 return get_errno(getegid());
10358 #ifdef TARGET_NR_setreuid32
10359 case TARGET_NR_setreuid32
:
10360 return get_errno(setreuid(arg1
, arg2
));
10362 #ifdef TARGET_NR_setregid32
10363 case TARGET_NR_setregid32
:
10364 return get_errno(setregid(arg1
, arg2
));
10366 #ifdef TARGET_NR_getgroups32
10367 case TARGET_NR_getgroups32
:
10369 int gidsetsize
= arg1
;
10370 uint32_t *target_grouplist
;
10374 grouplist
= alloca(gidsetsize
* sizeof(gid_t
));
10375 ret
= get_errno(getgroups(gidsetsize
, grouplist
));
10376 if (gidsetsize
== 0)
10378 if (!is_error(ret
)) {
10379 target_grouplist
= lock_user(VERIFY_WRITE
, arg2
, gidsetsize
* 4, 0);
10380 if (!target_grouplist
) {
10381 return -TARGET_EFAULT
;
10383 for(i
= 0;i
< ret
; i
++)
10384 target_grouplist
[i
] = tswap32(grouplist
[i
]);
10385 unlock_user(target_grouplist
, arg2
, gidsetsize
* 4);
10390 #ifdef TARGET_NR_setgroups32
10391 case TARGET_NR_setgroups32
:
10393 int gidsetsize
= arg1
;
10394 uint32_t *target_grouplist
;
10398 grouplist
= alloca(gidsetsize
* sizeof(gid_t
));
10399 target_grouplist
= lock_user(VERIFY_READ
, arg2
, gidsetsize
* 4, 1);
10400 if (!target_grouplist
) {
10401 return -TARGET_EFAULT
;
10403 for(i
= 0;i
< gidsetsize
; i
++)
10404 grouplist
[i
] = tswap32(target_grouplist
[i
]);
10405 unlock_user(target_grouplist
, arg2
, 0);
10406 return get_errno(setgroups(gidsetsize
, grouplist
));
10409 #ifdef TARGET_NR_fchown32
10410 case TARGET_NR_fchown32
:
10411 return get_errno(fchown(arg1
, arg2
, arg3
));
10413 #ifdef TARGET_NR_setresuid32
10414 case TARGET_NR_setresuid32
:
10415 return get_errno(sys_setresuid(arg1
, arg2
, arg3
));
10417 #ifdef TARGET_NR_getresuid32
10418 case TARGET_NR_getresuid32
:
10420 uid_t ruid
, euid
, suid
;
10421 ret
= get_errno(getresuid(&ruid
, &euid
, &suid
));
10422 if (!is_error(ret
)) {
10423 if (put_user_u32(ruid
, arg1
)
10424 || put_user_u32(euid
, arg2
)
10425 || put_user_u32(suid
, arg3
))
10426 return -TARGET_EFAULT
;
10431 #ifdef TARGET_NR_setresgid32
10432 case TARGET_NR_setresgid32
:
10433 return get_errno(sys_setresgid(arg1
, arg2
, arg3
));
10435 #ifdef TARGET_NR_getresgid32
10436 case TARGET_NR_getresgid32
:
10438 gid_t rgid
, egid
, sgid
;
10439 ret
= get_errno(getresgid(&rgid
, &egid
, &sgid
));
10440 if (!is_error(ret
)) {
10441 if (put_user_u32(rgid
, arg1
)
10442 || put_user_u32(egid
, arg2
)
10443 || put_user_u32(sgid
, arg3
))
10444 return -TARGET_EFAULT
;
10449 #ifdef TARGET_NR_chown32
10450 case TARGET_NR_chown32
:
10451 if (!(p
= lock_user_string(arg1
)))
10452 return -TARGET_EFAULT
;
10453 ret
= get_errno(chown(p
, arg2
, arg3
));
10454 unlock_user(p
, arg1
, 0);
10457 #ifdef TARGET_NR_setuid32
10458 case TARGET_NR_setuid32
:
10459 return get_errno(sys_setuid(arg1
));
10461 #ifdef TARGET_NR_setgid32
10462 case TARGET_NR_setgid32
:
10463 return get_errno(sys_setgid(arg1
));
10465 #ifdef TARGET_NR_setfsuid32
10466 case TARGET_NR_setfsuid32
:
10467 return get_errno(setfsuid(arg1
));
10469 #ifdef TARGET_NR_setfsgid32
10470 case TARGET_NR_setfsgid32
:
10471 return get_errno(setfsgid(arg1
));
10473 #ifdef TARGET_NR_mincore
10474 case TARGET_NR_mincore
:
10476 void *a
= lock_user(VERIFY_READ
, arg1
, arg2
, 0);
10478 return -TARGET_ENOMEM
;
10480 p
= lock_user_string(arg3
);
10482 ret
= -TARGET_EFAULT
;
10484 ret
= get_errno(mincore(a
, arg2
, p
));
10485 unlock_user(p
, arg3
, ret
);
10487 unlock_user(a
, arg1
, 0);
10491 #ifdef TARGET_NR_arm_fadvise64_64
10492 case TARGET_NR_arm_fadvise64_64
:
10493 /* arm_fadvise64_64 looks like fadvise64_64 but
10494 * with different argument order: fd, advice, offset, len
10495 * rather than the usual fd, offset, len, advice.
10496 * Note that offset and len are both 64-bit so appear as
10497 * pairs of 32-bit registers.
10499 ret
= posix_fadvise(arg1
, target_offset64(arg3
, arg4
),
10500 target_offset64(arg5
, arg6
), arg2
);
10501 return -host_to_target_errno(ret
);
10504 #if TARGET_ABI_BITS == 32
10506 #ifdef TARGET_NR_fadvise64_64
10507 case TARGET_NR_fadvise64_64
:
10508 #if defined(TARGET_PPC) || defined(TARGET_XTENSA)
10509 /* 6 args: fd, advice, offset (high, low), len (high, low) */
10517 /* 6 args: fd, offset (high, low), len (high, low), advice */
10518 if (regpairs_aligned(cpu_env
, num
)) {
10519 /* offset is in (3,4), len in (5,6) and advice in 7 */
10527 ret
= posix_fadvise(arg1
, target_offset64(arg2
, arg3
),
10528 target_offset64(arg4
, arg5
), arg6
);
10529 return -host_to_target_errno(ret
);
10532 #ifdef TARGET_NR_fadvise64
10533 case TARGET_NR_fadvise64
:
10534 /* 5 args: fd, offset (high, low), len, advice */
10535 if (regpairs_aligned(cpu_env
, num
)) {
10536 /* offset is in (3,4), len in 5 and advice in 6 */
10542 ret
= posix_fadvise(arg1
, target_offset64(arg2
, arg3
), arg4
, arg5
);
10543 return -host_to_target_errno(ret
);
10546 #else /* not a 32-bit ABI */
10547 #if defined(TARGET_NR_fadvise64_64) || defined(TARGET_NR_fadvise64)
10548 #ifdef TARGET_NR_fadvise64_64
10549 case TARGET_NR_fadvise64_64
:
10551 #ifdef TARGET_NR_fadvise64
10552 case TARGET_NR_fadvise64
:
10554 #ifdef TARGET_S390X
10556 case 4: arg4
= POSIX_FADV_NOREUSE
+ 1; break; /* make sure it's an invalid value */
10557 case 5: arg4
= POSIX_FADV_NOREUSE
+ 2; break; /* ditto */
10558 case 6: arg4
= POSIX_FADV_DONTNEED
; break;
10559 case 7: arg4
= POSIX_FADV_NOREUSE
; break;
10563 return -host_to_target_errno(posix_fadvise(arg1
, arg2
, arg3
, arg4
));
10565 #endif /* end of 64-bit ABI fadvise handling */
10567 #ifdef TARGET_NR_madvise
10568 case TARGET_NR_madvise
:
10569 /* A straight passthrough may not be safe because qemu sometimes
10570 turns private file-backed mappings into anonymous mappings.
10571 This will break MADV_DONTNEED.
10572 This is a hint, so ignoring and returning success is ok. */
10575 #if TARGET_ABI_BITS == 32
10576 case TARGET_NR_fcntl64
:
10580 from_flock64_fn
*copyfrom
= copy_from_user_flock64
;
10581 to_flock64_fn
*copyto
= copy_to_user_flock64
;
10584 if (!((CPUARMState
*)cpu_env
)->eabi
) {
10585 copyfrom
= copy_from_user_oabi_flock64
;
10586 copyto
= copy_to_user_oabi_flock64
;
10590 cmd
= target_to_host_fcntl_cmd(arg2
);
10591 if (cmd
== -TARGET_EINVAL
) {
10596 case TARGET_F_GETLK64
:
10597 ret
= copyfrom(&fl
, arg3
);
10601 ret
= get_errno(safe_fcntl(arg1
, cmd
, &fl
));
10603 ret
= copyto(arg3
, &fl
);
10607 case TARGET_F_SETLK64
:
10608 case TARGET_F_SETLKW64
:
10609 ret
= copyfrom(&fl
, arg3
);
10613 ret
= get_errno(safe_fcntl(arg1
, cmd
, &fl
));
10616 ret
= do_fcntl(arg1
, arg2
, arg3
);
10622 #ifdef TARGET_NR_cacheflush
10623 case TARGET_NR_cacheflush
:
10624 /* self-modifying code is handled automatically, so nothing needed */
10627 #ifdef TARGET_NR_getpagesize
10628 case TARGET_NR_getpagesize
:
10629 return TARGET_PAGE_SIZE
;
10631 case TARGET_NR_gettid
:
10632 return get_errno(gettid());
10633 #ifdef TARGET_NR_readahead
10634 case TARGET_NR_readahead
:
10635 #if TARGET_ABI_BITS == 32
10636 if (regpairs_aligned(cpu_env
, num
)) {
10641 ret
= get_errno(readahead(arg1
, target_offset64(arg2
, arg3
) , arg4
));
10643 ret
= get_errno(readahead(arg1
, arg2
, arg3
));
10648 #ifdef TARGET_NR_setxattr
10649 case TARGET_NR_listxattr
:
10650 case TARGET_NR_llistxattr
:
10654 b
= lock_user(VERIFY_WRITE
, arg2
, arg3
, 0);
10656 return -TARGET_EFAULT
;
10659 p
= lock_user_string(arg1
);
10661 if (num
== TARGET_NR_listxattr
) {
10662 ret
= get_errno(listxattr(p
, b
, arg3
));
10664 ret
= get_errno(llistxattr(p
, b
, arg3
));
10667 ret
= -TARGET_EFAULT
;
10669 unlock_user(p
, arg1
, 0);
10670 unlock_user(b
, arg2
, arg3
);
10673 case TARGET_NR_flistxattr
:
10677 b
= lock_user(VERIFY_WRITE
, arg2
, arg3
, 0);
10679 return -TARGET_EFAULT
;
10682 ret
= get_errno(flistxattr(arg1
, b
, arg3
));
10683 unlock_user(b
, arg2
, arg3
);
10686 case TARGET_NR_setxattr
:
10687 case TARGET_NR_lsetxattr
:
10689 void *p
, *n
, *v
= 0;
10691 v
= lock_user(VERIFY_READ
, arg3
, arg4
, 1);
10693 return -TARGET_EFAULT
;
10696 p
= lock_user_string(arg1
);
10697 n
= lock_user_string(arg2
);
10699 if (num
== TARGET_NR_setxattr
) {
10700 ret
= get_errno(setxattr(p
, n
, v
, arg4
, arg5
));
10702 ret
= get_errno(lsetxattr(p
, n
, v
, arg4
, arg5
));
10705 ret
= -TARGET_EFAULT
;
10707 unlock_user(p
, arg1
, 0);
10708 unlock_user(n
, arg2
, 0);
10709 unlock_user(v
, arg3
, 0);
10712 case TARGET_NR_fsetxattr
:
10716 v
= lock_user(VERIFY_READ
, arg3
, arg4
, 1);
10718 return -TARGET_EFAULT
;
10721 n
= lock_user_string(arg2
);
10723 ret
= get_errno(fsetxattr(arg1
, n
, v
, arg4
, arg5
));
10725 ret
= -TARGET_EFAULT
;
10727 unlock_user(n
, arg2
, 0);
10728 unlock_user(v
, arg3
, 0);
10731 case TARGET_NR_getxattr
:
10732 case TARGET_NR_lgetxattr
:
10734 void *p
, *n
, *v
= 0;
10736 v
= lock_user(VERIFY_WRITE
, arg3
, arg4
, 0);
10738 return -TARGET_EFAULT
;
10741 p
= lock_user_string(arg1
);
10742 n
= lock_user_string(arg2
);
10744 if (num
== TARGET_NR_getxattr
) {
10745 ret
= get_errno(getxattr(p
, n
, v
, arg4
));
10747 ret
= get_errno(lgetxattr(p
, n
, v
, arg4
));
10750 ret
= -TARGET_EFAULT
;
10752 unlock_user(p
, arg1
, 0);
10753 unlock_user(n
, arg2
, 0);
10754 unlock_user(v
, arg3
, arg4
);
10757 case TARGET_NR_fgetxattr
:
10761 v
= lock_user(VERIFY_WRITE
, arg3
, arg4
, 0);
10763 return -TARGET_EFAULT
;
10766 n
= lock_user_string(arg2
);
10768 ret
= get_errno(fgetxattr(arg1
, n
, v
, arg4
));
10770 ret
= -TARGET_EFAULT
;
10772 unlock_user(n
, arg2
, 0);
10773 unlock_user(v
, arg3
, arg4
);
10776 case TARGET_NR_removexattr
:
10777 case TARGET_NR_lremovexattr
:
10780 p
= lock_user_string(arg1
);
10781 n
= lock_user_string(arg2
);
10783 if (num
== TARGET_NR_removexattr
) {
10784 ret
= get_errno(removexattr(p
, n
));
10786 ret
= get_errno(lremovexattr(p
, n
));
10789 ret
= -TARGET_EFAULT
;
10791 unlock_user(p
, arg1
, 0);
10792 unlock_user(n
, arg2
, 0);
10795 case TARGET_NR_fremovexattr
:
10798 n
= lock_user_string(arg2
);
10800 ret
= get_errno(fremovexattr(arg1
, n
));
10802 ret
= -TARGET_EFAULT
;
10804 unlock_user(n
, arg2
, 0);
10808 #endif /* CONFIG_ATTR */
10809 #ifdef TARGET_NR_set_thread_area
10810 case TARGET_NR_set_thread_area
:
10811 #if defined(TARGET_MIPS)
10812 ((CPUMIPSState
*) cpu_env
)->active_tc
.CP0_UserLocal
= arg1
;
10814 #elif defined(TARGET_CRIS)
10816 ret
= -TARGET_EINVAL
;
10818 ((CPUCRISState
*) cpu_env
)->pregs
[PR_PID
] = arg1
;
10822 #elif defined(TARGET_I386) && defined(TARGET_ABI32)
10823 return do_set_thread_area(cpu_env
, arg1
);
10824 #elif defined(TARGET_M68K)
10826 TaskState
*ts
= cpu
->opaque
;
10827 ts
->tp_value
= arg1
;
10831 return -TARGET_ENOSYS
;
10834 #ifdef TARGET_NR_get_thread_area
10835 case TARGET_NR_get_thread_area
:
10836 #if defined(TARGET_I386) && defined(TARGET_ABI32)
10837 return do_get_thread_area(cpu_env
, arg1
);
10838 #elif defined(TARGET_M68K)
10840 TaskState
*ts
= cpu
->opaque
;
10841 return ts
->tp_value
;
10844 return -TARGET_ENOSYS
;
10847 #ifdef TARGET_NR_getdomainname
10848 case TARGET_NR_getdomainname
:
10849 return -TARGET_ENOSYS
;
10852 #ifdef TARGET_NR_clock_settime
10853 case TARGET_NR_clock_settime
:
10855 struct timespec ts
;
10857 ret
= target_to_host_timespec(&ts
, arg2
);
10858 if (!is_error(ret
)) {
10859 ret
= get_errno(clock_settime(arg1
, &ts
));
10864 #ifdef TARGET_NR_clock_gettime
10865 case TARGET_NR_clock_gettime
:
10867 struct timespec ts
;
10868 ret
= get_errno(clock_gettime(arg1
, &ts
));
10869 if (!is_error(ret
)) {
10870 ret
= host_to_target_timespec(arg2
, &ts
);
10875 #ifdef TARGET_NR_clock_getres
10876 case TARGET_NR_clock_getres
:
10878 struct timespec ts
;
10879 ret
= get_errno(clock_getres(arg1
, &ts
));
10880 if (!is_error(ret
)) {
10881 host_to_target_timespec(arg2
, &ts
);
10886 #ifdef TARGET_NR_clock_nanosleep
10887 case TARGET_NR_clock_nanosleep
:
10889 struct timespec ts
;
10890 target_to_host_timespec(&ts
, arg3
);
10891 ret
= get_errno(safe_clock_nanosleep(arg1
, arg2
,
10892 &ts
, arg4
? &ts
: NULL
));
10894 host_to_target_timespec(arg4
, &ts
);
10896 #if defined(TARGET_PPC)
10897 /* clock_nanosleep is odd in that it returns positive errno values.
10898 * On PPC, CR0 bit 3 should be set in such a situation. */
10899 if (ret
&& ret
!= -TARGET_ERESTARTSYS
) {
10900 ((CPUPPCState
*)cpu_env
)->crf
[0] |= 1;
10907 #if defined(TARGET_NR_set_tid_address) && defined(__NR_set_tid_address)
10908 case TARGET_NR_set_tid_address
:
10909 return get_errno(set_tid_address((int *)g2h(arg1
)));
10912 case TARGET_NR_tkill
:
10913 return get_errno(safe_tkill((int)arg1
, target_to_host_signal(arg2
)));
10915 case TARGET_NR_tgkill
:
10916 return get_errno(safe_tgkill((int)arg1
, (int)arg2
,
10917 target_to_host_signal(arg3
)));
10919 #ifdef TARGET_NR_set_robust_list
10920 case TARGET_NR_set_robust_list
:
10921 case TARGET_NR_get_robust_list
:
10922 /* The ABI for supporting robust futexes has userspace pass
10923 * the kernel a pointer to a linked list which is updated by
10924 * userspace after the syscall; the list is walked by the kernel
10925 * when the thread exits. Since the linked list in QEMU guest
10926 * memory isn't a valid linked list for the host and we have
10927 * no way to reliably intercept the thread-death event, we can't
10928 * support these. Silently return ENOSYS so that guest userspace
10929 * falls back to a non-robust futex implementation (which should
10930 * be OK except in the corner case of the guest crashing while
10931 * holding a mutex that is shared with another process via
10934 return -TARGET_ENOSYS
;
10937 #if defined(TARGET_NR_utimensat)
10938 case TARGET_NR_utimensat
:
10940 struct timespec
*tsp
, ts
[2];
10944 target_to_host_timespec(ts
, arg3
);
10945 target_to_host_timespec(ts
+1, arg3
+sizeof(struct target_timespec
));
10949 ret
= get_errno(sys_utimensat(arg1
, NULL
, tsp
, arg4
));
10951 if (!(p
= lock_user_string(arg2
))) {
10952 return -TARGET_EFAULT
;
10954 ret
= get_errno(sys_utimensat(arg1
, path(p
), tsp
, arg4
));
10955 unlock_user(p
, arg2
, 0);
10960 case TARGET_NR_futex
:
10961 return do_futex(arg1
, arg2
, arg3
, arg4
, arg5
, arg6
);
10962 #if defined(TARGET_NR_inotify_init) && defined(__NR_inotify_init)
10963 case TARGET_NR_inotify_init
:
10964 ret
= get_errno(sys_inotify_init());
10966 fd_trans_register(ret
, &target_inotify_trans
);
10970 #ifdef CONFIG_INOTIFY1
10971 #if defined(TARGET_NR_inotify_init1) && defined(__NR_inotify_init1)
10972 case TARGET_NR_inotify_init1
:
10973 ret
= get_errno(sys_inotify_init1(target_to_host_bitmask(arg1
,
10974 fcntl_flags_tbl
)));
10976 fd_trans_register(ret
, &target_inotify_trans
);
10981 #if defined(TARGET_NR_inotify_add_watch) && defined(__NR_inotify_add_watch)
10982 case TARGET_NR_inotify_add_watch
:
10983 p
= lock_user_string(arg2
);
10984 ret
= get_errno(sys_inotify_add_watch(arg1
, path(p
), arg3
));
10985 unlock_user(p
, arg2
, 0);
10988 #if defined(TARGET_NR_inotify_rm_watch) && defined(__NR_inotify_rm_watch)
10989 case TARGET_NR_inotify_rm_watch
:
10990 return get_errno(sys_inotify_rm_watch(arg1
, arg2
));
10993 #if defined(TARGET_NR_mq_open) && defined(__NR_mq_open)
10994 case TARGET_NR_mq_open
:
10996 struct mq_attr posix_mq_attr
;
10997 struct mq_attr
*pposix_mq_attr
;
11000 host_flags
= target_to_host_bitmask(arg2
, fcntl_flags_tbl
);
11001 pposix_mq_attr
= NULL
;
11003 if (copy_from_user_mq_attr(&posix_mq_attr
, arg4
) != 0) {
11004 return -TARGET_EFAULT
;
11006 pposix_mq_attr
= &posix_mq_attr
;
11008 p
= lock_user_string(arg1
- 1);
11010 return -TARGET_EFAULT
;
11012 ret
= get_errno(mq_open(p
, host_flags
, arg3
, pposix_mq_attr
));
11013 unlock_user (p
, arg1
, 0);
11017 case TARGET_NR_mq_unlink
:
11018 p
= lock_user_string(arg1
- 1);
11020 return -TARGET_EFAULT
;
11022 ret
= get_errno(mq_unlink(p
));
11023 unlock_user (p
, arg1
, 0);
11026 case TARGET_NR_mq_timedsend
:
11028 struct timespec ts
;
11030 p
= lock_user (VERIFY_READ
, arg2
, arg3
, 1);
11032 target_to_host_timespec(&ts
, arg5
);
11033 ret
= get_errno(safe_mq_timedsend(arg1
, p
, arg3
, arg4
, &ts
));
11034 host_to_target_timespec(arg5
, &ts
);
11036 ret
= get_errno(safe_mq_timedsend(arg1
, p
, arg3
, arg4
, NULL
));
11038 unlock_user (p
, arg2
, arg3
);
11042 case TARGET_NR_mq_timedreceive
:
11044 struct timespec ts
;
11047 p
= lock_user (VERIFY_READ
, arg2
, arg3
, 1);
11049 target_to_host_timespec(&ts
, arg5
);
11050 ret
= get_errno(safe_mq_timedreceive(arg1
, p
, arg3
,
11052 host_to_target_timespec(arg5
, &ts
);
11054 ret
= get_errno(safe_mq_timedreceive(arg1
, p
, arg3
,
11057 unlock_user (p
, arg2
, arg3
);
11059 put_user_u32(prio
, arg4
);
11063 /* Not implemented for now... */
11064 /* case TARGET_NR_mq_notify: */
11067 case TARGET_NR_mq_getsetattr
:
11069 struct mq_attr posix_mq_attr_in
, posix_mq_attr_out
;
11072 copy_from_user_mq_attr(&posix_mq_attr_in
, arg2
);
11073 ret
= get_errno(mq_setattr(arg1
, &posix_mq_attr_in
,
11074 &posix_mq_attr_out
));
11075 } else if (arg3
!= 0) {
11076 ret
= get_errno(mq_getattr(arg1
, &posix_mq_attr_out
));
11078 if (ret
== 0 && arg3
!= 0) {
11079 copy_to_user_mq_attr(arg3
, &posix_mq_attr_out
);
11085 #ifdef CONFIG_SPLICE
11086 #ifdef TARGET_NR_tee
11087 case TARGET_NR_tee
:
11089 ret
= get_errno(tee(arg1
,arg2
,arg3
,arg4
));
11093 #ifdef TARGET_NR_splice
11094 case TARGET_NR_splice
:
11096 loff_t loff_in
, loff_out
;
11097 loff_t
*ploff_in
= NULL
, *ploff_out
= NULL
;
11099 if (get_user_u64(loff_in
, arg2
)) {
11100 return -TARGET_EFAULT
;
11102 ploff_in
= &loff_in
;
11105 if (get_user_u64(loff_out
, arg4
)) {
11106 return -TARGET_EFAULT
;
11108 ploff_out
= &loff_out
;
11110 ret
= get_errno(splice(arg1
, ploff_in
, arg3
, ploff_out
, arg5
, arg6
));
11112 if (put_user_u64(loff_in
, arg2
)) {
11113 return -TARGET_EFAULT
;
11117 if (put_user_u64(loff_out
, arg4
)) {
11118 return -TARGET_EFAULT
;
11124 #ifdef TARGET_NR_vmsplice
11125 case TARGET_NR_vmsplice
:
11127 struct iovec
*vec
= lock_iovec(VERIFY_READ
, arg2
, arg3
, 1);
11129 ret
= get_errno(vmsplice(arg1
, vec
, arg3
, arg4
));
11130 unlock_iovec(vec
, arg2
, arg3
, 0);
11132 ret
= -host_to_target_errno(errno
);
11137 #endif /* CONFIG_SPLICE */
11138 #ifdef CONFIG_EVENTFD
11139 #if defined(TARGET_NR_eventfd)
11140 case TARGET_NR_eventfd
:
11141 ret
= get_errno(eventfd(arg1
, 0));
11143 fd_trans_register(ret
, &target_eventfd_trans
);
11147 #if defined(TARGET_NR_eventfd2)
11148 case TARGET_NR_eventfd2
:
11150 int host_flags
= arg2
& (~(TARGET_O_NONBLOCK
| TARGET_O_CLOEXEC
));
11151 if (arg2
& TARGET_O_NONBLOCK
) {
11152 host_flags
|= O_NONBLOCK
;
11154 if (arg2
& TARGET_O_CLOEXEC
) {
11155 host_flags
|= O_CLOEXEC
;
11157 ret
= get_errno(eventfd(arg1
, host_flags
));
11159 fd_trans_register(ret
, &target_eventfd_trans
);
11164 #endif /* CONFIG_EVENTFD */
11165 #if defined(CONFIG_FALLOCATE) && defined(TARGET_NR_fallocate)
11166 case TARGET_NR_fallocate
:
11167 #if TARGET_ABI_BITS == 32
11168 ret
= get_errno(fallocate(arg1
, arg2
, target_offset64(arg3
, arg4
),
11169 target_offset64(arg5
, arg6
)));
11171 ret
= get_errno(fallocate(arg1
, arg2
, arg3
, arg4
));
11175 #if defined(CONFIG_SYNC_FILE_RANGE)
11176 #if defined(TARGET_NR_sync_file_range)
11177 case TARGET_NR_sync_file_range
:
11178 #if TARGET_ABI_BITS == 32
11179 #if defined(TARGET_MIPS)
11180 ret
= get_errno(sync_file_range(arg1
, target_offset64(arg3
, arg4
),
11181 target_offset64(arg5
, arg6
), arg7
));
11183 ret
= get_errno(sync_file_range(arg1
, target_offset64(arg2
, arg3
),
11184 target_offset64(arg4
, arg5
), arg6
));
11185 #endif /* !TARGET_MIPS */
11187 ret
= get_errno(sync_file_range(arg1
, arg2
, arg3
, arg4
));
11191 #if defined(TARGET_NR_sync_file_range2)
11192 case TARGET_NR_sync_file_range2
:
11193 /* This is like sync_file_range but the arguments are reordered */
11194 #if TARGET_ABI_BITS == 32
11195 ret
= get_errno(sync_file_range(arg1
, target_offset64(arg3
, arg4
),
11196 target_offset64(arg5
, arg6
), arg2
));
11198 ret
= get_errno(sync_file_range(arg1
, arg3
, arg4
, arg2
));
11203 #if defined(TARGET_NR_signalfd4)
11204 case TARGET_NR_signalfd4
:
11205 return do_signalfd4(arg1
, arg2
, arg4
);
11207 #if defined(TARGET_NR_signalfd)
11208 case TARGET_NR_signalfd
:
11209 return do_signalfd4(arg1
, arg2
, 0);
11211 #if defined(CONFIG_EPOLL)
11212 #if defined(TARGET_NR_epoll_create)
11213 case TARGET_NR_epoll_create
:
11214 return get_errno(epoll_create(arg1
));
11216 #if defined(TARGET_NR_epoll_create1) && defined(CONFIG_EPOLL_CREATE1)
11217 case TARGET_NR_epoll_create1
:
11218 return get_errno(epoll_create1(arg1
));
11220 #if defined(TARGET_NR_epoll_ctl)
11221 case TARGET_NR_epoll_ctl
:
11223 struct epoll_event ep
;
11224 struct epoll_event
*epp
= 0;
11226 struct target_epoll_event
*target_ep
;
11227 if (!lock_user_struct(VERIFY_READ
, target_ep
, arg4
, 1)) {
11228 return -TARGET_EFAULT
;
11230 ep
.events
= tswap32(target_ep
->events
);
11231 /* The epoll_data_t union is just opaque data to the kernel,
11232 * so we transfer all 64 bits across and need not worry what
11233 * actual data type it is.
11235 ep
.data
.u64
= tswap64(target_ep
->data
.u64
);
11236 unlock_user_struct(target_ep
, arg4
, 0);
11239 return get_errno(epoll_ctl(arg1
, arg2
, arg3
, epp
));
11243 #if defined(TARGET_NR_epoll_wait) || defined(TARGET_NR_epoll_pwait)
11244 #if defined(TARGET_NR_epoll_wait)
11245 case TARGET_NR_epoll_wait
:
11247 #if defined(TARGET_NR_epoll_pwait)
11248 case TARGET_NR_epoll_pwait
:
11251 struct target_epoll_event
*target_ep
;
11252 struct epoll_event
*ep
;
11254 int maxevents
= arg3
;
11255 int timeout
= arg4
;
11257 if (maxevents
<= 0 || maxevents
> TARGET_EP_MAX_EVENTS
) {
11258 return -TARGET_EINVAL
;
11261 target_ep
= lock_user(VERIFY_WRITE
, arg2
,
11262 maxevents
* sizeof(struct target_epoll_event
), 1);
11264 return -TARGET_EFAULT
;
11267 ep
= g_try_new(struct epoll_event
, maxevents
);
11269 unlock_user(target_ep
, arg2
, 0);
11270 return -TARGET_ENOMEM
;
11274 #if defined(TARGET_NR_epoll_pwait)
11275 case TARGET_NR_epoll_pwait
:
11277 target_sigset_t
*target_set
;
11278 sigset_t _set
, *set
= &_set
;
11281 if (arg6
!= sizeof(target_sigset_t
)) {
11282 ret
= -TARGET_EINVAL
;
11286 target_set
= lock_user(VERIFY_READ
, arg5
,
11287 sizeof(target_sigset_t
), 1);
11289 ret
= -TARGET_EFAULT
;
11292 target_to_host_sigset(set
, target_set
);
11293 unlock_user(target_set
, arg5
, 0);
11298 ret
= get_errno(safe_epoll_pwait(epfd
, ep
, maxevents
, timeout
,
11299 set
, SIGSET_T_SIZE
));
11303 #if defined(TARGET_NR_epoll_wait)
11304 case TARGET_NR_epoll_wait
:
11305 ret
= get_errno(safe_epoll_pwait(epfd
, ep
, maxevents
, timeout
,
11310 ret
= -TARGET_ENOSYS
;
11312 if (!is_error(ret
)) {
11314 for (i
= 0; i
< ret
; i
++) {
11315 target_ep
[i
].events
= tswap32(ep
[i
].events
);
11316 target_ep
[i
].data
.u64
= tswap64(ep
[i
].data
.u64
);
11318 unlock_user(target_ep
, arg2
,
11319 ret
* sizeof(struct target_epoll_event
));
11321 unlock_user(target_ep
, arg2
, 0);
11328 #ifdef TARGET_NR_prlimit64
11329 case TARGET_NR_prlimit64
:
11331 /* args: pid, resource number, ptr to new rlimit, ptr to old rlimit */
11332 struct target_rlimit64
*target_rnew
, *target_rold
;
11333 struct host_rlimit64 rnew
, rold
, *rnewp
= 0;
11334 int resource
= target_to_host_resource(arg2
);
11336 if (!lock_user_struct(VERIFY_READ
, target_rnew
, arg3
, 1)) {
11337 return -TARGET_EFAULT
;
11339 rnew
.rlim_cur
= tswap64(target_rnew
->rlim_cur
);
11340 rnew
.rlim_max
= tswap64(target_rnew
->rlim_max
);
11341 unlock_user_struct(target_rnew
, arg3
, 0);
11345 ret
= get_errno(sys_prlimit64(arg1
, resource
, rnewp
, arg4
? &rold
: 0));
11346 if (!is_error(ret
) && arg4
) {
11347 if (!lock_user_struct(VERIFY_WRITE
, target_rold
, arg4
, 1)) {
11348 return -TARGET_EFAULT
;
11350 target_rold
->rlim_cur
= tswap64(rold
.rlim_cur
);
11351 target_rold
->rlim_max
= tswap64(rold
.rlim_max
);
11352 unlock_user_struct(target_rold
, arg4
, 1);
11357 #ifdef TARGET_NR_gethostname
11358 case TARGET_NR_gethostname
:
11360 char *name
= lock_user(VERIFY_WRITE
, arg1
, arg2
, 0);
11362 ret
= get_errno(gethostname(name
, arg2
));
11363 unlock_user(name
, arg1
, arg2
);
11365 ret
= -TARGET_EFAULT
;
11370 #ifdef TARGET_NR_atomic_cmpxchg_32
11371 case TARGET_NR_atomic_cmpxchg_32
:
11373 /* should use start_exclusive from main.c */
11374 abi_ulong mem_value
;
11375 if (get_user_u32(mem_value
, arg6
)) {
11376 target_siginfo_t info
;
11377 info
.si_signo
= SIGSEGV
;
11379 info
.si_code
= TARGET_SEGV_MAPERR
;
11380 info
._sifields
._sigfault
._addr
= arg6
;
11381 queue_signal((CPUArchState
*)cpu_env
, info
.si_signo
,
11382 QEMU_SI_FAULT
, &info
);
11386 if (mem_value
== arg2
)
11387 put_user_u32(arg1
, arg6
);
11391 #ifdef TARGET_NR_atomic_barrier
11392 case TARGET_NR_atomic_barrier
:
11393 /* Like the kernel implementation and the
11394 qemu arm barrier, no-op this? */
11398 #ifdef TARGET_NR_timer_create
11399 case TARGET_NR_timer_create
:
11401 /* args: clockid_t clockid, struct sigevent *sevp, timer_t *timerid */
11403 struct sigevent host_sevp
= { {0}, }, *phost_sevp
= NULL
;
11406 int timer_index
= next_free_host_timer();
11408 if (timer_index
< 0) {
11409 ret
= -TARGET_EAGAIN
;
11411 timer_t
*phtimer
= g_posix_timers
+ timer_index
;
11414 phost_sevp
= &host_sevp
;
11415 ret
= target_to_host_sigevent(phost_sevp
, arg2
);
11421 ret
= get_errno(timer_create(clkid
, phost_sevp
, phtimer
));
11425 if (put_user(TIMER_MAGIC
| timer_index
, arg3
, target_timer_t
)) {
11426 return -TARGET_EFAULT
;
11434 #ifdef TARGET_NR_timer_settime
11435 case TARGET_NR_timer_settime
:
11437 /* args: timer_t timerid, int flags, const struct itimerspec *new_value,
11438 * struct itimerspec * old_value */
11439 target_timer_t timerid
= get_timer_id(arg1
);
11443 } else if (arg3
== 0) {
11444 ret
= -TARGET_EINVAL
;
11446 timer_t htimer
= g_posix_timers
[timerid
];
11447 struct itimerspec hspec_new
= {{0},}, hspec_old
= {{0},};
11449 if (target_to_host_itimerspec(&hspec_new
, arg3
)) {
11450 return -TARGET_EFAULT
;
11453 timer_settime(htimer
, arg2
, &hspec_new
, &hspec_old
));
11454 if (arg4
&& host_to_target_itimerspec(arg4
, &hspec_old
)) {
11455 return -TARGET_EFAULT
;
11462 #ifdef TARGET_NR_timer_gettime
11463 case TARGET_NR_timer_gettime
:
11465 /* args: timer_t timerid, struct itimerspec *curr_value */
11466 target_timer_t timerid
= get_timer_id(arg1
);
11470 } else if (!arg2
) {
11471 ret
= -TARGET_EFAULT
;
11473 timer_t htimer
= g_posix_timers
[timerid
];
11474 struct itimerspec hspec
;
11475 ret
= get_errno(timer_gettime(htimer
, &hspec
));
11477 if (host_to_target_itimerspec(arg2
, &hspec
)) {
11478 ret
= -TARGET_EFAULT
;
11485 #ifdef TARGET_NR_timer_getoverrun
11486 case TARGET_NR_timer_getoverrun
:
11488 /* args: timer_t timerid */
11489 target_timer_t timerid
= get_timer_id(arg1
);
11494 timer_t htimer
= g_posix_timers
[timerid
];
11495 ret
= get_errno(timer_getoverrun(htimer
));
11497 fd_trans_unregister(ret
);
11502 #ifdef TARGET_NR_timer_delete
11503 case TARGET_NR_timer_delete
:
11505 /* args: timer_t timerid */
11506 target_timer_t timerid
= get_timer_id(arg1
);
11511 timer_t htimer
= g_posix_timers
[timerid
];
11512 ret
= get_errno(timer_delete(htimer
));
11513 g_posix_timers
[timerid
] = 0;
11519 #if defined(TARGET_NR_timerfd_create) && defined(CONFIG_TIMERFD)
11520 case TARGET_NR_timerfd_create
:
11521 return get_errno(timerfd_create(arg1
,
11522 target_to_host_bitmask(arg2
, fcntl_flags_tbl
)));
11525 #if defined(TARGET_NR_timerfd_gettime) && defined(CONFIG_TIMERFD)
11526 case TARGET_NR_timerfd_gettime
:
11528 struct itimerspec its_curr
;
11530 ret
= get_errno(timerfd_gettime(arg1
, &its_curr
));
11532 if (arg2
&& host_to_target_itimerspec(arg2
, &its_curr
)) {
11533 return -TARGET_EFAULT
;
11539 #if defined(TARGET_NR_timerfd_settime) && defined(CONFIG_TIMERFD)
11540 case TARGET_NR_timerfd_settime
:
11542 struct itimerspec its_new
, its_old
, *p_new
;
11545 if (target_to_host_itimerspec(&its_new
, arg3
)) {
11546 return -TARGET_EFAULT
;
11553 ret
= get_errno(timerfd_settime(arg1
, arg2
, p_new
, &its_old
));
11555 if (arg4
&& host_to_target_itimerspec(arg4
, &its_old
)) {
11556 return -TARGET_EFAULT
;
11562 #if defined(TARGET_NR_ioprio_get) && defined(__NR_ioprio_get)
11563 case TARGET_NR_ioprio_get
:
11564 return get_errno(ioprio_get(arg1
, arg2
));
11567 #if defined(TARGET_NR_ioprio_set) && defined(__NR_ioprio_set)
11568 case TARGET_NR_ioprio_set
:
11569 return get_errno(ioprio_set(arg1
, arg2
, arg3
));
11572 #if defined(TARGET_NR_setns) && defined(CONFIG_SETNS)
11573 case TARGET_NR_setns
:
11574 return get_errno(setns(arg1
, arg2
));
11576 #if defined(TARGET_NR_unshare) && defined(CONFIG_SETNS)
11577 case TARGET_NR_unshare
:
11578 return get_errno(unshare(arg1
));
11580 #if defined(TARGET_NR_kcmp) && defined(__NR_kcmp)
11581 case TARGET_NR_kcmp
:
11582 return get_errno(kcmp(arg1
, arg2
, arg3
, arg4
, arg5
));
11584 #ifdef TARGET_NR_swapcontext
11585 case TARGET_NR_swapcontext
:
11586 /* PowerPC specific. */
11587 return do_swapcontext(cpu_env
, arg1
, arg2
, arg3
);
11591 qemu_log_mask(LOG_UNIMP
, "Unsupported syscall: %d\n", num
);
11592 return -TARGET_ENOSYS
;
11597 abi_long
do_syscall(void *cpu_env
, int num
, abi_long arg1
,
11598 abi_long arg2
, abi_long arg3
, abi_long arg4
,
11599 abi_long arg5
, abi_long arg6
, abi_long arg7
,
11602 CPUState
*cpu
= ENV_GET_CPU(cpu_env
);
11605 #ifdef DEBUG_ERESTARTSYS
11606 /* Debug-only code for exercising the syscall-restart code paths
11607 * in the per-architecture cpu main loops: restart every syscall
11608 * the guest makes once before letting it through.
11614 return -TARGET_ERESTARTSYS
;
11619 trace_guest_user_syscall(cpu
, num
, arg1
, arg2
, arg3
, arg4
,
11620 arg5
, arg6
, arg7
, arg8
);
11622 if (unlikely(do_strace
)) {
11623 print_syscall(num
, arg1
, arg2
, arg3
, arg4
, arg5
, arg6
);
11624 ret
= do_syscall1(cpu_env
, num
, arg1
, arg2
, arg3
, arg4
,
11625 arg5
, arg6
, arg7
, arg8
);
11626 print_syscall_ret(num
, ret
);
11628 ret
= do_syscall1(cpu_env
, num
, arg1
, arg2
, arg3
, arg4
,
11629 arg5
, arg6
, arg7
, arg8
);
11632 trace_guest_user_syscall_ret(cpu
, num
, ret
);