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"
23 #include "qemu/memfd.h"
24 #include "qemu/queue.h"
31 #include <sys/mount.h>
33 #include <sys/fsuid.h>
34 #include <sys/personality.h>
35 #include <sys/prctl.h>
36 #include <sys/resource.h>
38 #include <linux/capability.h>
40 #include <sys/timex.h>
41 #include <sys/socket.h>
42 #include <linux/sockios.h>
46 #include <sys/times.h>
49 #include <sys/statfs.h>
51 #include <sys/sysinfo.h>
52 #include <sys/signalfd.h>
53 //#include <sys/user.h>
54 #include <netinet/in.h>
55 #include <netinet/ip.h>
56 #include <netinet/tcp.h>
57 #include <netinet/udp.h>
58 #include <linux/wireless.h>
59 #include <linux/icmp.h>
60 #include <linux/icmpv6.h>
61 #include <linux/if_tun.h>
62 #include <linux/in6.h>
63 #include <linux/errqueue.h>
64 #include <linux/random.h>
66 #include <sys/timerfd.h>
69 #include <sys/eventfd.h>
72 #include <sys/epoll.h>
75 #include "qemu/xattr.h"
77 #ifdef CONFIG_SENDFILE
78 #include <sys/sendfile.h>
80 #ifdef HAVE_SYS_KCOV_H
84 #define termios host_termios
85 #define winsize host_winsize
86 #define termio host_termio
87 #define sgttyb host_sgttyb /* same as target */
88 #define tchars host_tchars /* same as target */
89 #define ltchars host_ltchars /* same as target */
91 #include <linux/termios.h>
92 #include <linux/unistd.h>
93 #include <linux/cdrom.h>
94 #include <linux/hdreg.h>
95 #include <linux/soundcard.h>
97 #include <linux/mtio.h>
100 #if defined(CONFIG_FIEMAP)
101 #include <linux/fiemap.h>
103 #include <linux/fb.h>
104 #if defined(CONFIG_USBFS)
105 #include <linux/usbdevice_fs.h>
106 #include <linux/usb/ch9.h>
108 #include <linux/vt.h>
109 #include <linux/dm-ioctl.h>
110 #include <linux/reboot.h>
111 #include <linux/route.h>
112 #include <linux/filter.h>
113 #include <linux/blkpg.h>
114 #include <netpacket/packet.h>
115 #include <linux/netlink.h>
116 #include <linux/if_alg.h>
117 #include <linux/rtc.h>
118 #include <sound/asound.h>
120 #include <linux/btrfs.h>
123 #include <libdrm/drm.h>
124 #include <libdrm/i915_drm.h>
126 #include "linux_loop.h"
130 #include "qemu/guest-random.h"
131 #include "qemu/selfmap.h"
132 #include "user/syscall-trace.h"
133 #include "qapi/error.h"
134 #include "fd-trans.h"
138 #define CLONE_IO 0x80000000 /* Clone io context */
141 /* We can't directly call the host clone syscall, because this will
142 * badly confuse libc (breaking mutexes, for example). So we must
143 * divide clone flags into:
144 * * flag combinations that look like pthread_create()
145 * * flag combinations that look like fork()
146 * * flags we can implement within QEMU itself
147 * * flags we can't support and will return an error for
149 /* For thread creation, all these flags must be present; for
150 * fork, none must be present.
152 #define CLONE_THREAD_FLAGS \
153 (CLONE_VM | CLONE_FS | CLONE_FILES | \
154 CLONE_SIGHAND | CLONE_THREAD | CLONE_SYSVSEM)
156 /* These flags are ignored:
157 * CLONE_DETACHED is now ignored by the kernel;
158 * CLONE_IO is just an optimisation hint to the I/O scheduler
160 #define CLONE_IGNORED_FLAGS \
161 (CLONE_DETACHED | CLONE_IO)
163 /* Flags for fork which we can implement within QEMU itself */
164 #define CLONE_OPTIONAL_FORK_FLAGS \
165 (CLONE_SETTLS | CLONE_PARENT_SETTID | \
166 CLONE_CHILD_CLEARTID | CLONE_CHILD_SETTID)
168 /* Flags for thread creation which we can implement within QEMU itself */
169 #define CLONE_OPTIONAL_THREAD_FLAGS \
170 (CLONE_SETTLS | CLONE_PARENT_SETTID | \
171 CLONE_CHILD_CLEARTID | CLONE_CHILD_SETTID | CLONE_PARENT)
173 #define CLONE_INVALID_FORK_FLAGS \
174 (~(CSIGNAL | CLONE_OPTIONAL_FORK_FLAGS | CLONE_IGNORED_FLAGS))
176 #define CLONE_INVALID_THREAD_FLAGS \
177 (~(CSIGNAL | CLONE_THREAD_FLAGS | CLONE_OPTIONAL_THREAD_FLAGS | \
178 CLONE_IGNORED_FLAGS))
180 /* CLONE_VFORK is special cased early in do_fork(). The other flag bits
181 * have almost all been allocated. We cannot support any of
182 * CLONE_NEWNS, CLONE_NEWCGROUP, CLONE_NEWUTS, CLONE_NEWIPC,
183 * CLONE_NEWUSER, CLONE_NEWPID, CLONE_NEWNET, CLONE_PTRACE, CLONE_UNTRACED.
184 * The checks against the invalid thread masks above will catch these.
185 * (The one remaining unallocated bit is 0x1000 which used to be CLONE_PID.)
188 /* Define DEBUG_ERESTARTSYS to force every syscall to be restarted
189 * once. This exercises the codepaths for restart.
191 //#define DEBUG_ERESTARTSYS
193 //#include <linux/msdos_fs.h>
194 #define VFAT_IOCTL_READDIR_BOTH _IOR('r', 1, struct linux_dirent [2])
195 #define VFAT_IOCTL_READDIR_SHORT _IOR('r', 2, struct linux_dirent [2])
205 #define _syscall0(type,name) \
206 static type name (void) \
208 return syscall(__NR_##name); \
211 #define _syscall1(type,name,type1,arg1) \
212 static type name (type1 arg1) \
214 return syscall(__NR_##name, arg1); \
217 #define _syscall2(type,name,type1,arg1,type2,arg2) \
218 static type name (type1 arg1,type2 arg2) \
220 return syscall(__NR_##name, arg1, arg2); \
223 #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
224 static type name (type1 arg1,type2 arg2,type3 arg3) \
226 return syscall(__NR_##name, arg1, arg2, arg3); \
229 #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
230 static type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4) \
232 return syscall(__NR_##name, arg1, arg2, arg3, arg4); \
235 #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
237 static type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5) \
239 return syscall(__NR_##name, arg1, arg2, arg3, arg4, arg5); \
243 #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
244 type5,arg5,type6,arg6) \
245 static type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5, \
248 return syscall(__NR_##name, arg1, arg2, arg3, arg4, arg5, arg6); \
252 #define __NR_sys_uname __NR_uname
253 #define __NR_sys_getcwd1 __NR_getcwd
254 #define __NR_sys_getdents __NR_getdents
255 #define __NR_sys_getdents64 __NR_getdents64
256 #define __NR_sys_getpriority __NR_getpriority
257 #define __NR_sys_rt_sigqueueinfo __NR_rt_sigqueueinfo
258 #define __NR_sys_rt_tgsigqueueinfo __NR_rt_tgsigqueueinfo
259 #define __NR_sys_syslog __NR_syslog
260 #if defined(__NR_futex)
261 # define __NR_sys_futex __NR_futex
263 #if defined(__NR_futex_time64)
264 # define __NR_sys_futex_time64 __NR_futex_time64
266 #define __NR_sys_inotify_init __NR_inotify_init
267 #define __NR_sys_inotify_add_watch __NR_inotify_add_watch
268 #define __NR_sys_inotify_rm_watch __NR_inotify_rm_watch
269 #define __NR_sys_statx __NR_statx
271 #if defined(__alpha__) || defined(__x86_64__) || defined(__s390x__)
272 #define __NR__llseek __NR_lseek
275 /* Newer kernel ports have llseek() instead of _llseek() */
276 #if defined(TARGET_NR_llseek) && !defined(TARGET_NR__llseek)
277 #define TARGET_NR__llseek TARGET_NR_llseek
280 /* some platforms need to mask more bits than just TARGET_O_NONBLOCK */
281 #ifndef TARGET_O_NONBLOCK_MASK
282 #define TARGET_O_NONBLOCK_MASK TARGET_O_NONBLOCK
285 #define __NR_sys_gettid __NR_gettid
286 _syscall0(int, sys_gettid
)
288 /* For the 64-bit guest on 32-bit host case we must emulate
289 * getdents using getdents64, because otherwise the host
290 * might hand us back more dirent records than we can fit
291 * into the guest buffer after structure format conversion.
292 * Otherwise we emulate getdents with getdents if the host has it.
294 #if defined(__NR_getdents) && HOST_LONG_BITS >= TARGET_ABI_BITS
295 #define EMULATE_GETDENTS_WITH_GETDENTS
298 #if defined(TARGET_NR_getdents) && defined(EMULATE_GETDENTS_WITH_GETDENTS)
299 _syscall3(int, sys_getdents
, uint
, fd
, struct linux_dirent
*, dirp
, uint
, count
);
301 #if (defined(TARGET_NR_getdents) && \
302 !defined(EMULATE_GETDENTS_WITH_GETDENTS)) || \
303 (defined(TARGET_NR_getdents64) && defined(__NR_getdents64))
304 _syscall3(int, sys_getdents64
, uint
, fd
, struct linux_dirent64
*, dirp
, uint
, count
);
306 #if defined(TARGET_NR__llseek) && defined(__NR_llseek)
307 _syscall5(int, _llseek
, uint
, fd
, ulong
, hi
, ulong
, lo
,
308 loff_t
*, res
, uint
, wh
);
310 _syscall3(int, sys_rt_sigqueueinfo
, pid_t
, pid
, int, sig
, siginfo_t
*, uinfo
)
311 _syscall4(int, sys_rt_tgsigqueueinfo
, pid_t
, pid
, pid_t
, tid
, int, sig
,
313 _syscall3(int,sys_syslog
,int,type
,char*,bufp
,int,len
)
314 #ifdef __NR_exit_group
315 _syscall1(int,exit_group
,int,error_code
)
317 #if defined(TARGET_NR_set_tid_address) && defined(__NR_set_tid_address)
318 _syscall1(int,set_tid_address
,int *,tidptr
)
320 #if defined(__NR_futex)
321 _syscall6(int,sys_futex
,int *,uaddr
,int,op
,int,val
,
322 const struct timespec
*,timeout
,int *,uaddr2
,int,val3
)
324 #if defined(__NR_futex_time64)
325 _syscall6(int,sys_futex_time64
,int *,uaddr
,int,op
,int,val
,
326 const struct timespec
*,timeout
,int *,uaddr2
,int,val3
)
328 #define __NR_sys_sched_getaffinity __NR_sched_getaffinity
329 _syscall3(int, sys_sched_getaffinity
, pid_t
, pid
, unsigned int, len
,
330 unsigned long *, user_mask_ptr
);
331 #define __NR_sys_sched_setaffinity __NR_sched_setaffinity
332 _syscall3(int, sys_sched_setaffinity
, pid_t
, pid
, unsigned int, len
,
333 unsigned long *, user_mask_ptr
);
334 #define __NR_sys_getcpu __NR_getcpu
335 _syscall3(int, sys_getcpu
, unsigned *, cpu
, unsigned *, node
, void *, tcache
);
336 _syscall4(int, reboot
, int, magic1
, int, magic2
, unsigned int, cmd
,
338 _syscall2(int, capget
, struct __user_cap_header_struct
*, header
,
339 struct __user_cap_data_struct
*, data
);
340 _syscall2(int, capset
, struct __user_cap_header_struct
*, header
,
341 struct __user_cap_data_struct
*, data
);
342 #if defined(TARGET_NR_ioprio_get) && defined(__NR_ioprio_get)
343 _syscall2(int, ioprio_get
, int, which
, int, who
)
345 #if defined(TARGET_NR_ioprio_set) && defined(__NR_ioprio_set)
346 _syscall3(int, ioprio_set
, int, which
, int, who
, int, ioprio
)
348 #if defined(TARGET_NR_getrandom) && defined(__NR_getrandom)
349 _syscall3(int, getrandom
, void *, buf
, size_t, buflen
, unsigned int, flags
)
352 #if defined(TARGET_NR_kcmp) && defined(__NR_kcmp)
353 _syscall5(int, kcmp
, pid_t
, pid1
, pid_t
, pid2
, int, type
,
354 unsigned long, idx1
, unsigned long, idx2
)
358 * It is assumed that struct statx is architecture independent.
360 #if defined(TARGET_NR_statx) && defined(__NR_statx)
361 _syscall5(int, sys_statx
, int, dirfd
, const char *, pathname
, int, flags
,
362 unsigned int, mask
, struct target_statx
*, statxbuf
)
364 #if defined(TARGET_NR_membarrier) && defined(__NR_membarrier)
365 _syscall2(int, membarrier
, int, cmd
, int, flags
)
368 static const bitmask_transtbl fcntl_flags_tbl
[] = {
369 { TARGET_O_ACCMODE
, TARGET_O_WRONLY
, O_ACCMODE
, O_WRONLY
, },
370 { TARGET_O_ACCMODE
, TARGET_O_RDWR
, O_ACCMODE
, O_RDWR
, },
371 { TARGET_O_CREAT
, TARGET_O_CREAT
, O_CREAT
, O_CREAT
, },
372 { TARGET_O_EXCL
, TARGET_O_EXCL
, O_EXCL
, O_EXCL
, },
373 { TARGET_O_NOCTTY
, TARGET_O_NOCTTY
, O_NOCTTY
, O_NOCTTY
, },
374 { TARGET_O_TRUNC
, TARGET_O_TRUNC
, O_TRUNC
, O_TRUNC
, },
375 { TARGET_O_APPEND
, TARGET_O_APPEND
, O_APPEND
, O_APPEND
, },
376 { TARGET_O_NONBLOCK
, TARGET_O_NONBLOCK
, O_NONBLOCK
, O_NONBLOCK
, },
377 { TARGET_O_SYNC
, TARGET_O_DSYNC
, O_SYNC
, O_DSYNC
, },
378 { TARGET_O_SYNC
, TARGET_O_SYNC
, O_SYNC
, O_SYNC
, },
379 { TARGET_FASYNC
, TARGET_FASYNC
, FASYNC
, FASYNC
, },
380 { TARGET_O_DIRECTORY
, TARGET_O_DIRECTORY
, O_DIRECTORY
, O_DIRECTORY
, },
381 { TARGET_O_NOFOLLOW
, TARGET_O_NOFOLLOW
, O_NOFOLLOW
, O_NOFOLLOW
, },
382 #if defined(O_DIRECT)
383 { TARGET_O_DIRECT
, TARGET_O_DIRECT
, O_DIRECT
, O_DIRECT
, },
385 #if defined(O_NOATIME)
386 { TARGET_O_NOATIME
, TARGET_O_NOATIME
, O_NOATIME
, O_NOATIME
},
388 #if defined(O_CLOEXEC)
389 { TARGET_O_CLOEXEC
, TARGET_O_CLOEXEC
, O_CLOEXEC
, O_CLOEXEC
},
392 { TARGET_O_PATH
, TARGET_O_PATH
, O_PATH
, O_PATH
},
394 #if defined(O_TMPFILE)
395 { TARGET_O_TMPFILE
, TARGET_O_TMPFILE
, O_TMPFILE
, O_TMPFILE
},
397 /* Don't terminate the list prematurely on 64-bit host+guest. */
398 #if TARGET_O_LARGEFILE != 0 || O_LARGEFILE != 0
399 { TARGET_O_LARGEFILE
, TARGET_O_LARGEFILE
, O_LARGEFILE
, O_LARGEFILE
, },
404 _syscall2(int, sys_getcwd1
, char *, buf
, size_t, size
)
406 #if defined(TARGET_NR_utimensat) || defined(TARGET_NR_utimensat_time64)
407 #if defined(__NR_utimensat)
408 #define __NR_sys_utimensat __NR_utimensat
409 _syscall4(int,sys_utimensat
,int,dirfd
,const char *,pathname
,
410 const struct timespec
*,tsp
,int,flags
)
412 static int sys_utimensat(int dirfd
, const char *pathname
,
413 const struct timespec times
[2], int flags
)
419 #endif /* TARGET_NR_utimensat */
421 #ifdef TARGET_NR_renameat2
422 #if defined(__NR_renameat2)
423 #define __NR_sys_renameat2 __NR_renameat2
424 _syscall5(int, sys_renameat2
, int, oldfd
, const char *, old
, int, newfd
,
425 const char *, new, unsigned int, flags
)
427 static int sys_renameat2(int oldfd
, const char *old
,
428 int newfd
, const char *new, int flags
)
431 return renameat(oldfd
, old
, newfd
, new);
437 #endif /* TARGET_NR_renameat2 */
439 #ifdef CONFIG_INOTIFY
440 #include <sys/inotify.h>
442 #if defined(TARGET_NR_inotify_init) && defined(__NR_inotify_init)
443 static int sys_inotify_init(void)
445 return (inotify_init());
448 #if defined(TARGET_NR_inotify_add_watch) && defined(__NR_inotify_add_watch)
449 static int sys_inotify_add_watch(int fd
,const char *pathname
, int32_t mask
)
451 return (inotify_add_watch(fd
, pathname
, mask
));
454 #if defined(TARGET_NR_inotify_rm_watch) && defined(__NR_inotify_rm_watch)
455 static int sys_inotify_rm_watch(int fd
, int32_t wd
)
457 return (inotify_rm_watch(fd
, wd
));
460 #ifdef CONFIG_INOTIFY1
461 #if defined(TARGET_NR_inotify_init1) && defined(__NR_inotify_init1)
462 static int sys_inotify_init1(int flags
)
464 return (inotify_init1(flags
));
469 /* Userspace can usually survive runtime without inotify */
470 #undef TARGET_NR_inotify_init
471 #undef TARGET_NR_inotify_init1
472 #undef TARGET_NR_inotify_add_watch
473 #undef TARGET_NR_inotify_rm_watch
474 #endif /* CONFIG_INOTIFY */
476 #if defined(TARGET_NR_prlimit64)
477 #ifndef __NR_prlimit64
478 # define __NR_prlimit64 -1
480 #define __NR_sys_prlimit64 __NR_prlimit64
481 /* The glibc rlimit structure may not be that used by the underlying syscall */
482 struct host_rlimit64
{
486 _syscall4(int, sys_prlimit64
, pid_t
, pid
, int, resource
,
487 const struct host_rlimit64
*, new_limit
,
488 struct host_rlimit64
*, old_limit
)
492 #if defined(TARGET_NR_timer_create)
493 /* Maximum of 32 active POSIX timers allowed at any one time. */
494 static timer_t g_posix_timers
[32] = { 0, } ;
496 static inline int next_free_host_timer(void)
499 /* FIXME: Does finding the next free slot require a lock? */
500 for (k
= 0; k
< ARRAY_SIZE(g_posix_timers
); k
++) {
501 if (g_posix_timers
[k
] == 0) {
502 g_posix_timers
[k
] = (timer_t
) 1;
510 #define ERRNO_TABLE_SIZE 1200
512 /* target_to_host_errno_table[] is initialized from
513 * host_to_target_errno_table[] in syscall_init(). */
514 static uint16_t target_to_host_errno_table
[ERRNO_TABLE_SIZE
] = {
518 * This list is the union of errno values overridden in asm-<arch>/errno.h
519 * minus the errnos that are not actually generic to all archs.
521 static uint16_t host_to_target_errno_table
[ERRNO_TABLE_SIZE
] = {
522 [EAGAIN
] = TARGET_EAGAIN
,
523 [EIDRM
] = TARGET_EIDRM
,
524 [ECHRNG
] = TARGET_ECHRNG
,
525 [EL2NSYNC
] = TARGET_EL2NSYNC
,
526 [EL3HLT
] = TARGET_EL3HLT
,
527 [EL3RST
] = TARGET_EL3RST
,
528 [ELNRNG
] = TARGET_ELNRNG
,
529 [EUNATCH
] = TARGET_EUNATCH
,
530 [ENOCSI
] = TARGET_ENOCSI
,
531 [EL2HLT
] = TARGET_EL2HLT
,
532 [EDEADLK
] = TARGET_EDEADLK
,
533 [ENOLCK
] = TARGET_ENOLCK
,
534 [EBADE
] = TARGET_EBADE
,
535 [EBADR
] = TARGET_EBADR
,
536 [EXFULL
] = TARGET_EXFULL
,
537 [ENOANO
] = TARGET_ENOANO
,
538 [EBADRQC
] = TARGET_EBADRQC
,
539 [EBADSLT
] = TARGET_EBADSLT
,
540 [EBFONT
] = TARGET_EBFONT
,
541 [ENOSTR
] = TARGET_ENOSTR
,
542 [ENODATA
] = TARGET_ENODATA
,
543 [ETIME
] = TARGET_ETIME
,
544 [ENOSR
] = TARGET_ENOSR
,
545 [ENONET
] = TARGET_ENONET
,
546 [ENOPKG
] = TARGET_ENOPKG
,
547 [EREMOTE
] = TARGET_EREMOTE
,
548 [ENOLINK
] = TARGET_ENOLINK
,
549 [EADV
] = TARGET_EADV
,
550 [ESRMNT
] = TARGET_ESRMNT
,
551 [ECOMM
] = TARGET_ECOMM
,
552 [EPROTO
] = TARGET_EPROTO
,
553 [EDOTDOT
] = TARGET_EDOTDOT
,
554 [EMULTIHOP
] = TARGET_EMULTIHOP
,
555 [EBADMSG
] = TARGET_EBADMSG
,
556 [ENAMETOOLONG
] = TARGET_ENAMETOOLONG
,
557 [EOVERFLOW
] = TARGET_EOVERFLOW
,
558 [ENOTUNIQ
] = TARGET_ENOTUNIQ
,
559 [EBADFD
] = TARGET_EBADFD
,
560 [EREMCHG
] = TARGET_EREMCHG
,
561 [ELIBACC
] = TARGET_ELIBACC
,
562 [ELIBBAD
] = TARGET_ELIBBAD
,
563 [ELIBSCN
] = TARGET_ELIBSCN
,
564 [ELIBMAX
] = TARGET_ELIBMAX
,
565 [ELIBEXEC
] = TARGET_ELIBEXEC
,
566 [EILSEQ
] = TARGET_EILSEQ
,
567 [ENOSYS
] = TARGET_ENOSYS
,
568 [ELOOP
] = TARGET_ELOOP
,
569 [ERESTART
] = TARGET_ERESTART
,
570 [ESTRPIPE
] = TARGET_ESTRPIPE
,
571 [ENOTEMPTY
] = TARGET_ENOTEMPTY
,
572 [EUSERS
] = TARGET_EUSERS
,
573 [ENOTSOCK
] = TARGET_ENOTSOCK
,
574 [EDESTADDRREQ
] = TARGET_EDESTADDRREQ
,
575 [EMSGSIZE
] = TARGET_EMSGSIZE
,
576 [EPROTOTYPE
] = TARGET_EPROTOTYPE
,
577 [ENOPROTOOPT
] = TARGET_ENOPROTOOPT
,
578 [EPROTONOSUPPORT
] = TARGET_EPROTONOSUPPORT
,
579 [ESOCKTNOSUPPORT
] = TARGET_ESOCKTNOSUPPORT
,
580 [EOPNOTSUPP
] = TARGET_EOPNOTSUPP
,
581 [EPFNOSUPPORT
] = TARGET_EPFNOSUPPORT
,
582 [EAFNOSUPPORT
] = TARGET_EAFNOSUPPORT
,
583 [EADDRINUSE
] = TARGET_EADDRINUSE
,
584 [EADDRNOTAVAIL
] = TARGET_EADDRNOTAVAIL
,
585 [ENETDOWN
] = TARGET_ENETDOWN
,
586 [ENETUNREACH
] = TARGET_ENETUNREACH
,
587 [ENETRESET
] = TARGET_ENETRESET
,
588 [ECONNABORTED
] = TARGET_ECONNABORTED
,
589 [ECONNRESET
] = TARGET_ECONNRESET
,
590 [ENOBUFS
] = TARGET_ENOBUFS
,
591 [EISCONN
] = TARGET_EISCONN
,
592 [ENOTCONN
] = TARGET_ENOTCONN
,
593 [EUCLEAN
] = TARGET_EUCLEAN
,
594 [ENOTNAM
] = TARGET_ENOTNAM
,
595 [ENAVAIL
] = TARGET_ENAVAIL
,
596 [EISNAM
] = TARGET_EISNAM
,
597 [EREMOTEIO
] = TARGET_EREMOTEIO
,
598 [EDQUOT
] = TARGET_EDQUOT
,
599 [ESHUTDOWN
] = TARGET_ESHUTDOWN
,
600 [ETOOMANYREFS
] = TARGET_ETOOMANYREFS
,
601 [ETIMEDOUT
] = TARGET_ETIMEDOUT
,
602 [ECONNREFUSED
] = TARGET_ECONNREFUSED
,
603 [EHOSTDOWN
] = TARGET_EHOSTDOWN
,
604 [EHOSTUNREACH
] = TARGET_EHOSTUNREACH
,
605 [EALREADY
] = TARGET_EALREADY
,
606 [EINPROGRESS
] = TARGET_EINPROGRESS
,
607 [ESTALE
] = TARGET_ESTALE
,
608 [ECANCELED
] = TARGET_ECANCELED
,
609 [ENOMEDIUM
] = TARGET_ENOMEDIUM
,
610 [EMEDIUMTYPE
] = TARGET_EMEDIUMTYPE
,
612 [ENOKEY
] = TARGET_ENOKEY
,
615 [EKEYEXPIRED
] = TARGET_EKEYEXPIRED
,
618 [EKEYREVOKED
] = TARGET_EKEYREVOKED
,
621 [EKEYREJECTED
] = TARGET_EKEYREJECTED
,
624 [EOWNERDEAD
] = TARGET_EOWNERDEAD
,
626 #ifdef ENOTRECOVERABLE
627 [ENOTRECOVERABLE
] = TARGET_ENOTRECOVERABLE
,
630 [ENOMSG
] = TARGET_ENOMSG
,
633 [ERFKILL
] = TARGET_ERFKILL
,
636 [EHWPOISON
] = TARGET_EHWPOISON
,
640 static inline int host_to_target_errno(int err
)
642 if (err
>= 0 && err
< ERRNO_TABLE_SIZE
&&
643 host_to_target_errno_table
[err
]) {
644 return host_to_target_errno_table
[err
];
649 static inline int target_to_host_errno(int err
)
651 if (err
>= 0 && err
< ERRNO_TABLE_SIZE
&&
652 target_to_host_errno_table
[err
]) {
653 return target_to_host_errno_table
[err
];
658 static inline abi_long
get_errno(abi_long ret
)
661 return -host_to_target_errno(errno
);
666 const char *target_strerror(int err
)
668 if (err
== TARGET_ERESTARTSYS
) {
669 return "To be restarted";
671 if (err
== TARGET_QEMU_ESIGRETURN
) {
672 return "Successful exit from sigreturn";
675 if ((err
>= ERRNO_TABLE_SIZE
) || (err
< 0)) {
678 return strerror(target_to_host_errno(err
));
681 #define safe_syscall0(type, name) \
682 static type safe_##name(void) \
684 return safe_syscall(__NR_##name); \
687 #define safe_syscall1(type, name, type1, arg1) \
688 static type safe_##name(type1 arg1) \
690 return safe_syscall(__NR_##name, arg1); \
693 #define safe_syscall2(type, name, type1, arg1, type2, arg2) \
694 static type safe_##name(type1 arg1, type2 arg2) \
696 return safe_syscall(__NR_##name, arg1, arg2); \
699 #define safe_syscall3(type, name, type1, arg1, type2, arg2, type3, arg3) \
700 static type safe_##name(type1 arg1, type2 arg2, type3 arg3) \
702 return safe_syscall(__NR_##name, arg1, arg2, arg3); \
705 #define safe_syscall4(type, name, type1, arg1, type2, arg2, type3, arg3, \
707 static type safe_##name(type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
709 return safe_syscall(__NR_##name, arg1, arg2, arg3, arg4); \
712 #define safe_syscall5(type, name, type1, arg1, type2, arg2, type3, arg3, \
713 type4, arg4, type5, arg5) \
714 static type safe_##name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \
717 return safe_syscall(__NR_##name, arg1, arg2, arg3, arg4, arg5); \
720 #define safe_syscall6(type, name, type1, arg1, type2, arg2, type3, arg3, \
721 type4, arg4, type5, arg5, type6, arg6) \
722 static type safe_##name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \
723 type5 arg5, type6 arg6) \
725 return safe_syscall(__NR_##name, arg1, arg2, arg3, arg4, arg5, arg6); \
728 safe_syscall3(ssize_t
, read
, int, fd
, void *, buff
, size_t, count
)
729 safe_syscall3(ssize_t
, write
, int, fd
, const void *, buff
, size_t, count
)
730 safe_syscall4(int, openat
, int, dirfd
, const char *, pathname
, \
731 int, flags
, mode_t
, mode
)
732 #if defined(TARGET_NR_wait4) || defined(TARGET_NR_waitpid)
733 safe_syscall4(pid_t
, wait4
, pid_t
, pid
, int *, status
, int, options
, \
734 struct rusage
*, rusage
)
736 safe_syscall5(int, waitid
, idtype_t
, idtype
, id_t
, id
, siginfo_t
*, infop
, \
737 int, options
, struct rusage
*, rusage
)
738 safe_syscall3(int, execve
, const char *, filename
, char **, argv
, char **, envp
)
739 #if defined(TARGET_NR_select) || defined(TARGET_NR__newselect) || \
740 defined(TARGET_NR_pselect6) || defined(TARGET_NR_pselect6_time64)
741 safe_syscall6(int, pselect6
, int, nfds
, fd_set
*, readfds
, fd_set
*, writefds
, \
742 fd_set
*, exceptfds
, struct timespec
*, timeout
, void *, sig
)
744 #if defined(TARGET_NR_ppoll) || defined(TARGET_NR_ppoll_time64)
745 safe_syscall5(int, ppoll
, struct pollfd
*, ufds
, unsigned int, nfds
,
746 struct timespec
*, tsp
, const sigset_t
*, sigmask
,
749 safe_syscall6(int, epoll_pwait
, int, epfd
, struct epoll_event
*, events
,
750 int, maxevents
, int, timeout
, const sigset_t
*, sigmask
,
752 #if defined(__NR_futex)
753 safe_syscall6(int,futex
,int *,uaddr
,int,op
,int,val
, \
754 const struct timespec
*,timeout
,int *,uaddr2
,int,val3
)
756 #if defined(__NR_futex_time64)
757 safe_syscall6(int,futex_time64
,int *,uaddr
,int,op
,int,val
, \
758 const struct timespec
*,timeout
,int *,uaddr2
,int,val3
)
760 safe_syscall2(int, rt_sigsuspend
, sigset_t
*, newset
, size_t, sigsetsize
)
761 safe_syscall2(int, kill
, pid_t
, pid
, int, sig
)
762 safe_syscall2(int, tkill
, int, tid
, int, sig
)
763 safe_syscall3(int, tgkill
, int, tgid
, int, pid
, int, sig
)
764 safe_syscall3(ssize_t
, readv
, int, fd
, const struct iovec
*, iov
, int, iovcnt
)
765 safe_syscall3(ssize_t
, writev
, int, fd
, const struct iovec
*, iov
, int, iovcnt
)
766 safe_syscall5(ssize_t
, preadv
, int, fd
, const struct iovec
*, iov
, int, iovcnt
,
767 unsigned long, pos_l
, unsigned long, pos_h
)
768 safe_syscall5(ssize_t
, pwritev
, int, fd
, const struct iovec
*, iov
, int, iovcnt
,
769 unsigned long, pos_l
, unsigned long, pos_h
)
770 safe_syscall3(int, connect
, int, fd
, const struct sockaddr
*, addr
,
772 safe_syscall6(ssize_t
, sendto
, int, fd
, const void *, buf
, size_t, len
,
773 int, flags
, const struct sockaddr
*, addr
, socklen_t
, addrlen
)
774 safe_syscall6(ssize_t
, recvfrom
, int, fd
, void *, buf
, size_t, len
,
775 int, flags
, struct sockaddr
*, addr
, socklen_t
*, addrlen
)
776 safe_syscall3(ssize_t
, sendmsg
, int, fd
, const struct msghdr
*, msg
, int, flags
)
777 safe_syscall3(ssize_t
, recvmsg
, int, fd
, struct msghdr
*, msg
, int, flags
)
778 safe_syscall2(int, flock
, int, fd
, int, operation
)
779 #if defined(TARGET_NR_rt_sigtimedwait) || defined(TARGET_NR_rt_sigtimedwait_time64)
780 safe_syscall4(int, rt_sigtimedwait
, const sigset_t
*, these
, siginfo_t
*, uinfo
,
781 const struct timespec
*, uts
, size_t, sigsetsize
)
783 safe_syscall4(int, accept4
, int, fd
, struct sockaddr
*, addr
, socklen_t
*, len
,
785 #if defined(TARGET_NR_nanosleep)
786 safe_syscall2(int, nanosleep
, const struct timespec
*, req
,
787 struct timespec
*, rem
)
789 #if defined(TARGET_NR_clock_nanosleep) || \
790 defined(TARGET_NR_clock_nanosleep_time64)
791 safe_syscall4(int, clock_nanosleep
, const clockid_t
, clock
, int, flags
,
792 const struct timespec
*, req
, struct timespec
*, rem
)
796 safe_syscall5(int, ipc
, int, call
, long, first
, long, second
, long, third
,
799 safe_syscall6(int, ipc
, int, call
, long, first
, long, second
, long, third
,
800 void *, ptr
, long, fifth
)
804 safe_syscall4(int, msgsnd
, int, msgid
, const void *, msgp
, size_t, sz
,
808 safe_syscall5(int, msgrcv
, int, msgid
, void *, msgp
, size_t, sz
,
809 long, msgtype
, int, flags
)
811 #ifdef __NR_semtimedop
812 safe_syscall4(int, semtimedop
, int, semid
, struct sembuf
*, tsops
,
813 unsigned, nsops
, const struct timespec
*, timeout
)
815 #if defined(TARGET_NR_mq_timedsend) || \
816 defined(TARGET_NR_mq_timedsend_time64)
817 safe_syscall5(int, mq_timedsend
, int, mqdes
, const char *, msg_ptr
,
818 size_t, len
, unsigned, prio
, const struct timespec
*, timeout
)
820 #if defined(TARGET_NR_mq_timedreceive) || \
821 defined(TARGET_NR_mq_timedreceive_time64)
822 safe_syscall5(int, mq_timedreceive
, int, mqdes
, char *, msg_ptr
,
823 size_t, len
, unsigned *, prio
, const struct timespec
*, timeout
)
825 #if defined(TARGET_NR_copy_file_range) && defined(__NR_copy_file_range)
826 safe_syscall6(ssize_t
, copy_file_range
, int, infd
, loff_t
*, pinoff
,
827 int, outfd
, loff_t
*, poutoff
, size_t, length
,
831 /* We do ioctl like this rather than via safe_syscall3 to preserve the
832 * "third argument might be integer or pointer or not present" behaviour of
835 #define safe_ioctl(...) safe_syscall(__NR_ioctl, __VA_ARGS__)
836 /* Similarly for fcntl. Note that callers must always:
837 * pass the F_GETLK64 etc constants rather than the unsuffixed F_GETLK
838 * use the flock64 struct rather than unsuffixed flock
839 * This will then work and use a 64-bit offset for both 32-bit and 64-bit hosts.
842 #define safe_fcntl(...) safe_syscall(__NR_fcntl64, __VA_ARGS__)
844 #define safe_fcntl(...) safe_syscall(__NR_fcntl, __VA_ARGS__)
847 static inline int host_to_target_sock_type(int host_type
)
851 switch (host_type
& 0xf /* SOCK_TYPE_MASK */) {
853 target_type
= TARGET_SOCK_DGRAM
;
856 target_type
= TARGET_SOCK_STREAM
;
859 target_type
= host_type
& 0xf /* SOCK_TYPE_MASK */;
863 #if defined(SOCK_CLOEXEC)
864 if (host_type
& SOCK_CLOEXEC
) {
865 target_type
|= TARGET_SOCK_CLOEXEC
;
869 #if defined(SOCK_NONBLOCK)
870 if (host_type
& SOCK_NONBLOCK
) {
871 target_type
|= TARGET_SOCK_NONBLOCK
;
878 static abi_ulong target_brk
;
879 static abi_ulong target_original_brk
;
880 static abi_ulong brk_page
;
882 void target_set_brk(abi_ulong new_brk
)
884 target_original_brk
= target_brk
= HOST_PAGE_ALIGN(new_brk
);
885 brk_page
= HOST_PAGE_ALIGN(target_brk
);
888 //#define DEBUGF_BRK(message, args...) do { fprintf(stderr, (message), ## args); } while (0)
889 #define DEBUGF_BRK(message, args...)
891 /* do_brk() must return target values and target errnos. */
892 abi_long
do_brk(abi_ulong new_brk
)
894 abi_long mapped_addr
;
895 abi_ulong new_alloc_size
;
897 /* brk pointers are always untagged */
899 DEBUGF_BRK("do_brk(" TARGET_ABI_FMT_lx
") -> ", new_brk
);
902 DEBUGF_BRK(TARGET_ABI_FMT_lx
" (!new_brk)\n", target_brk
);
905 if (new_brk
< target_original_brk
) {
906 DEBUGF_BRK(TARGET_ABI_FMT_lx
" (new_brk < target_original_brk)\n",
911 /* If the new brk is less than the highest page reserved to the
912 * target heap allocation, set it and we're almost done... */
913 if (new_brk
<= brk_page
) {
914 /* Heap contents are initialized to zero, as for anonymous
916 if (new_brk
> target_brk
) {
917 memset(g2h_untagged(target_brk
), 0, new_brk
- target_brk
);
919 target_brk
= new_brk
;
920 DEBUGF_BRK(TARGET_ABI_FMT_lx
" (new_brk <= brk_page)\n", target_brk
);
924 /* We need to allocate more memory after the brk... Note that
925 * we don't use MAP_FIXED because that will map over the top of
926 * any existing mapping (like the one with the host libc or qemu
927 * itself); instead we treat "mapped but at wrong address" as
928 * a failure and unmap again.
930 new_alloc_size
= HOST_PAGE_ALIGN(new_brk
- brk_page
);
931 mapped_addr
= get_errno(target_mmap(brk_page
, new_alloc_size
,
932 PROT_READ
|PROT_WRITE
,
933 MAP_ANON
|MAP_PRIVATE
, 0, 0));
935 if (mapped_addr
== brk_page
) {
936 /* Heap contents are initialized to zero, as for anonymous
937 * mapped pages. Technically the new pages are already
938 * initialized to zero since they *are* anonymous mapped
939 * pages, however we have to take care with the contents that
940 * come from the remaining part of the previous page: it may
941 * contains garbage data due to a previous heap usage (grown
943 memset(g2h_untagged(target_brk
), 0, brk_page
- target_brk
);
945 target_brk
= new_brk
;
946 brk_page
= HOST_PAGE_ALIGN(target_brk
);
947 DEBUGF_BRK(TARGET_ABI_FMT_lx
" (mapped_addr == brk_page)\n",
950 } else if (mapped_addr
!= -1) {
951 /* Mapped but at wrong address, meaning there wasn't actually
952 * enough space for this brk.
954 target_munmap(mapped_addr
, new_alloc_size
);
956 DEBUGF_BRK(TARGET_ABI_FMT_lx
" (mapped_addr != -1)\n", target_brk
);
959 DEBUGF_BRK(TARGET_ABI_FMT_lx
" (otherwise)\n", target_brk
);
962 #if defined(TARGET_ALPHA)
963 /* We (partially) emulate OSF/1 on Alpha, which requires we
964 return a proper errno, not an unchanged brk value. */
965 return -TARGET_ENOMEM
;
967 /* For everything else, return the previous break. */
971 #if defined(TARGET_NR_select) || defined(TARGET_NR__newselect) || \
972 defined(TARGET_NR_pselect6) || defined(TARGET_NR_pselect6_time64)
973 static inline abi_long
copy_from_user_fdset(fd_set
*fds
,
974 abi_ulong target_fds_addr
,
978 abi_ulong b
, *target_fds
;
980 nw
= DIV_ROUND_UP(n
, TARGET_ABI_BITS
);
981 if (!(target_fds
= lock_user(VERIFY_READ
,
983 sizeof(abi_ulong
) * nw
,
985 return -TARGET_EFAULT
;
989 for (i
= 0; i
< nw
; i
++) {
990 /* grab the abi_ulong */
991 __get_user(b
, &target_fds
[i
]);
992 for (j
= 0; j
< TARGET_ABI_BITS
; j
++) {
993 /* check the bit inside the abi_ulong */
1000 unlock_user(target_fds
, target_fds_addr
, 0);
1005 static inline abi_ulong
copy_from_user_fdset_ptr(fd_set
*fds
, fd_set
**fds_ptr
,
1006 abi_ulong target_fds_addr
,
1009 if (target_fds_addr
) {
1010 if (copy_from_user_fdset(fds
, target_fds_addr
, n
))
1011 return -TARGET_EFAULT
;
1019 static inline abi_long
copy_to_user_fdset(abi_ulong target_fds_addr
,
1025 abi_ulong
*target_fds
;
1027 nw
= DIV_ROUND_UP(n
, TARGET_ABI_BITS
);
1028 if (!(target_fds
= lock_user(VERIFY_WRITE
,
1030 sizeof(abi_ulong
) * nw
,
1032 return -TARGET_EFAULT
;
1035 for (i
= 0; i
< nw
; i
++) {
1037 for (j
= 0; j
< TARGET_ABI_BITS
; j
++) {
1038 v
|= ((abi_ulong
)(FD_ISSET(k
, fds
) != 0) << j
);
1041 __put_user(v
, &target_fds
[i
]);
1044 unlock_user(target_fds
, target_fds_addr
, sizeof(abi_ulong
) * nw
);
1050 #if defined(__alpha__)
1051 #define HOST_HZ 1024
1056 static inline abi_long
host_to_target_clock_t(long ticks
)
1058 #if HOST_HZ == TARGET_HZ
1061 return ((int64_t)ticks
* TARGET_HZ
) / HOST_HZ
;
1065 static inline abi_long
host_to_target_rusage(abi_ulong target_addr
,
1066 const struct rusage
*rusage
)
1068 struct target_rusage
*target_rusage
;
1070 if (!lock_user_struct(VERIFY_WRITE
, target_rusage
, target_addr
, 0))
1071 return -TARGET_EFAULT
;
1072 target_rusage
->ru_utime
.tv_sec
= tswapal(rusage
->ru_utime
.tv_sec
);
1073 target_rusage
->ru_utime
.tv_usec
= tswapal(rusage
->ru_utime
.tv_usec
);
1074 target_rusage
->ru_stime
.tv_sec
= tswapal(rusage
->ru_stime
.tv_sec
);
1075 target_rusage
->ru_stime
.tv_usec
= tswapal(rusage
->ru_stime
.tv_usec
);
1076 target_rusage
->ru_maxrss
= tswapal(rusage
->ru_maxrss
);
1077 target_rusage
->ru_ixrss
= tswapal(rusage
->ru_ixrss
);
1078 target_rusage
->ru_idrss
= tswapal(rusage
->ru_idrss
);
1079 target_rusage
->ru_isrss
= tswapal(rusage
->ru_isrss
);
1080 target_rusage
->ru_minflt
= tswapal(rusage
->ru_minflt
);
1081 target_rusage
->ru_majflt
= tswapal(rusage
->ru_majflt
);
1082 target_rusage
->ru_nswap
= tswapal(rusage
->ru_nswap
);
1083 target_rusage
->ru_inblock
= tswapal(rusage
->ru_inblock
);
1084 target_rusage
->ru_oublock
= tswapal(rusage
->ru_oublock
);
1085 target_rusage
->ru_msgsnd
= tswapal(rusage
->ru_msgsnd
);
1086 target_rusage
->ru_msgrcv
= tswapal(rusage
->ru_msgrcv
);
1087 target_rusage
->ru_nsignals
= tswapal(rusage
->ru_nsignals
);
1088 target_rusage
->ru_nvcsw
= tswapal(rusage
->ru_nvcsw
);
1089 target_rusage
->ru_nivcsw
= tswapal(rusage
->ru_nivcsw
);
1090 unlock_user_struct(target_rusage
, target_addr
, 1);
1095 #ifdef TARGET_NR_setrlimit
1096 static inline rlim_t
target_to_host_rlim(abi_ulong target_rlim
)
1098 abi_ulong target_rlim_swap
;
1101 target_rlim_swap
= tswapal(target_rlim
);
1102 if (target_rlim_swap
== TARGET_RLIM_INFINITY
)
1103 return RLIM_INFINITY
;
1105 result
= target_rlim_swap
;
1106 if (target_rlim_swap
!= (rlim_t
)result
)
1107 return RLIM_INFINITY
;
1113 #if defined(TARGET_NR_getrlimit) || defined(TARGET_NR_ugetrlimit)
1114 static inline abi_ulong
host_to_target_rlim(rlim_t rlim
)
1116 abi_ulong target_rlim_swap
;
1119 if (rlim
== RLIM_INFINITY
|| rlim
!= (abi_long
)rlim
)
1120 target_rlim_swap
= TARGET_RLIM_INFINITY
;
1122 target_rlim_swap
= rlim
;
1123 result
= tswapal(target_rlim_swap
);
1129 static inline int target_to_host_resource(int code
)
1132 case TARGET_RLIMIT_AS
:
1134 case TARGET_RLIMIT_CORE
:
1136 case TARGET_RLIMIT_CPU
:
1138 case TARGET_RLIMIT_DATA
:
1140 case TARGET_RLIMIT_FSIZE
:
1141 return RLIMIT_FSIZE
;
1142 case TARGET_RLIMIT_LOCKS
:
1143 return RLIMIT_LOCKS
;
1144 case TARGET_RLIMIT_MEMLOCK
:
1145 return RLIMIT_MEMLOCK
;
1146 case TARGET_RLIMIT_MSGQUEUE
:
1147 return RLIMIT_MSGQUEUE
;
1148 case TARGET_RLIMIT_NICE
:
1150 case TARGET_RLIMIT_NOFILE
:
1151 return RLIMIT_NOFILE
;
1152 case TARGET_RLIMIT_NPROC
:
1153 return RLIMIT_NPROC
;
1154 case TARGET_RLIMIT_RSS
:
1156 case TARGET_RLIMIT_RTPRIO
:
1157 return RLIMIT_RTPRIO
;
1158 case TARGET_RLIMIT_SIGPENDING
:
1159 return RLIMIT_SIGPENDING
;
1160 case TARGET_RLIMIT_STACK
:
1161 return RLIMIT_STACK
;
1167 static inline abi_long
copy_from_user_timeval(struct timeval
*tv
,
1168 abi_ulong target_tv_addr
)
1170 struct target_timeval
*target_tv
;
1172 if (!lock_user_struct(VERIFY_READ
, target_tv
, target_tv_addr
, 1)) {
1173 return -TARGET_EFAULT
;
1176 __get_user(tv
->tv_sec
, &target_tv
->tv_sec
);
1177 __get_user(tv
->tv_usec
, &target_tv
->tv_usec
);
1179 unlock_user_struct(target_tv
, target_tv_addr
, 0);
1184 static inline abi_long
copy_to_user_timeval(abi_ulong target_tv_addr
,
1185 const struct timeval
*tv
)
1187 struct target_timeval
*target_tv
;
1189 if (!lock_user_struct(VERIFY_WRITE
, target_tv
, target_tv_addr
, 0)) {
1190 return -TARGET_EFAULT
;
1193 __put_user(tv
->tv_sec
, &target_tv
->tv_sec
);
1194 __put_user(tv
->tv_usec
, &target_tv
->tv_usec
);
1196 unlock_user_struct(target_tv
, target_tv_addr
, 1);
1201 #if defined(TARGET_NR_clock_adjtime64) && defined(CONFIG_CLOCK_ADJTIME)
1202 static inline abi_long
copy_from_user_timeval64(struct timeval
*tv
,
1203 abi_ulong target_tv_addr
)
1205 struct target__kernel_sock_timeval
*target_tv
;
1207 if (!lock_user_struct(VERIFY_READ
, target_tv
, target_tv_addr
, 1)) {
1208 return -TARGET_EFAULT
;
1211 __get_user(tv
->tv_sec
, &target_tv
->tv_sec
);
1212 __get_user(tv
->tv_usec
, &target_tv
->tv_usec
);
1214 unlock_user_struct(target_tv
, target_tv_addr
, 0);
1220 static inline abi_long
copy_to_user_timeval64(abi_ulong target_tv_addr
,
1221 const struct timeval
*tv
)
1223 struct target__kernel_sock_timeval
*target_tv
;
1225 if (!lock_user_struct(VERIFY_WRITE
, target_tv
, target_tv_addr
, 0)) {
1226 return -TARGET_EFAULT
;
1229 __put_user(tv
->tv_sec
, &target_tv
->tv_sec
);
1230 __put_user(tv
->tv_usec
, &target_tv
->tv_usec
);
1232 unlock_user_struct(target_tv
, target_tv_addr
, 1);
1237 #if defined(TARGET_NR_futex) || \
1238 defined(TARGET_NR_rt_sigtimedwait) || \
1239 defined(TARGET_NR_pselect6) || defined(TARGET_NR_pselect6) || \
1240 defined(TARGET_NR_nanosleep) || defined(TARGET_NR_clock_settime) || \
1241 defined(TARGET_NR_utimensat) || defined(TARGET_NR_mq_timedsend) || \
1242 defined(TARGET_NR_mq_timedreceive) || defined(TARGET_NR_ipc) || \
1243 defined(TARGET_NR_semop) || defined(TARGET_NR_semtimedop) || \
1244 defined(TARGET_NR_timer_settime) || \
1245 (defined(TARGET_NR_timerfd_settime) && defined(CONFIG_TIMERFD))
1246 static inline abi_long
target_to_host_timespec(struct timespec
*host_ts
,
1247 abi_ulong target_addr
)
1249 struct target_timespec
*target_ts
;
1251 if (!lock_user_struct(VERIFY_READ
, target_ts
, target_addr
, 1)) {
1252 return -TARGET_EFAULT
;
1254 __get_user(host_ts
->tv_sec
, &target_ts
->tv_sec
);
1255 __get_user(host_ts
->tv_nsec
, &target_ts
->tv_nsec
);
1256 unlock_user_struct(target_ts
, target_addr
, 0);
1261 #if defined(TARGET_NR_clock_settime64) || defined(TARGET_NR_futex_time64) || \
1262 defined(TARGET_NR_timer_settime64) || \
1263 defined(TARGET_NR_mq_timedsend_time64) || \
1264 defined(TARGET_NR_mq_timedreceive_time64) || \
1265 (defined(TARGET_NR_timerfd_settime64) && defined(CONFIG_TIMERFD)) || \
1266 defined(TARGET_NR_clock_nanosleep_time64) || \
1267 defined(TARGET_NR_rt_sigtimedwait_time64) || \
1268 defined(TARGET_NR_utimensat) || \
1269 defined(TARGET_NR_utimensat_time64) || \
1270 defined(TARGET_NR_semtimedop_time64) || \
1271 defined(TARGET_NR_pselect6_time64) || defined(TARGET_NR_ppoll_time64)
1272 static inline abi_long
target_to_host_timespec64(struct timespec
*host_ts
,
1273 abi_ulong target_addr
)
1275 struct target__kernel_timespec
*target_ts
;
1277 if (!lock_user_struct(VERIFY_READ
, target_ts
, target_addr
, 1)) {
1278 return -TARGET_EFAULT
;
1280 __get_user(host_ts
->tv_sec
, &target_ts
->tv_sec
);
1281 __get_user(host_ts
->tv_nsec
, &target_ts
->tv_nsec
);
1282 /* in 32bit mode, this drops the padding */
1283 host_ts
->tv_nsec
= (long)(abi_long
)host_ts
->tv_nsec
;
1284 unlock_user_struct(target_ts
, target_addr
, 0);
1289 static inline abi_long
host_to_target_timespec(abi_ulong target_addr
,
1290 struct timespec
*host_ts
)
1292 struct target_timespec
*target_ts
;
1294 if (!lock_user_struct(VERIFY_WRITE
, target_ts
, target_addr
, 0)) {
1295 return -TARGET_EFAULT
;
1297 __put_user(host_ts
->tv_sec
, &target_ts
->tv_sec
);
1298 __put_user(host_ts
->tv_nsec
, &target_ts
->tv_nsec
);
1299 unlock_user_struct(target_ts
, target_addr
, 1);
1303 static inline abi_long
host_to_target_timespec64(abi_ulong target_addr
,
1304 struct timespec
*host_ts
)
1306 struct target__kernel_timespec
*target_ts
;
1308 if (!lock_user_struct(VERIFY_WRITE
, target_ts
, target_addr
, 0)) {
1309 return -TARGET_EFAULT
;
1311 __put_user(host_ts
->tv_sec
, &target_ts
->tv_sec
);
1312 __put_user(host_ts
->tv_nsec
, &target_ts
->tv_nsec
);
1313 unlock_user_struct(target_ts
, target_addr
, 1);
1317 #if defined(TARGET_NR_gettimeofday)
1318 static inline abi_long
copy_to_user_timezone(abi_ulong target_tz_addr
,
1319 struct timezone
*tz
)
1321 struct target_timezone
*target_tz
;
1323 if (!lock_user_struct(VERIFY_WRITE
, target_tz
, target_tz_addr
, 1)) {
1324 return -TARGET_EFAULT
;
1327 __put_user(tz
->tz_minuteswest
, &target_tz
->tz_minuteswest
);
1328 __put_user(tz
->tz_dsttime
, &target_tz
->tz_dsttime
);
1330 unlock_user_struct(target_tz
, target_tz_addr
, 1);
1336 #if defined(TARGET_NR_settimeofday)
1337 static inline abi_long
copy_from_user_timezone(struct timezone
*tz
,
1338 abi_ulong target_tz_addr
)
1340 struct target_timezone
*target_tz
;
1342 if (!lock_user_struct(VERIFY_READ
, target_tz
, target_tz_addr
, 1)) {
1343 return -TARGET_EFAULT
;
1346 __get_user(tz
->tz_minuteswest
, &target_tz
->tz_minuteswest
);
1347 __get_user(tz
->tz_dsttime
, &target_tz
->tz_dsttime
);
1349 unlock_user_struct(target_tz
, target_tz_addr
, 0);
1355 #if defined(TARGET_NR_mq_open) && defined(__NR_mq_open)
1358 static inline abi_long
copy_from_user_mq_attr(struct mq_attr
*attr
,
1359 abi_ulong target_mq_attr_addr
)
1361 struct target_mq_attr
*target_mq_attr
;
1363 if (!lock_user_struct(VERIFY_READ
, target_mq_attr
,
1364 target_mq_attr_addr
, 1))
1365 return -TARGET_EFAULT
;
1367 __get_user(attr
->mq_flags
, &target_mq_attr
->mq_flags
);
1368 __get_user(attr
->mq_maxmsg
, &target_mq_attr
->mq_maxmsg
);
1369 __get_user(attr
->mq_msgsize
, &target_mq_attr
->mq_msgsize
);
1370 __get_user(attr
->mq_curmsgs
, &target_mq_attr
->mq_curmsgs
);
1372 unlock_user_struct(target_mq_attr
, target_mq_attr_addr
, 0);
1377 static inline abi_long
copy_to_user_mq_attr(abi_ulong target_mq_attr_addr
,
1378 const struct mq_attr
*attr
)
1380 struct target_mq_attr
*target_mq_attr
;
1382 if (!lock_user_struct(VERIFY_WRITE
, target_mq_attr
,
1383 target_mq_attr_addr
, 0))
1384 return -TARGET_EFAULT
;
1386 __put_user(attr
->mq_flags
, &target_mq_attr
->mq_flags
);
1387 __put_user(attr
->mq_maxmsg
, &target_mq_attr
->mq_maxmsg
);
1388 __put_user(attr
->mq_msgsize
, &target_mq_attr
->mq_msgsize
);
1389 __put_user(attr
->mq_curmsgs
, &target_mq_attr
->mq_curmsgs
);
1391 unlock_user_struct(target_mq_attr
, target_mq_attr_addr
, 1);
1397 #if defined(TARGET_NR_select) || defined(TARGET_NR__newselect)
1398 /* do_select() must return target values and target errnos. */
1399 static abi_long
do_select(int n
,
1400 abi_ulong rfd_addr
, abi_ulong wfd_addr
,
1401 abi_ulong efd_addr
, abi_ulong target_tv_addr
)
1403 fd_set rfds
, wfds
, efds
;
1404 fd_set
*rfds_ptr
, *wfds_ptr
, *efds_ptr
;
1406 struct timespec ts
, *ts_ptr
;
1409 ret
= copy_from_user_fdset_ptr(&rfds
, &rfds_ptr
, rfd_addr
, n
);
1413 ret
= copy_from_user_fdset_ptr(&wfds
, &wfds_ptr
, wfd_addr
, n
);
1417 ret
= copy_from_user_fdset_ptr(&efds
, &efds_ptr
, efd_addr
, n
);
1422 if (target_tv_addr
) {
1423 if (copy_from_user_timeval(&tv
, target_tv_addr
))
1424 return -TARGET_EFAULT
;
1425 ts
.tv_sec
= tv
.tv_sec
;
1426 ts
.tv_nsec
= tv
.tv_usec
* 1000;
1432 ret
= get_errno(safe_pselect6(n
, rfds_ptr
, wfds_ptr
, efds_ptr
,
1435 if (!is_error(ret
)) {
1436 if (rfd_addr
&& copy_to_user_fdset(rfd_addr
, &rfds
, n
))
1437 return -TARGET_EFAULT
;
1438 if (wfd_addr
&& copy_to_user_fdset(wfd_addr
, &wfds
, n
))
1439 return -TARGET_EFAULT
;
1440 if (efd_addr
&& copy_to_user_fdset(efd_addr
, &efds
, n
))
1441 return -TARGET_EFAULT
;
1443 if (target_tv_addr
) {
1444 tv
.tv_sec
= ts
.tv_sec
;
1445 tv
.tv_usec
= ts
.tv_nsec
/ 1000;
1446 if (copy_to_user_timeval(target_tv_addr
, &tv
)) {
1447 return -TARGET_EFAULT
;
1455 #if defined(TARGET_WANT_OLD_SYS_SELECT)
1456 static abi_long
do_old_select(abi_ulong arg1
)
1458 struct target_sel_arg_struct
*sel
;
1459 abi_ulong inp
, outp
, exp
, tvp
;
1462 if (!lock_user_struct(VERIFY_READ
, sel
, arg1
, 1)) {
1463 return -TARGET_EFAULT
;
1466 nsel
= tswapal(sel
->n
);
1467 inp
= tswapal(sel
->inp
);
1468 outp
= tswapal(sel
->outp
);
1469 exp
= tswapal(sel
->exp
);
1470 tvp
= tswapal(sel
->tvp
);
1472 unlock_user_struct(sel
, arg1
, 0);
1474 return do_select(nsel
, inp
, outp
, exp
, tvp
);
1479 #if defined(TARGET_NR_pselect6) || defined(TARGET_NR_pselect6_time64)
1480 static abi_long
do_pselect6(abi_long arg1
, abi_long arg2
, abi_long arg3
,
1481 abi_long arg4
, abi_long arg5
, abi_long arg6
,
1484 abi_long rfd_addr
, wfd_addr
, efd_addr
, n
, ts_addr
;
1485 fd_set rfds
, wfds
, efds
;
1486 fd_set
*rfds_ptr
, *wfds_ptr
, *efds_ptr
;
1487 struct timespec ts
, *ts_ptr
;
1491 * The 6th arg is actually two args smashed together,
1492 * so we cannot use the C library.
1500 abi_ulong arg_sigset
, arg_sigsize
, *arg7
;
1501 target_sigset_t
*target_sigset
;
1509 ret
= copy_from_user_fdset_ptr(&rfds
, &rfds_ptr
, rfd_addr
, n
);
1513 ret
= copy_from_user_fdset_ptr(&wfds
, &wfds_ptr
, wfd_addr
, n
);
1517 ret
= copy_from_user_fdset_ptr(&efds
, &efds_ptr
, efd_addr
, n
);
1523 * This takes a timespec, and not a timeval, so we cannot
1524 * use the do_select() helper ...
1528 if (target_to_host_timespec64(&ts
, ts_addr
)) {
1529 return -TARGET_EFAULT
;
1532 if (target_to_host_timespec(&ts
, ts_addr
)) {
1533 return -TARGET_EFAULT
;
1541 /* Extract the two packed args for the sigset */
1544 sig
.size
= SIGSET_T_SIZE
;
1546 arg7
= lock_user(VERIFY_READ
, arg6
, sizeof(*arg7
) * 2, 1);
1548 return -TARGET_EFAULT
;
1550 arg_sigset
= tswapal(arg7
[0]);
1551 arg_sigsize
= tswapal(arg7
[1]);
1552 unlock_user(arg7
, arg6
, 0);
1556 if (arg_sigsize
!= sizeof(*target_sigset
)) {
1557 /* Like the kernel, we enforce correct size sigsets */
1558 return -TARGET_EINVAL
;
1560 target_sigset
= lock_user(VERIFY_READ
, arg_sigset
,
1561 sizeof(*target_sigset
), 1);
1562 if (!target_sigset
) {
1563 return -TARGET_EFAULT
;
1565 target_to_host_sigset(&set
, target_sigset
);
1566 unlock_user(target_sigset
, arg_sigset
, 0);
1574 ret
= get_errno(safe_pselect6(n
, rfds_ptr
, wfds_ptr
, efds_ptr
,
1577 if (!is_error(ret
)) {
1578 if (rfd_addr
&& copy_to_user_fdset(rfd_addr
, &rfds
, n
)) {
1579 return -TARGET_EFAULT
;
1581 if (wfd_addr
&& copy_to_user_fdset(wfd_addr
, &wfds
, n
)) {
1582 return -TARGET_EFAULT
;
1584 if (efd_addr
&& copy_to_user_fdset(efd_addr
, &efds
, n
)) {
1585 return -TARGET_EFAULT
;
1588 if (ts_addr
&& host_to_target_timespec64(ts_addr
, &ts
)) {
1589 return -TARGET_EFAULT
;
1592 if (ts_addr
&& host_to_target_timespec(ts_addr
, &ts
)) {
1593 return -TARGET_EFAULT
;
1601 #if defined(TARGET_NR_poll) || defined(TARGET_NR_ppoll) || \
1602 defined(TARGET_NR_ppoll_time64)
1603 static abi_long
do_ppoll(abi_long arg1
, abi_long arg2
, abi_long arg3
,
1604 abi_long arg4
, abi_long arg5
, bool ppoll
, bool time64
)
1606 struct target_pollfd
*target_pfd
;
1607 unsigned int nfds
= arg2
;
1615 if (nfds
> (INT_MAX
/ sizeof(struct target_pollfd
))) {
1616 return -TARGET_EINVAL
;
1618 target_pfd
= lock_user(VERIFY_WRITE
, arg1
,
1619 sizeof(struct target_pollfd
) * nfds
, 1);
1621 return -TARGET_EFAULT
;
1624 pfd
= alloca(sizeof(struct pollfd
) * nfds
);
1625 for (i
= 0; i
< nfds
; i
++) {
1626 pfd
[i
].fd
= tswap32(target_pfd
[i
].fd
);
1627 pfd
[i
].events
= tswap16(target_pfd
[i
].events
);
1631 struct timespec _timeout_ts
, *timeout_ts
= &_timeout_ts
;
1632 target_sigset_t
*target_set
;
1633 sigset_t _set
, *set
= &_set
;
1637 if (target_to_host_timespec64(timeout_ts
, arg3
)) {
1638 unlock_user(target_pfd
, arg1
, 0);
1639 return -TARGET_EFAULT
;
1642 if (target_to_host_timespec(timeout_ts
, arg3
)) {
1643 unlock_user(target_pfd
, arg1
, 0);
1644 return -TARGET_EFAULT
;
1652 if (arg5
!= sizeof(target_sigset_t
)) {
1653 unlock_user(target_pfd
, arg1
, 0);
1654 return -TARGET_EINVAL
;
1657 target_set
= lock_user(VERIFY_READ
, arg4
,
1658 sizeof(target_sigset_t
), 1);
1660 unlock_user(target_pfd
, arg1
, 0);
1661 return -TARGET_EFAULT
;
1663 target_to_host_sigset(set
, target_set
);
1668 ret
= get_errno(safe_ppoll(pfd
, nfds
, timeout_ts
,
1669 set
, SIGSET_T_SIZE
));
1671 if (!is_error(ret
) && arg3
) {
1673 if (host_to_target_timespec64(arg3
, timeout_ts
)) {
1674 return -TARGET_EFAULT
;
1677 if (host_to_target_timespec(arg3
, timeout_ts
)) {
1678 return -TARGET_EFAULT
;
1683 unlock_user(target_set
, arg4
, 0);
1686 struct timespec ts
, *pts
;
1689 /* Convert ms to secs, ns */
1690 ts
.tv_sec
= arg3
/ 1000;
1691 ts
.tv_nsec
= (arg3
% 1000) * 1000000LL;
1694 /* -ve poll() timeout means "infinite" */
1697 ret
= get_errno(safe_ppoll(pfd
, nfds
, pts
, NULL
, 0));
1700 if (!is_error(ret
)) {
1701 for (i
= 0; i
< nfds
; i
++) {
1702 target_pfd
[i
].revents
= tswap16(pfd
[i
].revents
);
1705 unlock_user(target_pfd
, arg1
, sizeof(struct target_pollfd
) * nfds
);
1710 static abi_long
do_pipe2(int host_pipe
[], int flags
)
1713 return pipe2(host_pipe
, flags
);
1719 static abi_long
do_pipe(void *cpu_env
, abi_ulong pipedes
,
1720 int flags
, int is_pipe2
)
1724 ret
= flags
? do_pipe2(host_pipe
, flags
) : pipe(host_pipe
);
1727 return get_errno(ret
);
1729 /* Several targets have special calling conventions for the original
1730 pipe syscall, but didn't replicate this into the pipe2 syscall. */
1732 #if defined(TARGET_ALPHA)
1733 ((CPUAlphaState
*)cpu_env
)->ir
[IR_A4
] = host_pipe
[1];
1734 return host_pipe
[0];
1735 #elif defined(TARGET_MIPS)
1736 ((CPUMIPSState
*)cpu_env
)->active_tc
.gpr
[3] = host_pipe
[1];
1737 return host_pipe
[0];
1738 #elif defined(TARGET_SH4)
1739 ((CPUSH4State
*)cpu_env
)->gregs
[1] = host_pipe
[1];
1740 return host_pipe
[0];
1741 #elif defined(TARGET_SPARC)
1742 ((CPUSPARCState
*)cpu_env
)->regwptr
[1] = host_pipe
[1];
1743 return host_pipe
[0];
1747 if (put_user_s32(host_pipe
[0], pipedes
)
1748 || put_user_s32(host_pipe
[1], pipedes
+ sizeof(host_pipe
[0])))
1749 return -TARGET_EFAULT
;
1750 return get_errno(ret
);
1753 static inline abi_long
target_to_host_ip_mreq(struct ip_mreqn
*mreqn
,
1754 abi_ulong target_addr
,
1757 struct target_ip_mreqn
*target_smreqn
;
1759 target_smreqn
= lock_user(VERIFY_READ
, target_addr
, len
, 1);
1761 return -TARGET_EFAULT
;
1762 mreqn
->imr_multiaddr
.s_addr
= target_smreqn
->imr_multiaddr
.s_addr
;
1763 mreqn
->imr_address
.s_addr
= target_smreqn
->imr_address
.s_addr
;
1764 if (len
== sizeof(struct target_ip_mreqn
))
1765 mreqn
->imr_ifindex
= tswapal(target_smreqn
->imr_ifindex
);
1766 unlock_user(target_smreqn
, target_addr
, 0);
1771 static inline abi_long
target_to_host_sockaddr(int fd
, struct sockaddr
*addr
,
1772 abi_ulong target_addr
,
1775 const socklen_t unix_maxlen
= sizeof (struct sockaddr_un
);
1776 sa_family_t sa_family
;
1777 struct target_sockaddr
*target_saddr
;
1779 if (fd_trans_target_to_host_addr(fd
)) {
1780 return fd_trans_target_to_host_addr(fd
)(addr
, target_addr
, len
);
1783 target_saddr
= lock_user(VERIFY_READ
, target_addr
, len
, 1);
1785 return -TARGET_EFAULT
;
1787 sa_family
= tswap16(target_saddr
->sa_family
);
1789 /* Oops. The caller might send a incomplete sun_path; sun_path
1790 * must be terminated by \0 (see the manual page), but
1791 * unfortunately it is quite common to specify sockaddr_un
1792 * length as "strlen(x->sun_path)" while it should be
1793 * "strlen(...) + 1". We'll fix that here if needed.
1794 * Linux kernel has a similar feature.
1797 if (sa_family
== AF_UNIX
) {
1798 if (len
< unix_maxlen
&& len
> 0) {
1799 char *cp
= (char*)target_saddr
;
1801 if ( cp
[len
-1] && !cp
[len
] )
1804 if (len
> unix_maxlen
)
1808 memcpy(addr
, target_saddr
, len
);
1809 addr
->sa_family
= sa_family
;
1810 if (sa_family
== AF_NETLINK
) {
1811 struct sockaddr_nl
*nladdr
;
1813 nladdr
= (struct sockaddr_nl
*)addr
;
1814 nladdr
->nl_pid
= tswap32(nladdr
->nl_pid
);
1815 nladdr
->nl_groups
= tswap32(nladdr
->nl_groups
);
1816 } else if (sa_family
== AF_PACKET
) {
1817 struct target_sockaddr_ll
*lladdr
;
1819 lladdr
= (struct target_sockaddr_ll
*)addr
;
1820 lladdr
->sll_ifindex
= tswap32(lladdr
->sll_ifindex
);
1821 lladdr
->sll_hatype
= tswap16(lladdr
->sll_hatype
);
1823 unlock_user(target_saddr
, target_addr
, 0);
1828 static inline abi_long
host_to_target_sockaddr(abi_ulong target_addr
,
1829 struct sockaddr
*addr
,
1832 struct target_sockaddr
*target_saddr
;
1839 target_saddr
= lock_user(VERIFY_WRITE
, target_addr
, len
, 0);
1841 return -TARGET_EFAULT
;
1842 memcpy(target_saddr
, addr
, len
);
1843 if (len
>= offsetof(struct target_sockaddr
, sa_family
) +
1844 sizeof(target_saddr
->sa_family
)) {
1845 target_saddr
->sa_family
= tswap16(addr
->sa_family
);
1847 if (addr
->sa_family
== AF_NETLINK
&&
1848 len
>= sizeof(struct target_sockaddr_nl
)) {
1849 struct target_sockaddr_nl
*target_nl
=
1850 (struct target_sockaddr_nl
*)target_saddr
;
1851 target_nl
->nl_pid
= tswap32(target_nl
->nl_pid
);
1852 target_nl
->nl_groups
= tswap32(target_nl
->nl_groups
);
1853 } else if (addr
->sa_family
== AF_PACKET
) {
1854 struct sockaddr_ll
*target_ll
= (struct sockaddr_ll
*)target_saddr
;
1855 target_ll
->sll_ifindex
= tswap32(target_ll
->sll_ifindex
);
1856 target_ll
->sll_hatype
= tswap16(target_ll
->sll_hatype
);
1857 } else if (addr
->sa_family
== AF_INET6
&&
1858 len
>= sizeof(struct target_sockaddr_in6
)) {
1859 struct target_sockaddr_in6
*target_in6
=
1860 (struct target_sockaddr_in6
*)target_saddr
;
1861 target_in6
->sin6_scope_id
= tswap16(target_in6
->sin6_scope_id
);
1863 unlock_user(target_saddr
, target_addr
, len
);
1868 static inline abi_long
target_to_host_cmsg(struct msghdr
*msgh
,
1869 struct target_msghdr
*target_msgh
)
1871 struct cmsghdr
*cmsg
= CMSG_FIRSTHDR(msgh
);
1872 abi_long msg_controllen
;
1873 abi_ulong target_cmsg_addr
;
1874 struct target_cmsghdr
*target_cmsg
, *target_cmsg_start
;
1875 socklen_t space
= 0;
1877 msg_controllen
= tswapal(target_msgh
->msg_controllen
);
1878 if (msg_controllen
< sizeof (struct target_cmsghdr
))
1880 target_cmsg_addr
= tswapal(target_msgh
->msg_control
);
1881 target_cmsg
= lock_user(VERIFY_READ
, target_cmsg_addr
, msg_controllen
, 1);
1882 target_cmsg_start
= target_cmsg
;
1884 return -TARGET_EFAULT
;
1886 while (cmsg
&& target_cmsg
) {
1887 void *data
= CMSG_DATA(cmsg
);
1888 void *target_data
= TARGET_CMSG_DATA(target_cmsg
);
1890 int len
= tswapal(target_cmsg
->cmsg_len
)
1891 - sizeof(struct target_cmsghdr
);
1893 space
+= CMSG_SPACE(len
);
1894 if (space
> msgh
->msg_controllen
) {
1895 space
-= CMSG_SPACE(len
);
1896 /* This is a QEMU bug, since we allocated the payload
1897 * area ourselves (unlike overflow in host-to-target
1898 * conversion, which is just the guest giving us a buffer
1899 * that's too small). It can't happen for the payload types
1900 * we currently support; if it becomes an issue in future
1901 * we would need to improve our allocation strategy to
1902 * something more intelligent than "twice the size of the
1903 * target buffer we're reading from".
1905 qemu_log_mask(LOG_UNIMP
,
1906 ("Unsupported ancillary data %d/%d: "
1907 "unhandled msg size\n"),
1908 tswap32(target_cmsg
->cmsg_level
),
1909 tswap32(target_cmsg
->cmsg_type
));
1913 if (tswap32(target_cmsg
->cmsg_level
) == TARGET_SOL_SOCKET
) {
1914 cmsg
->cmsg_level
= SOL_SOCKET
;
1916 cmsg
->cmsg_level
= tswap32(target_cmsg
->cmsg_level
);
1918 cmsg
->cmsg_type
= tswap32(target_cmsg
->cmsg_type
);
1919 cmsg
->cmsg_len
= CMSG_LEN(len
);
1921 if (cmsg
->cmsg_level
== SOL_SOCKET
&& cmsg
->cmsg_type
== SCM_RIGHTS
) {
1922 int *fd
= (int *)data
;
1923 int *target_fd
= (int *)target_data
;
1924 int i
, numfds
= len
/ sizeof(int);
1926 for (i
= 0; i
< numfds
; i
++) {
1927 __get_user(fd
[i
], target_fd
+ i
);
1929 } else if (cmsg
->cmsg_level
== SOL_SOCKET
1930 && cmsg
->cmsg_type
== SCM_CREDENTIALS
) {
1931 struct ucred
*cred
= (struct ucred
*)data
;
1932 struct target_ucred
*target_cred
=
1933 (struct target_ucred
*)target_data
;
1935 __get_user(cred
->pid
, &target_cred
->pid
);
1936 __get_user(cred
->uid
, &target_cred
->uid
);
1937 __get_user(cred
->gid
, &target_cred
->gid
);
1939 qemu_log_mask(LOG_UNIMP
, "Unsupported ancillary data: %d/%d\n",
1940 cmsg
->cmsg_level
, cmsg
->cmsg_type
);
1941 memcpy(data
, target_data
, len
);
1944 cmsg
= CMSG_NXTHDR(msgh
, cmsg
);
1945 target_cmsg
= TARGET_CMSG_NXTHDR(target_msgh
, target_cmsg
,
1948 unlock_user(target_cmsg
, target_cmsg_addr
, 0);
1950 msgh
->msg_controllen
= space
;
1954 static inline abi_long
host_to_target_cmsg(struct target_msghdr
*target_msgh
,
1955 struct msghdr
*msgh
)
1957 struct cmsghdr
*cmsg
= CMSG_FIRSTHDR(msgh
);
1958 abi_long msg_controllen
;
1959 abi_ulong target_cmsg_addr
;
1960 struct target_cmsghdr
*target_cmsg
, *target_cmsg_start
;
1961 socklen_t space
= 0;
1963 msg_controllen
= tswapal(target_msgh
->msg_controllen
);
1964 if (msg_controllen
< sizeof (struct target_cmsghdr
))
1966 target_cmsg_addr
= tswapal(target_msgh
->msg_control
);
1967 target_cmsg
= lock_user(VERIFY_WRITE
, target_cmsg_addr
, msg_controllen
, 0);
1968 target_cmsg_start
= target_cmsg
;
1970 return -TARGET_EFAULT
;
1972 while (cmsg
&& target_cmsg
) {
1973 void *data
= CMSG_DATA(cmsg
);
1974 void *target_data
= TARGET_CMSG_DATA(target_cmsg
);
1976 int len
= cmsg
->cmsg_len
- sizeof(struct cmsghdr
);
1977 int tgt_len
, tgt_space
;
1979 /* We never copy a half-header but may copy half-data;
1980 * this is Linux's behaviour in put_cmsg(). Note that
1981 * truncation here is a guest problem (which we report
1982 * to the guest via the CTRUNC bit), unlike truncation
1983 * in target_to_host_cmsg, which is a QEMU bug.
1985 if (msg_controllen
< sizeof(struct target_cmsghdr
)) {
1986 target_msgh
->msg_flags
|= tswap32(MSG_CTRUNC
);
1990 if (cmsg
->cmsg_level
== SOL_SOCKET
) {
1991 target_cmsg
->cmsg_level
= tswap32(TARGET_SOL_SOCKET
);
1993 target_cmsg
->cmsg_level
= tswap32(cmsg
->cmsg_level
);
1995 target_cmsg
->cmsg_type
= tswap32(cmsg
->cmsg_type
);
1997 /* Payload types which need a different size of payload on
1998 * the target must adjust tgt_len here.
2001 switch (cmsg
->cmsg_level
) {
2003 switch (cmsg
->cmsg_type
) {
2005 tgt_len
= sizeof(struct target_timeval
);
2015 if (msg_controllen
< TARGET_CMSG_LEN(tgt_len
)) {
2016 target_msgh
->msg_flags
|= tswap32(MSG_CTRUNC
);
2017 tgt_len
= msg_controllen
- sizeof(struct target_cmsghdr
);
2020 /* We must now copy-and-convert len bytes of payload
2021 * into tgt_len bytes of destination space. Bear in mind
2022 * that in both source and destination we may be dealing
2023 * with a truncated value!
2025 switch (cmsg
->cmsg_level
) {
2027 switch (cmsg
->cmsg_type
) {
2030 int *fd
= (int *)data
;
2031 int *target_fd
= (int *)target_data
;
2032 int i
, numfds
= tgt_len
/ sizeof(int);
2034 for (i
= 0; i
< numfds
; i
++) {
2035 __put_user(fd
[i
], target_fd
+ i
);
2041 struct timeval
*tv
= (struct timeval
*)data
;
2042 struct target_timeval
*target_tv
=
2043 (struct target_timeval
*)target_data
;
2045 if (len
!= sizeof(struct timeval
) ||
2046 tgt_len
!= sizeof(struct target_timeval
)) {
2050 /* copy struct timeval to target */
2051 __put_user(tv
->tv_sec
, &target_tv
->tv_sec
);
2052 __put_user(tv
->tv_usec
, &target_tv
->tv_usec
);
2055 case SCM_CREDENTIALS
:
2057 struct ucred
*cred
= (struct ucred
*)data
;
2058 struct target_ucred
*target_cred
=
2059 (struct target_ucred
*)target_data
;
2061 __put_user(cred
->pid
, &target_cred
->pid
);
2062 __put_user(cred
->uid
, &target_cred
->uid
);
2063 __put_user(cred
->gid
, &target_cred
->gid
);
2072 switch (cmsg
->cmsg_type
) {
2075 uint32_t *v
= (uint32_t *)data
;
2076 uint32_t *t_int
= (uint32_t *)target_data
;
2078 if (len
!= sizeof(uint32_t) ||
2079 tgt_len
!= sizeof(uint32_t)) {
2082 __put_user(*v
, t_int
);
2088 struct sock_extended_err ee
;
2089 struct sockaddr_in offender
;
2091 struct errhdr_t
*errh
= (struct errhdr_t
*)data
;
2092 struct errhdr_t
*target_errh
=
2093 (struct errhdr_t
*)target_data
;
2095 if (len
!= sizeof(struct errhdr_t
) ||
2096 tgt_len
!= sizeof(struct errhdr_t
)) {
2099 __put_user(errh
->ee
.ee_errno
, &target_errh
->ee
.ee_errno
);
2100 __put_user(errh
->ee
.ee_origin
, &target_errh
->ee
.ee_origin
);
2101 __put_user(errh
->ee
.ee_type
, &target_errh
->ee
.ee_type
);
2102 __put_user(errh
->ee
.ee_code
, &target_errh
->ee
.ee_code
);
2103 __put_user(errh
->ee
.ee_pad
, &target_errh
->ee
.ee_pad
);
2104 __put_user(errh
->ee
.ee_info
, &target_errh
->ee
.ee_info
);
2105 __put_user(errh
->ee
.ee_data
, &target_errh
->ee
.ee_data
);
2106 host_to_target_sockaddr((unsigned long) &target_errh
->offender
,
2107 (void *) &errh
->offender
, sizeof(errh
->offender
));
2116 switch (cmsg
->cmsg_type
) {
2119 uint32_t *v
= (uint32_t *)data
;
2120 uint32_t *t_int
= (uint32_t *)target_data
;
2122 if (len
!= sizeof(uint32_t) ||
2123 tgt_len
!= sizeof(uint32_t)) {
2126 __put_user(*v
, t_int
);
2132 struct sock_extended_err ee
;
2133 struct sockaddr_in6 offender
;
2135 struct errhdr6_t
*errh
= (struct errhdr6_t
*)data
;
2136 struct errhdr6_t
*target_errh
=
2137 (struct errhdr6_t
*)target_data
;
2139 if (len
!= sizeof(struct errhdr6_t
) ||
2140 tgt_len
!= sizeof(struct errhdr6_t
)) {
2143 __put_user(errh
->ee
.ee_errno
, &target_errh
->ee
.ee_errno
);
2144 __put_user(errh
->ee
.ee_origin
, &target_errh
->ee
.ee_origin
);
2145 __put_user(errh
->ee
.ee_type
, &target_errh
->ee
.ee_type
);
2146 __put_user(errh
->ee
.ee_code
, &target_errh
->ee
.ee_code
);
2147 __put_user(errh
->ee
.ee_pad
, &target_errh
->ee
.ee_pad
);
2148 __put_user(errh
->ee
.ee_info
, &target_errh
->ee
.ee_info
);
2149 __put_user(errh
->ee
.ee_data
, &target_errh
->ee
.ee_data
);
2150 host_to_target_sockaddr((unsigned long) &target_errh
->offender
,
2151 (void *) &errh
->offender
, sizeof(errh
->offender
));
2161 qemu_log_mask(LOG_UNIMP
, "Unsupported ancillary data: %d/%d\n",
2162 cmsg
->cmsg_level
, cmsg
->cmsg_type
);
2163 memcpy(target_data
, data
, MIN(len
, tgt_len
));
2164 if (tgt_len
> len
) {
2165 memset(target_data
+ len
, 0, tgt_len
- len
);
2169 target_cmsg
->cmsg_len
= tswapal(TARGET_CMSG_LEN(tgt_len
));
2170 tgt_space
= TARGET_CMSG_SPACE(tgt_len
);
2171 if (msg_controllen
< tgt_space
) {
2172 tgt_space
= msg_controllen
;
2174 msg_controllen
-= tgt_space
;
2176 cmsg
= CMSG_NXTHDR(msgh
, cmsg
);
2177 target_cmsg
= TARGET_CMSG_NXTHDR(target_msgh
, target_cmsg
,
2180 unlock_user(target_cmsg
, target_cmsg_addr
, space
);
2182 target_msgh
->msg_controllen
= tswapal(space
);
2186 /* do_setsockopt() Must return target values and target errnos. */
2187 static abi_long
do_setsockopt(int sockfd
, int level
, int optname
,
2188 abi_ulong optval_addr
, socklen_t optlen
)
2192 struct ip_mreqn
*ip_mreq
;
2193 struct ip_mreq_source
*ip_mreq_source
;
2198 /* TCP and UDP options all take an 'int' value. */
2199 if (optlen
< sizeof(uint32_t))
2200 return -TARGET_EINVAL
;
2202 if (get_user_u32(val
, optval_addr
))
2203 return -TARGET_EFAULT
;
2204 ret
= get_errno(setsockopt(sockfd
, level
, optname
, &val
, sizeof(val
)));
2211 case IP_ROUTER_ALERT
:
2215 case IP_MTU_DISCOVER
:
2222 case IP_MULTICAST_TTL
:
2223 case IP_MULTICAST_LOOP
:
2225 if (optlen
>= sizeof(uint32_t)) {
2226 if (get_user_u32(val
, optval_addr
))
2227 return -TARGET_EFAULT
;
2228 } else if (optlen
>= 1) {
2229 if (get_user_u8(val
, optval_addr
))
2230 return -TARGET_EFAULT
;
2232 ret
= get_errno(setsockopt(sockfd
, level
, optname
, &val
, sizeof(val
)));
2234 case IP_ADD_MEMBERSHIP
:
2235 case IP_DROP_MEMBERSHIP
:
2236 if (optlen
< sizeof (struct target_ip_mreq
) ||
2237 optlen
> sizeof (struct target_ip_mreqn
))
2238 return -TARGET_EINVAL
;
2240 ip_mreq
= (struct ip_mreqn
*) alloca(optlen
);
2241 target_to_host_ip_mreq(ip_mreq
, optval_addr
, optlen
);
2242 ret
= get_errno(setsockopt(sockfd
, level
, optname
, ip_mreq
, optlen
));
2245 case IP_BLOCK_SOURCE
:
2246 case IP_UNBLOCK_SOURCE
:
2247 case IP_ADD_SOURCE_MEMBERSHIP
:
2248 case IP_DROP_SOURCE_MEMBERSHIP
:
2249 if (optlen
!= sizeof (struct target_ip_mreq_source
))
2250 return -TARGET_EINVAL
;
2252 ip_mreq_source
= lock_user(VERIFY_READ
, optval_addr
, optlen
, 1);
2253 ret
= get_errno(setsockopt(sockfd
, level
, optname
, ip_mreq_source
, optlen
));
2254 unlock_user (ip_mreq_source
, optval_addr
, 0);
2263 case IPV6_MTU_DISCOVER
:
2266 case IPV6_RECVPKTINFO
:
2267 case IPV6_UNICAST_HOPS
:
2268 case IPV6_MULTICAST_HOPS
:
2269 case IPV6_MULTICAST_LOOP
:
2271 case IPV6_RECVHOPLIMIT
:
2272 case IPV6_2292HOPLIMIT
:
2275 case IPV6_2292PKTINFO
:
2276 case IPV6_RECVTCLASS
:
2277 case IPV6_RECVRTHDR
:
2278 case IPV6_2292RTHDR
:
2279 case IPV6_RECVHOPOPTS
:
2280 case IPV6_2292HOPOPTS
:
2281 case IPV6_RECVDSTOPTS
:
2282 case IPV6_2292DSTOPTS
:
2284 case IPV6_ADDR_PREFERENCES
:
2285 #ifdef IPV6_RECVPATHMTU
2286 case IPV6_RECVPATHMTU
:
2288 #ifdef IPV6_TRANSPARENT
2289 case IPV6_TRANSPARENT
:
2291 #ifdef IPV6_FREEBIND
2294 #ifdef IPV6_RECVORIGDSTADDR
2295 case IPV6_RECVORIGDSTADDR
:
2298 if (optlen
< sizeof(uint32_t)) {
2299 return -TARGET_EINVAL
;
2301 if (get_user_u32(val
, optval_addr
)) {
2302 return -TARGET_EFAULT
;
2304 ret
= get_errno(setsockopt(sockfd
, level
, optname
,
2305 &val
, sizeof(val
)));
2309 struct in6_pktinfo pki
;
2311 if (optlen
< sizeof(pki
)) {
2312 return -TARGET_EINVAL
;
2315 if (copy_from_user(&pki
, optval_addr
, sizeof(pki
))) {
2316 return -TARGET_EFAULT
;
2319 pki
.ipi6_ifindex
= tswap32(pki
.ipi6_ifindex
);
2321 ret
= get_errno(setsockopt(sockfd
, level
, optname
,
2322 &pki
, sizeof(pki
)));
2325 case IPV6_ADD_MEMBERSHIP
:
2326 case IPV6_DROP_MEMBERSHIP
:
2328 struct ipv6_mreq ipv6mreq
;
2330 if (optlen
< sizeof(ipv6mreq
)) {
2331 return -TARGET_EINVAL
;
2334 if (copy_from_user(&ipv6mreq
, optval_addr
, sizeof(ipv6mreq
))) {
2335 return -TARGET_EFAULT
;
2338 ipv6mreq
.ipv6mr_interface
= tswap32(ipv6mreq
.ipv6mr_interface
);
2340 ret
= get_errno(setsockopt(sockfd
, level
, optname
,
2341 &ipv6mreq
, sizeof(ipv6mreq
)));
2352 struct icmp6_filter icmp6f
;
2354 if (optlen
> sizeof(icmp6f
)) {
2355 optlen
= sizeof(icmp6f
);
2358 if (copy_from_user(&icmp6f
, optval_addr
, optlen
)) {
2359 return -TARGET_EFAULT
;
2362 for (val
= 0; val
< 8; val
++) {
2363 icmp6f
.data
[val
] = tswap32(icmp6f
.data
[val
]);
2366 ret
= get_errno(setsockopt(sockfd
, level
, optname
,
2378 /* those take an u32 value */
2379 if (optlen
< sizeof(uint32_t)) {
2380 return -TARGET_EINVAL
;
2383 if (get_user_u32(val
, optval_addr
)) {
2384 return -TARGET_EFAULT
;
2386 ret
= get_errno(setsockopt(sockfd
, level
, optname
,
2387 &val
, sizeof(val
)));
2394 #if defined(SOL_ALG) && defined(ALG_SET_KEY) && defined(ALG_SET_AEAD_AUTHSIZE)
2399 char *alg_key
= g_malloc(optlen
);
2402 return -TARGET_ENOMEM
;
2404 if (copy_from_user(alg_key
, optval_addr
, optlen
)) {
2406 return -TARGET_EFAULT
;
2408 ret
= get_errno(setsockopt(sockfd
, level
, optname
,
2413 case ALG_SET_AEAD_AUTHSIZE
:
2415 ret
= get_errno(setsockopt(sockfd
, level
, optname
,
2424 case TARGET_SOL_SOCKET
:
2426 case TARGET_SO_RCVTIMEO
:
2430 optname
= SO_RCVTIMEO
;
2433 if (optlen
!= sizeof(struct target_timeval
)) {
2434 return -TARGET_EINVAL
;
2437 if (copy_from_user_timeval(&tv
, optval_addr
)) {
2438 return -TARGET_EFAULT
;
2441 ret
= get_errno(setsockopt(sockfd
, SOL_SOCKET
, optname
,
2445 case TARGET_SO_SNDTIMEO
:
2446 optname
= SO_SNDTIMEO
;
2448 case TARGET_SO_ATTACH_FILTER
:
2450 struct target_sock_fprog
*tfprog
;
2451 struct target_sock_filter
*tfilter
;
2452 struct sock_fprog fprog
;
2453 struct sock_filter
*filter
;
2456 if (optlen
!= sizeof(*tfprog
)) {
2457 return -TARGET_EINVAL
;
2459 if (!lock_user_struct(VERIFY_READ
, tfprog
, optval_addr
, 0)) {
2460 return -TARGET_EFAULT
;
2462 if (!lock_user_struct(VERIFY_READ
, tfilter
,
2463 tswapal(tfprog
->filter
), 0)) {
2464 unlock_user_struct(tfprog
, optval_addr
, 1);
2465 return -TARGET_EFAULT
;
2468 fprog
.len
= tswap16(tfprog
->len
);
2469 filter
= g_try_new(struct sock_filter
, fprog
.len
);
2470 if (filter
== NULL
) {
2471 unlock_user_struct(tfilter
, tfprog
->filter
, 1);
2472 unlock_user_struct(tfprog
, optval_addr
, 1);
2473 return -TARGET_ENOMEM
;
2475 for (i
= 0; i
< fprog
.len
; i
++) {
2476 filter
[i
].code
= tswap16(tfilter
[i
].code
);
2477 filter
[i
].jt
= tfilter
[i
].jt
;
2478 filter
[i
].jf
= tfilter
[i
].jf
;
2479 filter
[i
].k
= tswap32(tfilter
[i
].k
);
2481 fprog
.filter
= filter
;
2483 ret
= get_errno(setsockopt(sockfd
, SOL_SOCKET
,
2484 SO_ATTACH_FILTER
, &fprog
, sizeof(fprog
)));
2487 unlock_user_struct(tfilter
, tfprog
->filter
, 1);
2488 unlock_user_struct(tfprog
, optval_addr
, 1);
2491 case TARGET_SO_BINDTODEVICE
:
2493 char *dev_ifname
, *addr_ifname
;
2495 if (optlen
> IFNAMSIZ
- 1) {
2496 optlen
= IFNAMSIZ
- 1;
2498 dev_ifname
= lock_user(VERIFY_READ
, optval_addr
, optlen
, 1);
2500 return -TARGET_EFAULT
;
2502 optname
= SO_BINDTODEVICE
;
2503 addr_ifname
= alloca(IFNAMSIZ
);
2504 memcpy(addr_ifname
, dev_ifname
, optlen
);
2505 addr_ifname
[optlen
] = 0;
2506 ret
= get_errno(setsockopt(sockfd
, SOL_SOCKET
, optname
,
2507 addr_ifname
, optlen
));
2508 unlock_user (dev_ifname
, optval_addr
, 0);
2511 case TARGET_SO_LINGER
:
2514 struct target_linger
*tlg
;
2516 if (optlen
!= sizeof(struct target_linger
)) {
2517 return -TARGET_EINVAL
;
2519 if (!lock_user_struct(VERIFY_READ
, tlg
, optval_addr
, 1)) {
2520 return -TARGET_EFAULT
;
2522 __get_user(lg
.l_onoff
, &tlg
->l_onoff
);
2523 __get_user(lg
.l_linger
, &tlg
->l_linger
);
2524 ret
= get_errno(setsockopt(sockfd
, SOL_SOCKET
, SO_LINGER
,
2526 unlock_user_struct(tlg
, optval_addr
, 0);
2529 /* Options with 'int' argument. */
2530 case TARGET_SO_DEBUG
:
2533 case TARGET_SO_REUSEADDR
:
2534 optname
= SO_REUSEADDR
;
2537 case TARGET_SO_REUSEPORT
:
2538 optname
= SO_REUSEPORT
;
2541 case TARGET_SO_TYPE
:
2544 case TARGET_SO_ERROR
:
2547 case TARGET_SO_DONTROUTE
:
2548 optname
= SO_DONTROUTE
;
2550 case TARGET_SO_BROADCAST
:
2551 optname
= SO_BROADCAST
;
2553 case TARGET_SO_SNDBUF
:
2554 optname
= SO_SNDBUF
;
2556 case TARGET_SO_SNDBUFFORCE
:
2557 optname
= SO_SNDBUFFORCE
;
2559 case TARGET_SO_RCVBUF
:
2560 optname
= SO_RCVBUF
;
2562 case TARGET_SO_RCVBUFFORCE
:
2563 optname
= SO_RCVBUFFORCE
;
2565 case TARGET_SO_KEEPALIVE
:
2566 optname
= SO_KEEPALIVE
;
2568 case TARGET_SO_OOBINLINE
:
2569 optname
= SO_OOBINLINE
;
2571 case TARGET_SO_NO_CHECK
:
2572 optname
= SO_NO_CHECK
;
2574 case TARGET_SO_PRIORITY
:
2575 optname
= SO_PRIORITY
;
2578 case TARGET_SO_BSDCOMPAT
:
2579 optname
= SO_BSDCOMPAT
;
2582 case TARGET_SO_PASSCRED
:
2583 optname
= SO_PASSCRED
;
2585 case TARGET_SO_PASSSEC
:
2586 optname
= SO_PASSSEC
;
2588 case TARGET_SO_TIMESTAMP
:
2589 optname
= SO_TIMESTAMP
;
2591 case TARGET_SO_RCVLOWAT
:
2592 optname
= SO_RCVLOWAT
;
2597 if (optlen
< sizeof(uint32_t))
2598 return -TARGET_EINVAL
;
2600 if (get_user_u32(val
, optval_addr
))
2601 return -TARGET_EFAULT
;
2602 ret
= get_errno(setsockopt(sockfd
, SOL_SOCKET
, optname
, &val
, sizeof(val
)));
2607 case NETLINK_PKTINFO
:
2608 case NETLINK_ADD_MEMBERSHIP
:
2609 case NETLINK_DROP_MEMBERSHIP
:
2610 case NETLINK_BROADCAST_ERROR
:
2611 case NETLINK_NO_ENOBUFS
:
2612 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)
2613 case NETLINK_LISTEN_ALL_NSID
:
2614 case NETLINK_CAP_ACK
:
2615 #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0) */
2616 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0)
2617 case NETLINK_EXT_ACK
:
2618 #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) */
2619 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 20, 0)
2620 case NETLINK_GET_STRICT_CHK
:
2621 #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) */
2627 if (optlen
< sizeof(uint32_t)) {
2628 return -TARGET_EINVAL
;
2630 if (get_user_u32(val
, optval_addr
)) {
2631 return -TARGET_EFAULT
;
2633 ret
= get_errno(setsockopt(sockfd
, SOL_NETLINK
, optname
, &val
,
2636 #endif /* SOL_NETLINK */
2639 qemu_log_mask(LOG_UNIMP
, "Unsupported setsockopt level=%d optname=%d\n",
2641 ret
= -TARGET_ENOPROTOOPT
;
2646 /* do_getsockopt() Must return target values and target errnos. */
2647 static abi_long
do_getsockopt(int sockfd
, int level
, int optname
,
2648 abi_ulong optval_addr
, abi_ulong optlen
)
2655 case TARGET_SOL_SOCKET
:
2658 /* These don't just return a single integer */
2659 case TARGET_SO_PEERNAME
:
2661 case TARGET_SO_RCVTIMEO
: {
2665 optname
= SO_RCVTIMEO
;
2668 if (get_user_u32(len
, optlen
)) {
2669 return -TARGET_EFAULT
;
2672 return -TARGET_EINVAL
;
2676 ret
= get_errno(getsockopt(sockfd
, level
, optname
,
2681 if (len
> sizeof(struct target_timeval
)) {
2682 len
= sizeof(struct target_timeval
);
2684 if (copy_to_user_timeval(optval_addr
, &tv
)) {
2685 return -TARGET_EFAULT
;
2687 if (put_user_u32(len
, optlen
)) {
2688 return -TARGET_EFAULT
;
2692 case TARGET_SO_SNDTIMEO
:
2693 optname
= SO_SNDTIMEO
;
2695 case TARGET_SO_PEERCRED
: {
2698 struct target_ucred
*tcr
;
2700 if (get_user_u32(len
, optlen
)) {
2701 return -TARGET_EFAULT
;
2704 return -TARGET_EINVAL
;
2708 ret
= get_errno(getsockopt(sockfd
, level
, SO_PEERCRED
,
2716 if (!lock_user_struct(VERIFY_WRITE
, tcr
, optval_addr
, 0)) {
2717 return -TARGET_EFAULT
;
2719 __put_user(cr
.pid
, &tcr
->pid
);
2720 __put_user(cr
.uid
, &tcr
->uid
);
2721 __put_user(cr
.gid
, &tcr
->gid
);
2722 unlock_user_struct(tcr
, optval_addr
, 1);
2723 if (put_user_u32(len
, optlen
)) {
2724 return -TARGET_EFAULT
;
2728 case TARGET_SO_PEERSEC
: {
2731 if (get_user_u32(len
, optlen
)) {
2732 return -TARGET_EFAULT
;
2735 return -TARGET_EINVAL
;
2737 name
= lock_user(VERIFY_WRITE
, optval_addr
, len
, 0);
2739 return -TARGET_EFAULT
;
2742 ret
= get_errno(getsockopt(sockfd
, level
, SO_PEERSEC
,
2744 if (put_user_u32(lv
, optlen
)) {
2745 ret
= -TARGET_EFAULT
;
2747 unlock_user(name
, optval_addr
, lv
);
2750 case TARGET_SO_LINGER
:
2754 struct target_linger
*tlg
;
2756 if (get_user_u32(len
, optlen
)) {
2757 return -TARGET_EFAULT
;
2760 return -TARGET_EINVAL
;
2764 ret
= get_errno(getsockopt(sockfd
, level
, SO_LINGER
,
2772 if (!lock_user_struct(VERIFY_WRITE
, tlg
, optval_addr
, 0)) {
2773 return -TARGET_EFAULT
;
2775 __put_user(lg
.l_onoff
, &tlg
->l_onoff
);
2776 __put_user(lg
.l_linger
, &tlg
->l_linger
);
2777 unlock_user_struct(tlg
, optval_addr
, 1);
2778 if (put_user_u32(len
, optlen
)) {
2779 return -TARGET_EFAULT
;
2783 /* Options with 'int' argument. */
2784 case TARGET_SO_DEBUG
:
2787 case TARGET_SO_REUSEADDR
:
2788 optname
= SO_REUSEADDR
;
2791 case TARGET_SO_REUSEPORT
:
2792 optname
= SO_REUSEPORT
;
2795 case TARGET_SO_TYPE
:
2798 case TARGET_SO_ERROR
:
2801 case TARGET_SO_DONTROUTE
:
2802 optname
= SO_DONTROUTE
;
2804 case TARGET_SO_BROADCAST
:
2805 optname
= SO_BROADCAST
;
2807 case TARGET_SO_SNDBUF
:
2808 optname
= SO_SNDBUF
;
2810 case TARGET_SO_RCVBUF
:
2811 optname
= SO_RCVBUF
;
2813 case TARGET_SO_KEEPALIVE
:
2814 optname
= SO_KEEPALIVE
;
2816 case TARGET_SO_OOBINLINE
:
2817 optname
= SO_OOBINLINE
;
2819 case TARGET_SO_NO_CHECK
:
2820 optname
= SO_NO_CHECK
;
2822 case TARGET_SO_PRIORITY
:
2823 optname
= SO_PRIORITY
;
2826 case TARGET_SO_BSDCOMPAT
:
2827 optname
= SO_BSDCOMPAT
;
2830 case TARGET_SO_PASSCRED
:
2831 optname
= SO_PASSCRED
;
2833 case TARGET_SO_TIMESTAMP
:
2834 optname
= SO_TIMESTAMP
;
2836 case TARGET_SO_RCVLOWAT
:
2837 optname
= SO_RCVLOWAT
;
2839 case TARGET_SO_ACCEPTCONN
:
2840 optname
= SO_ACCEPTCONN
;
2842 case TARGET_SO_PROTOCOL
:
2843 optname
= SO_PROTOCOL
;
2845 case TARGET_SO_DOMAIN
:
2846 optname
= SO_DOMAIN
;
2854 /* TCP and UDP options all take an 'int' value. */
2856 if (get_user_u32(len
, optlen
))
2857 return -TARGET_EFAULT
;
2859 return -TARGET_EINVAL
;
2861 ret
= get_errno(getsockopt(sockfd
, level
, optname
, &val
, &lv
));
2864 if (optname
== SO_TYPE
) {
2865 val
= host_to_target_sock_type(val
);
2870 if (put_user_u32(val
, optval_addr
))
2871 return -TARGET_EFAULT
;
2873 if (put_user_u8(val
, optval_addr
))
2874 return -TARGET_EFAULT
;
2876 if (put_user_u32(len
, optlen
))
2877 return -TARGET_EFAULT
;
2884 case IP_ROUTER_ALERT
:
2888 case IP_MTU_DISCOVER
:
2894 case IP_MULTICAST_TTL
:
2895 case IP_MULTICAST_LOOP
:
2896 if (get_user_u32(len
, optlen
))
2897 return -TARGET_EFAULT
;
2899 return -TARGET_EINVAL
;
2901 ret
= get_errno(getsockopt(sockfd
, level
, optname
, &val
, &lv
));
2904 if (len
< sizeof(int) && len
> 0 && val
>= 0 && val
< 255) {
2906 if (put_user_u32(len
, optlen
)
2907 || put_user_u8(val
, optval_addr
))
2908 return -TARGET_EFAULT
;
2910 if (len
> sizeof(int))
2912 if (put_user_u32(len
, optlen
)
2913 || put_user_u32(val
, optval_addr
))
2914 return -TARGET_EFAULT
;
2918 ret
= -TARGET_ENOPROTOOPT
;
2924 case IPV6_MTU_DISCOVER
:
2927 case IPV6_RECVPKTINFO
:
2928 case IPV6_UNICAST_HOPS
:
2929 case IPV6_MULTICAST_HOPS
:
2930 case IPV6_MULTICAST_LOOP
:
2932 case IPV6_RECVHOPLIMIT
:
2933 case IPV6_2292HOPLIMIT
:
2936 case IPV6_2292PKTINFO
:
2937 case IPV6_RECVTCLASS
:
2938 case IPV6_RECVRTHDR
:
2939 case IPV6_2292RTHDR
:
2940 case IPV6_RECVHOPOPTS
:
2941 case IPV6_2292HOPOPTS
:
2942 case IPV6_RECVDSTOPTS
:
2943 case IPV6_2292DSTOPTS
:
2945 case IPV6_ADDR_PREFERENCES
:
2946 #ifdef IPV6_RECVPATHMTU
2947 case IPV6_RECVPATHMTU
:
2949 #ifdef IPV6_TRANSPARENT
2950 case IPV6_TRANSPARENT
:
2952 #ifdef IPV6_FREEBIND
2955 #ifdef IPV6_RECVORIGDSTADDR
2956 case IPV6_RECVORIGDSTADDR
:
2958 if (get_user_u32(len
, optlen
))
2959 return -TARGET_EFAULT
;
2961 return -TARGET_EINVAL
;
2963 ret
= get_errno(getsockopt(sockfd
, level
, optname
, &val
, &lv
));
2966 if (len
< sizeof(int) && len
> 0 && val
>= 0 && val
< 255) {
2968 if (put_user_u32(len
, optlen
)
2969 || put_user_u8(val
, optval_addr
))
2970 return -TARGET_EFAULT
;
2972 if (len
> sizeof(int))
2974 if (put_user_u32(len
, optlen
)
2975 || put_user_u32(val
, optval_addr
))
2976 return -TARGET_EFAULT
;
2980 ret
= -TARGET_ENOPROTOOPT
;
2987 case NETLINK_PKTINFO
:
2988 case NETLINK_BROADCAST_ERROR
:
2989 case NETLINK_NO_ENOBUFS
:
2990 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)
2991 case NETLINK_LISTEN_ALL_NSID
:
2992 case NETLINK_CAP_ACK
:
2993 #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0) */
2994 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0)
2995 case NETLINK_EXT_ACK
:
2996 #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) */
2997 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 20, 0)
2998 case NETLINK_GET_STRICT_CHK
:
2999 #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) */
3000 if (get_user_u32(len
, optlen
)) {
3001 return -TARGET_EFAULT
;
3003 if (len
!= sizeof(val
)) {
3004 return -TARGET_EINVAL
;
3007 ret
= get_errno(getsockopt(sockfd
, level
, optname
, &val
, &lv
));
3011 if (put_user_u32(lv
, optlen
)
3012 || put_user_u32(val
, optval_addr
)) {
3013 return -TARGET_EFAULT
;
3016 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)
3017 case NETLINK_LIST_MEMBERSHIPS
:
3021 if (get_user_u32(len
, optlen
)) {
3022 return -TARGET_EFAULT
;
3025 return -TARGET_EINVAL
;
3027 results
= lock_user(VERIFY_WRITE
, optval_addr
, len
, 1);
3028 if (!results
&& len
> 0) {
3029 return -TARGET_EFAULT
;
3032 ret
= get_errno(getsockopt(sockfd
, level
, optname
, results
, &lv
));
3034 unlock_user(results
, optval_addr
, 0);
3037 /* swap host endianess to target endianess. */
3038 for (i
= 0; i
< (len
/ sizeof(uint32_t)); i
++) {
3039 results
[i
] = tswap32(results
[i
]);
3041 if (put_user_u32(lv
, optlen
)) {
3042 return -TARGET_EFAULT
;
3044 unlock_user(results
, optval_addr
, 0);
3047 #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0) */
3052 #endif /* SOL_NETLINK */
3055 qemu_log_mask(LOG_UNIMP
,
3056 "getsockopt level=%d optname=%d not yet supported\n",
3058 ret
= -TARGET_EOPNOTSUPP
;
3064 /* Convert target low/high pair representing file offset into the host
3065 * low/high pair. This function doesn't handle offsets bigger than 64 bits
3066 * as the kernel doesn't handle them either.
3068 static void target_to_host_low_high(abi_ulong tlow
,
3070 unsigned long *hlow
,
3071 unsigned long *hhigh
)
3073 uint64_t off
= tlow
|
3074 ((unsigned long long)thigh
<< TARGET_LONG_BITS
/ 2) <<
3075 TARGET_LONG_BITS
/ 2;
3078 *hhigh
= (off
>> HOST_LONG_BITS
/ 2) >> HOST_LONG_BITS
/ 2;
3081 static struct iovec
*lock_iovec(int type
, abi_ulong target_addr
,
3082 abi_ulong count
, int copy
)
3084 struct target_iovec
*target_vec
;
3086 abi_ulong total_len
, max_len
;
3089 bool bad_address
= false;
3095 if (count
> IOV_MAX
) {
3100 vec
= g_try_new0(struct iovec
, count
);
3106 target_vec
= lock_user(VERIFY_READ
, target_addr
,
3107 count
* sizeof(struct target_iovec
), 1);
3108 if (target_vec
== NULL
) {
3113 /* ??? If host page size > target page size, this will result in a
3114 value larger than what we can actually support. */
3115 max_len
= 0x7fffffff & TARGET_PAGE_MASK
;
3118 for (i
= 0; i
< count
; i
++) {
3119 abi_ulong base
= tswapal(target_vec
[i
].iov_base
);
3120 abi_long len
= tswapal(target_vec
[i
].iov_len
);
3125 } else if (len
== 0) {
3126 /* Zero length pointer is ignored. */
3127 vec
[i
].iov_base
= 0;
3129 vec
[i
].iov_base
= lock_user(type
, base
, len
, copy
);
3130 /* If the first buffer pointer is bad, this is a fault. But
3131 * subsequent bad buffers will result in a partial write; this
3132 * is realized by filling the vector with null pointers and
3134 if (!vec
[i
].iov_base
) {
3145 if (len
> max_len
- total_len
) {
3146 len
= max_len
- total_len
;
3149 vec
[i
].iov_len
= len
;
3153 unlock_user(target_vec
, target_addr
, 0);
3158 if (tswapal(target_vec
[i
].iov_len
) > 0) {
3159 unlock_user(vec
[i
].iov_base
, tswapal(target_vec
[i
].iov_base
), 0);
3162 unlock_user(target_vec
, target_addr
, 0);
3169 static void unlock_iovec(struct iovec
*vec
, abi_ulong target_addr
,
3170 abi_ulong count
, int copy
)
3172 struct target_iovec
*target_vec
;
3175 target_vec
= lock_user(VERIFY_READ
, target_addr
,
3176 count
* sizeof(struct target_iovec
), 1);
3178 for (i
= 0; i
< count
; i
++) {
3179 abi_ulong base
= tswapal(target_vec
[i
].iov_base
);
3180 abi_long len
= tswapal(target_vec
[i
].iov_len
);
3184 unlock_user(vec
[i
].iov_base
, base
, copy
? vec
[i
].iov_len
: 0);
3186 unlock_user(target_vec
, target_addr
, 0);
3192 static inline int target_to_host_sock_type(int *type
)
3195 int target_type
= *type
;
3197 switch (target_type
& TARGET_SOCK_TYPE_MASK
) {
3198 case TARGET_SOCK_DGRAM
:
3199 host_type
= SOCK_DGRAM
;
3201 case TARGET_SOCK_STREAM
:
3202 host_type
= SOCK_STREAM
;
3205 host_type
= target_type
& TARGET_SOCK_TYPE_MASK
;
3208 if (target_type
& TARGET_SOCK_CLOEXEC
) {
3209 #if defined(SOCK_CLOEXEC)
3210 host_type
|= SOCK_CLOEXEC
;
3212 return -TARGET_EINVAL
;
3215 if (target_type
& TARGET_SOCK_NONBLOCK
) {
3216 #if defined(SOCK_NONBLOCK)
3217 host_type
|= SOCK_NONBLOCK
;
3218 #elif !defined(O_NONBLOCK)
3219 return -TARGET_EINVAL
;
3226 /* Try to emulate socket type flags after socket creation. */
3227 static int sock_flags_fixup(int fd
, int target_type
)
3229 #if !defined(SOCK_NONBLOCK) && defined(O_NONBLOCK)
3230 if (target_type
& TARGET_SOCK_NONBLOCK
) {
3231 int flags
= fcntl(fd
, F_GETFL
);
3232 if (fcntl(fd
, F_SETFL
, O_NONBLOCK
| flags
) == -1) {
3234 return -TARGET_EINVAL
;
3241 /* do_socket() Must return target values and target errnos. */
3242 static abi_long
do_socket(int domain
, int type
, int protocol
)
3244 int target_type
= type
;
3247 ret
= target_to_host_sock_type(&type
);
3252 if (domain
== PF_NETLINK
&& !(
3253 #ifdef CONFIG_RTNETLINK
3254 protocol
== NETLINK_ROUTE
||
3256 protocol
== NETLINK_KOBJECT_UEVENT
||
3257 protocol
== NETLINK_AUDIT
)) {
3258 return -TARGET_EPROTONOSUPPORT
;
3261 if (domain
== AF_PACKET
||
3262 (domain
== AF_INET
&& type
== SOCK_PACKET
)) {
3263 protocol
= tswap16(protocol
);
3266 ret
= get_errno(socket(domain
, type
, protocol
));
3268 ret
= sock_flags_fixup(ret
, target_type
);
3269 if (type
== SOCK_PACKET
) {
3270 /* Manage an obsolete case :
3271 * if socket type is SOCK_PACKET, bind by name
3273 fd_trans_register(ret
, &target_packet_trans
);
3274 } else if (domain
== PF_NETLINK
) {
3276 #ifdef CONFIG_RTNETLINK
3278 fd_trans_register(ret
, &target_netlink_route_trans
);
3281 case NETLINK_KOBJECT_UEVENT
:
3282 /* nothing to do: messages are strings */
3285 fd_trans_register(ret
, &target_netlink_audit_trans
);
3288 g_assert_not_reached();
3295 /* do_bind() Must return target values and target errnos. */
3296 static abi_long
do_bind(int sockfd
, abi_ulong target_addr
,
3302 if ((int)addrlen
< 0) {
3303 return -TARGET_EINVAL
;
3306 addr
= alloca(addrlen
+1);
3308 ret
= target_to_host_sockaddr(sockfd
, addr
, target_addr
, addrlen
);
3312 return get_errno(bind(sockfd
, addr
, addrlen
));
3315 /* do_connect() Must return target values and target errnos. */
3316 static abi_long
do_connect(int sockfd
, abi_ulong target_addr
,
3322 if ((int)addrlen
< 0) {
3323 return -TARGET_EINVAL
;
3326 addr
= alloca(addrlen
+1);
3328 ret
= target_to_host_sockaddr(sockfd
, addr
, target_addr
, addrlen
);
3332 return get_errno(safe_connect(sockfd
, addr
, addrlen
));
3335 /* do_sendrecvmsg_locked() Must return target values and target errnos. */
3336 static abi_long
do_sendrecvmsg_locked(int fd
, struct target_msghdr
*msgp
,
3337 int flags
, int send
)
3343 abi_ulong target_vec
;
3345 if (msgp
->msg_name
) {
3346 msg
.msg_namelen
= tswap32(msgp
->msg_namelen
);
3347 msg
.msg_name
= alloca(msg
.msg_namelen
+1);
3348 ret
= target_to_host_sockaddr(fd
, msg
.msg_name
,
3349 tswapal(msgp
->msg_name
),
3351 if (ret
== -TARGET_EFAULT
) {
3352 /* For connected sockets msg_name and msg_namelen must
3353 * be ignored, so returning EFAULT immediately is wrong.
3354 * Instead, pass a bad msg_name to the host kernel, and
3355 * let it decide whether to return EFAULT or not.
3357 msg
.msg_name
= (void *)-1;
3362 msg
.msg_name
= NULL
;
3363 msg
.msg_namelen
= 0;
3365 msg
.msg_controllen
= 2 * tswapal(msgp
->msg_controllen
);
3366 msg
.msg_control
= alloca(msg
.msg_controllen
);
3367 memset(msg
.msg_control
, 0, msg
.msg_controllen
);
3369 msg
.msg_flags
= tswap32(msgp
->msg_flags
);
3371 count
= tswapal(msgp
->msg_iovlen
);
3372 target_vec
= tswapal(msgp
->msg_iov
);
3374 if (count
> IOV_MAX
) {
3375 /* sendrcvmsg returns a different errno for this condition than
3376 * readv/writev, so we must catch it here before lock_iovec() does.
3378 ret
= -TARGET_EMSGSIZE
;
3382 vec
= lock_iovec(send
? VERIFY_READ
: VERIFY_WRITE
,
3383 target_vec
, count
, send
);
3385 ret
= -host_to_target_errno(errno
);
3388 msg
.msg_iovlen
= count
;
3392 if (fd_trans_target_to_host_data(fd
)) {
3395 host_msg
= g_malloc(msg
.msg_iov
->iov_len
);
3396 memcpy(host_msg
, msg
.msg_iov
->iov_base
, msg
.msg_iov
->iov_len
);
3397 ret
= fd_trans_target_to_host_data(fd
)(host_msg
,
3398 msg
.msg_iov
->iov_len
);
3400 msg
.msg_iov
->iov_base
= host_msg
;
3401 ret
= get_errno(safe_sendmsg(fd
, &msg
, flags
));
3405 ret
= target_to_host_cmsg(&msg
, msgp
);
3407 ret
= get_errno(safe_sendmsg(fd
, &msg
, flags
));
3411 ret
= get_errno(safe_recvmsg(fd
, &msg
, flags
));
3412 if (!is_error(ret
)) {
3414 if (fd_trans_host_to_target_data(fd
)) {
3415 ret
= fd_trans_host_to_target_data(fd
)(msg
.msg_iov
->iov_base
,
3416 MIN(msg
.msg_iov
->iov_len
, len
));
3418 ret
= host_to_target_cmsg(msgp
, &msg
);
3420 if (!is_error(ret
)) {
3421 msgp
->msg_namelen
= tswap32(msg
.msg_namelen
);
3422 msgp
->msg_flags
= tswap32(msg
.msg_flags
);
3423 if (msg
.msg_name
!= NULL
&& msg
.msg_name
!= (void *)-1) {
3424 ret
= host_to_target_sockaddr(tswapal(msgp
->msg_name
),
3425 msg
.msg_name
, msg
.msg_namelen
);
3437 unlock_iovec(vec
, target_vec
, count
, !send
);
3442 static abi_long
do_sendrecvmsg(int fd
, abi_ulong target_msg
,
3443 int flags
, int send
)
3446 struct target_msghdr
*msgp
;
3448 if (!lock_user_struct(send
? VERIFY_READ
: VERIFY_WRITE
,
3452 return -TARGET_EFAULT
;
3454 ret
= do_sendrecvmsg_locked(fd
, msgp
, flags
, send
);
3455 unlock_user_struct(msgp
, target_msg
, send
? 0 : 1);
3459 /* We don't rely on the C library to have sendmmsg/recvmmsg support,
3460 * so it might not have this *mmsg-specific flag either.
3462 #ifndef MSG_WAITFORONE
3463 #define MSG_WAITFORONE 0x10000
3466 static abi_long
do_sendrecvmmsg(int fd
, abi_ulong target_msgvec
,
3467 unsigned int vlen
, unsigned int flags
,
3470 struct target_mmsghdr
*mmsgp
;
3474 if (vlen
> UIO_MAXIOV
) {
3478 mmsgp
= lock_user(VERIFY_WRITE
, target_msgvec
, sizeof(*mmsgp
) * vlen
, 1);
3480 return -TARGET_EFAULT
;
3483 for (i
= 0; i
< vlen
; i
++) {
3484 ret
= do_sendrecvmsg_locked(fd
, &mmsgp
[i
].msg_hdr
, flags
, send
);
3485 if (is_error(ret
)) {
3488 mmsgp
[i
].msg_len
= tswap32(ret
);
3489 /* MSG_WAITFORONE turns on MSG_DONTWAIT after one packet */
3490 if (flags
& MSG_WAITFORONE
) {
3491 flags
|= MSG_DONTWAIT
;
3495 unlock_user(mmsgp
, target_msgvec
, sizeof(*mmsgp
) * i
);
3497 /* Return number of datagrams sent if we sent any at all;
3498 * otherwise return the error.
3506 /* do_accept4() Must return target values and target errnos. */
3507 static abi_long
do_accept4(int fd
, abi_ulong target_addr
,
3508 abi_ulong target_addrlen_addr
, int flags
)
3510 socklen_t addrlen
, ret_addrlen
;
3515 host_flags
= target_to_host_bitmask(flags
, fcntl_flags_tbl
);
3517 if (target_addr
== 0) {
3518 return get_errno(safe_accept4(fd
, NULL
, NULL
, host_flags
));
3521 /* linux returns EFAULT if addrlen pointer is invalid */
3522 if (get_user_u32(addrlen
, target_addrlen_addr
))
3523 return -TARGET_EFAULT
;
3525 if ((int)addrlen
< 0) {
3526 return -TARGET_EINVAL
;
3529 if (!access_ok(thread_cpu
, VERIFY_WRITE
, target_addr
, addrlen
)) {
3530 return -TARGET_EFAULT
;
3533 addr
= alloca(addrlen
);
3535 ret_addrlen
= addrlen
;
3536 ret
= get_errno(safe_accept4(fd
, addr
, &ret_addrlen
, host_flags
));
3537 if (!is_error(ret
)) {
3538 host_to_target_sockaddr(target_addr
, addr
, MIN(addrlen
, ret_addrlen
));
3539 if (put_user_u32(ret_addrlen
, target_addrlen_addr
)) {
3540 ret
= -TARGET_EFAULT
;
3546 /* do_getpeername() Must return target values and target errnos. */
3547 static abi_long
do_getpeername(int fd
, abi_ulong target_addr
,
3548 abi_ulong target_addrlen_addr
)
3550 socklen_t addrlen
, ret_addrlen
;
3554 if (get_user_u32(addrlen
, target_addrlen_addr
))
3555 return -TARGET_EFAULT
;
3557 if ((int)addrlen
< 0) {
3558 return -TARGET_EINVAL
;
3561 if (!access_ok(thread_cpu
, VERIFY_WRITE
, target_addr
, addrlen
)) {
3562 return -TARGET_EFAULT
;
3565 addr
= alloca(addrlen
);
3567 ret_addrlen
= addrlen
;
3568 ret
= get_errno(getpeername(fd
, addr
, &ret_addrlen
));
3569 if (!is_error(ret
)) {
3570 host_to_target_sockaddr(target_addr
, addr
, MIN(addrlen
, ret_addrlen
));
3571 if (put_user_u32(ret_addrlen
, target_addrlen_addr
)) {
3572 ret
= -TARGET_EFAULT
;
3578 /* do_getsockname() Must return target values and target errnos. */
3579 static abi_long
do_getsockname(int fd
, abi_ulong target_addr
,
3580 abi_ulong target_addrlen_addr
)
3582 socklen_t addrlen
, ret_addrlen
;
3586 if (get_user_u32(addrlen
, target_addrlen_addr
))
3587 return -TARGET_EFAULT
;
3589 if ((int)addrlen
< 0) {
3590 return -TARGET_EINVAL
;
3593 if (!access_ok(thread_cpu
, VERIFY_WRITE
, target_addr
, addrlen
)) {
3594 return -TARGET_EFAULT
;
3597 addr
= alloca(addrlen
);
3599 ret_addrlen
= addrlen
;
3600 ret
= get_errno(getsockname(fd
, addr
, &ret_addrlen
));
3601 if (!is_error(ret
)) {
3602 host_to_target_sockaddr(target_addr
, addr
, MIN(addrlen
, ret_addrlen
));
3603 if (put_user_u32(ret_addrlen
, target_addrlen_addr
)) {
3604 ret
= -TARGET_EFAULT
;
3610 /* do_socketpair() Must return target values and target errnos. */
3611 static abi_long
do_socketpair(int domain
, int type
, int protocol
,
3612 abi_ulong target_tab_addr
)
3617 target_to_host_sock_type(&type
);
3619 ret
= get_errno(socketpair(domain
, type
, protocol
, tab
));
3620 if (!is_error(ret
)) {
3621 if (put_user_s32(tab
[0], target_tab_addr
)
3622 || put_user_s32(tab
[1], target_tab_addr
+ sizeof(tab
[0])))
3623 ret
= -TARGET_EFAULT
;
3628 /* do_sendto() Must return target values and target errnos. */
3629 static abi_long
do_sendto(int fd
, abi_ulong msg
, size_t len
, int flags
,
3630 abi_ulong target_addr
, socklen_t addrlen
)
3634 void *copy_msg
= NULL
;
3637 if ((int)addrlen
< 0) {
3638 return -TARGET_EINVAL
;
3641 host_msg
= lock_user(VERIFY_READ
, msg
, len
, 1);
3643 return -TARGET_EFAULT
;
3644 if (fd_trans_target_to_host_data(fd
)) {
3645 copy_msg
= host_msg
;
3646 host_msg
= g_malloc(len
);
3647 memcpy(host_msg
, copy_msg
, len
);
3648 ret
= fd_trans_target_to_host_data(fd
)(host_msg
, len
);
3654 addr
= alloca(addrlen
+1);
3655 ret
= target_to_host_sockaddr(fd
, addr
, target_addr
, addrlen
);
3659 ret
= get_errno(safe_sendto(fd
, host_msg
, len
, flags
, addr
, addrlen
));
3661 ret
= get_errno(safe_sendto(fd
, host_msg
, len
, flags
, NULL
, 0));
3666 host_msg
= copy_msg
;
3668 unlock_user(host_msg
, msg
, 0);
3672 /* do_recvfrom() Must return target values and target errnos. */
3673 static abi_long
do_recvfrom(int fd
, abi_ulong msg
, size_t len
, int flags
,
3674 abi_ulong target_addr
,
3675 abi_ulong target_addrlen
)
3677 socklen_t addrlen
, ret_addrlen
;
3685 host_msg
= lock_user(VERIFY_WRITE
, msg
, len
, 0);
3687 return -TARGET_EFAULT
;
3691 if (get_user_u32(addrlen
, target_addrlen
)) {
3692 ret
= -TARGET_EFAULT
;
3695 if ((int)addrlen
< 0) {
3696 ret
= -TARGET_EINVAL
;
3699 addr
= alloca(addrlen
);
3700 ret_addrlen
= addrlen
;
3701 ret
= get_errno(safe_recvfrom(fd
, host_msg
, len
, flags
,
3702 addr
, &ret_addrlen
));
3704 addr
= NULL
; /* To keep compiler quiet. */
3705 addrlen
= 0; /* To keep compiler quiet. */
3706 ret
= get_errno(safe_recvfrom(fd
, host_msg
, len
, flags
, NULL
, 0));
3708 if (!is_error(ret
)) {
3709 if (fd_trans_host_to_target_data(fd
)) {
3711 trans
= fd_trans_host_to_target_data(fd
)(host_msg
, MIN(ret
, len
));
3712 if (is_error(trans
)) {
3718 host_to_target_sockaddr(target_addr
, addr
,
3719 MIN(addrlen
, ret_addrlen
));
3720 if (put_user_u32(ret_addrlen
, target_addrlen
)) {
3721 ret
= -TARGET_EFAULT
;
3725 unlock_user(host_msg
, msg
, len
);
3728 unlock_user(host_msg
, msg
, 0);
3733 #ifdef TARGET_NR_socketcall
3734 /* do_socketcall() must return target values and target errnos. */
3735 static abi_long
do_socketcall(int num
, abi_ulong vptr
)
3737 static const unsigned nargs
[] = { /* number of arguments per operation */
3738 [TARGET_SYS_SOCKET
] = 3, /* domain, type, protocol */
3739 [TARGET_SYS_BIND
] = 3, /* fd, addr, addrlen */
3740 [TARGET_SYS_CONNECT
] = 3, /* fd, addr, addrlen */
3741 [TARGET_SYS_LISTEN
] = 2, /* fd, backlog */
3742 [TARGET_SYS_ACCEPT
] = 3, /* fd, addr, addrlen */
3743 [TARGET_SYS_GETSOCKNAME
] = 3, /* fd, addr, addrlen */
3744 [TARGET_SYS_GETPEERNAME
] = 3, /* fd, addr, addrlen */
3745 [TARGET_SYS_SOCKETPAIR
] = 4, /* domain, type, protocol, tab */
3746 [TARGET_SYS_SEND
] = 4, /* fd, msg, len, flags */
3747 [TARGET_SYS_RECV
] = 4, /* fd, msg, len, flags */
3748 [TARGET_SYS_SENDTO
] = 6, /* fd, msg, len, flags, addr, addrlen */
3749 [TARGET_SYS_RECVFROM
] = 6, /* fd, msg, len, flags, addr, addrlen */
3750 [TARGET_SYS_SHUTDOWN
] = 2, /* fd, how */
3751 [TARGET_SYS_SETSOCKOPT
] = 5, /* fd, level, optname, optval, optlen */
3752 [TARGET_SYS_GETSOCKOPT
] = 5, /* fd, level, optname, optval, optlen */
3753 [TARGET_SYS_SENDMSG
] = 3, /* fd, msg, flags */
3754 [TARGET_SYS_RECVMSG
] = 3, /* fd, msg, flags */
3755 [TARGET_SYS_ACCEPT4
] = 4, /* fd, addr, addrlen, flags */
3756 [TARGET_SYS_RECVMMSG
] = 4, /* fd, msgvec, vlen, flags */
3757 [TARGET_SYS_SENDMMSG
] = 4, /* fd, msgvec, vlen, flags */
3759 abi_long a
[6]; /* max 6 args */
3762 /* check the range of the first argument num */
3763 /* (TARGET_SYS_SENDMMSG is the highest among TARGET_SYS_xxx) */
3764 if (num
< 1 || num
> TARGET_SYS_SENDMMSG
) {
3765 return -TARGET_EINVAL
;
3767 /* ensure we have space for args */
3768 if (nargs
[num
] > ARRAY_SIZE(a
)) {
3769 return -TARGET_EINVAL
;
3771 /* collect the arguments in a[] according to nargs[] */
3772 for (i
= 0; i
< nargs
[num
]; ++i
) {
3773 if (get_user_ual(a
[i
], vptr
+ i
* sizeof(abi_long
)) != 0) {
3774 return -TARGET_EFAULT
;
3777 /* now when we have the args, invoke the appropriate underlying function */
3779 case TARGET_SYS_SOCKET
: /* domain, type, protocol */
3780 return do_socket(a
[0], a
[1], a
[2]);
3781 case TARGET_SYS_BIND
: /* sockfd, addr, addrlen */
3782 return do_bind(a
[0], a
[1], a
[2]);
3783 case TARGET_SYS_CONNECT
: /* sockfd, addr, addrlen */
3784 return do_connect(a
[0], a
[1], a
[2]);
3785 case TARGET_SYS_LISTEN
: /* sockfd, backlog */
3786 return get_errno(listen(a
[0], a
[1]));
3787 case TARGET_SYS_ACCEPT
: /* sockfd, addr, addrlen */
3788 return do_accept4(a
[0], a
[1], a
[2], 0);
3789 case TARGET_SYS_GETSOCKNAME
: /* sockfd, addr, addrlen */
3790 return do_getsockname(a
[0], a
[1], a
[2]);
3791 case TARGET_SYS_GETPEERNAME
: /* sockfd, addr, addrlen */
3792 return do_getpeername(a
[0], a
[1], a
[2]);
3793 case TARGET_SYS_SOCKETPAIR
: /* domain, type, protocol, tab */
3794 return do_socketpair(a
[0], a
[1], a
[2], a
[3]);
3795 case TARGET_SYS_SEND
: /* sockfd, msg, len, flags */
3796 return do_sendto(a
[0], a
[1], a
[2], a
[3], 0, 0);
3797 case TARGET_SYS_RECV
: /* sockfd, msg, len, flags */
3798 return do_recvfrom(a
[0], a
[1], a
[2], a
[3], 0, 0);
3799 case TARGET_SYS_SENDTO
: /* sockfd, msg, len, flags, addr, addrlen */
3800 return do_sendto(a
[0], a
[1], a
[2], a
[3], a
[4], a
[5]);
3801 case TARGET_SYS_RECVFROM
: /* sockfd, msg, len, flags, addr, addrlen */
3802 return do_recvfrom(a
[0], a
[1], a
[2], a
[3], a
[4], a
[5]);
3803 case TARGET_SYS_SHUTDOWN
: /* sockfd, how */
3804 return get_errno(shutdown(a
[0], a
[1]));
3805 case TARGET_SYS_SETSOCKOPT
: /* sockfd, level, optname, optval, optlen */
3806 return do_setsockopt(a
[0], a
[1], a
[2], a
[3], a
[4]);
3807 case TARGET_SYS_GETSOCKOPT
: /* sockfd, level, optname, optval, optlen */
3808 return do_getsockopt(a
[0], a
[1], a
[2], a
[3], a
[4]);
3809 case TARGET_SYS_SENDMSG
: /* sockfd, msg, flags */
3810 return do_sendrecvmsg(a
[0], a
[1], a
[2], 1);
3811 case TARGET_SYS_RECVMSG
: /* sockfd, msg, flags */
3812 return do_sendrecvmsg(a
[0], a
[1], a
[2], 0);
3813 case TARGET_SYS_ACCEPT4
: /* sockfd, addr, addrlen, flags */
3814 return do_accept4(a
[0], a
[1], a
[2], a
[3]);
3815 case TARGET_SYS_RECVMMSG
: /* sockfd, msgvec, vlen, flags */
3816 return do_sendrecvmmsg(a
[0], a
[1], a
[2], a
[3], 0);
3817 case TARGET_SYS_SENDMMSG
: /* sockfd, msgvec, vlen, flags */
3818 return do_sendrecvmmsg(a
[0], a
[1], a
[2], a
[3], 1);
3820 qemu_log_mask(LOG_UNIMP
, "Unsupported socketcall: %d\n", num
);
3821 return -TARGET_EINVAL
;
3826 #define N_SHM_REGIONS 32
3828 static struct shm_region
{
3832 } shm_regions
[N_SHM_REGIONS
];
3834 #ifndef TARGET_SEMID64_DS
3835 /* asm-generic version of this struct */
3836 struct target_semid64_ds
3838 struct target_ipc_perm sem_perm
;
3839 abi_ulong sem_otime
;
3840 #if TARGET_ABI_BITS == 32
3841 abi_ulong __unused1
;
3843 abi_ulong sem_ctime
;
3844 #if TARGET_ABI_BITS == 32
3845 abi_ulong __unused2
;
3847 abi_ulong sem_nsems
;
3848 abi_ulong __unused3
;
3849 abi_ulong __unused4
;
3853 static inline abi_long
target_to_host_ipc_perm(struct ipc_perm
*host_ip
,
3854 abi_ulong target_addr
)
3856 struct target_ipc_perm
*target_ip
;
3857 struct target_semid64_ds
*target_sd
;
3859 if (!lock_user_struct(VERIFY_READ
, target_sd
, target_addr
, 1))
3860 return -TARGET_EFAULT
;
3861 target_ip
= &(target_sd
->sem_perm
);
3862 host_ip
->__key
= tswap32(target_ip
->__key
);
3863 host_ip
->uid
= tswap32(target_ip
->uid
);
3864 host_ip
->gid
= tswap32(target_ip
->gid
);
3865 host_ip
->cuid
= tswap32(target_ip
->cuid
);
3866 host_ip
->cgid
= tswap32(target_ip
->cgid
);
3867 #if defined(TARGET_ALPHA) || defined(TARGET_MIPS) || defined(TARGET_PPC)
3868 host_ip
->mode
= tswap32(target_ip
->mode
);
3870 host_ip
->mode
= tswap16(target_ip
->mode
);
3872 #if defined(TARGET_PPC)
3873 host_ip
->__seq
= tswap32(target_ip
->__seq
);
3875 host_ip
->__seq
= tswap16(target_ip
->__seq
);
3877 unlock_user_struct(target_sd
, target_addr
, 0);
3881 static inline abi_long
host_to_target_ipc_perm(abi_ulong target_addr
,
3882 struct ipc_perm
*host_ip
)
3884 struct target_ipc_perm
*target_ip
;
3885 struct target_semid64_ds
*target_sd
;
3887 if (!lock_user_struct(VERIFY_WRITE
, target_sd
, target_addr
, 0))
3888 return -TARGET_EFAULT
;
3889 target_ip
= &(target_sd
->sem_perm
);
3890 target_ip
->__key
= tswap32(host_ip
->__key
);
3891 target_ip
->uid
= tswap32(host_ip
->uid
);
3892 target_ip
->gid
= tswap32(host_ip
->gid
);
3893 target_ip
->cuid
= tswap32(host_ip
->cuid
);
3894 target_ip
->cgid
= tswap32(host_ip
->cgid
);
3895 #if defined(TARGET_ALPHA) || defined(TARGET_MIPS) || defined(TARGET_PPC)
3896 target_ip
->mode
= tswap32(host_ip
->mode
);
3898 target_ip
->mode
= tswap16(host_ip
->mode
);
3900 #if defined(TARGET_PPC)
3901 target_ip
->__seq
= tswap32(host_ip
->__seq
);
3903 target_ip
->__seq
= tswap16(host_ip
->__seq
);
3905 unlock_user_struct(target_sd
, target_addr
, 1);
3909 static inline abi_long
target_to_host_semid_ds(struct semid_ds
*host_sd
,
3910 abi_ulong target_addr
)
3912 struct target_semid64_ds
*target_sd
;
3914 if (!lock_user_struct(VERIFY_READ
, target_sd
, target_addr
, 1))
3915 return -TARGET_EFAULT
;
3916 if (target_to_host_ipc_perm(&(host_sd
->sem_perm
),target_addr
))
3917 return -TARGET_EFAULT
;
3918 host_sd
->sem_nsems
= tswapal(target_sd
->sem_nsems
);
3919 host_sd
->sem_otime
= tswapal(target_sd
->sem_otime
);
3920 host_sd
->sem_ctime
= tswapal(target_sd
->sem_ctime
);
3921 unlock_user_struct(target_sd
, target_addr
, 0);
3925 static inline abi_long
host_to_target_semid_ds(abi_ulong target_addr
,
3926 struct semid_ds
*host_sd
)
3928 struct target_semid64_ds
*target_sd
;
3930 if (!lock_user_struct(VERIFY_WRITE
, target_sd
, target_addr
, 0))
3931 return -TARGET_EFAULT
;
3932 if (host_to_target_ipc_perm(target_addr
,&(host_sd
->sem_perm
)))
3933 return -TARGET_EFAULT
;
3934 target_sd
->sem_nsems
= tswapal(host_sd
->sem_nsems
);
3935 target_sd
->sem_otime
= tswapal(host_sd
->sem_otime
);
3936 target_sd
->sem_ctime
= tswapal(host_sd
->sem_ctime
);
3937 unlock_user_struct(target_sd
, target_addr
, 1);
3941 struct target_seminfo
{
3954 static inline abi_long
host_to_target_seminfo(abi_ulong target_addr
,
3955 struct seminfo
*host_seminfo
)
3957 struct target_seminfo
*target_seminfo
;
3958 if (!lock_user_struct(VERIFY_WRITE
, target_seminfo
, target_addr
, 0))
3959 return -TARGET_EFAULT
;
3960 __put_user(host_seminfo
->semmap
, &target_seminfo
->semmap
);
3961 __put_user(host_seminfo
->semmni
, &target_seminfo
->semmni
);
3962 __put_user(host_seminfo
->semmns
, &target_seminfo
->semmns
);
3963 __put_user(host_seminfo
->semmnu
, &target_seminfo
->semmnu
);
3964 __put_user(host_seminfo
->semmsl
, &target_seminfo
->semmsl
);
3965 __put_user(host_seminfo
->semopm
, &target_seminfo
->semopm
);
3966 __put_user(host_seminfo
->semume
, &target_seminfo
->semume
);
3967 __put_user(host_seminfo
->semusz
, &target_seminfo
->semusz
);
3968 __put_user(host_seminfo
->semvmx
, &target_seminfo
->semvmx
);
3969 __put_user(host_seminfo
->semaem
, &target_seminfo
->semaem
);
3970 unlock_user_struct(target_seminfo
, target_addr
, 1);
3976 struct semid_ds
*buf
;
3977 unsigned short *array
;
3978 struct seminfo
*__buf
;
3981 union target_semun
{
3988 static inline abi_long
target_to_host_semarray(int semid
, unsigned short **host_array
,
3989 abi_ulong target_addr
)
3992 unsigned short *array
;
3994 struct semid_ds semid_ds
;
3997 semun
.buf
= &semid_ds
;
3999 ret
= semctl(semid
, 0, IPC_STAT
, semun
);
4001 return get_errno(ret
);
4003 nsems
= semid_ds
.sem_nsems
;
4005 *host_array
= g_try_new(unsigned short, nsems
);
4007 return -TARGET_ENOMEM
;
4009 array
= lock_user(VERIFY_READ
, target_addr
,
4010 nsems
*sizeof(unsigned short), 1);
4012 g_free(*host_array
);
4013 return -TARGET_EFAULT
;
4016 for(i
=0; i
<nsems
; i
++) {
4017 __get_user((*host_array
)[i
], &array
[i
]);
4019 unlock_user(array
, target_addr
, 0);
4024 static inline abi_long
host_to_target_semarray(int semid
, abi_ulong target_addr
,
4025 unsigned short **host_array
)
4028 unsigned short *array
;
4030 struct semid_ds semid_ds
;
4033 semun
.buf
= &semid_ds
;
4035 ret
= semctl(semid
, 0, IPC_STAT
, semun
);
4037 return get_errno(ret
);
4039 nsems
= semid_ds
.sem_nsems
;
4041 array
= lock_user(VERIFY_WRITE
, target_addr
,
4042 nsems
*sizeof(unsigned short), 0);
4044 return -TARGET_EFAULT
;
4046 for(i
=0; i
<nsems
; i
++) {
4047 __put_user((*host_array
)[i
], &array
[i
]);
4049 g_free(*host_array
);
4050 unlock_user(array
, target_addr
, 1);
4055 static inline abi_long
do_semctl(int semid
, int semnum
, int cmd
,
4056 abi_ulong target_arg
)
4058 union target_semun target_su
= { .buf
= target_arg
};
4060 struct semid_ds dsarg
;
4061 unsigned short *array
= NULL
;
4062 struct seminfo seminfo
;
4063 abi_long ret
= -TARGET_EINVAL
;
4070 /* In 64 bit cross-endian situations, we will erroneously pick up
4071 * the wrong half of the union for the "val" element. To rectify
4072 * this, the entire 8-byte structure is byteswapped, followed by
4073 * a swap of the 4 byte val field. In other cases, the data is
4074 * already in proper host byte order. */
4075 if (sizeof(target_su
.val
) != (sizeof(target_su
.buf
))) {
4076 target_su
.buf
= tswapal(target_su
.buf
);
4077 arg
.val
= tswap32(target_su
.val
);
4079 arg
.val
= target_su
.val
;
4081 ret
= get_errno(semctl(semid
, semnum
, cmd
, arg
));
4085 err
= target_to_host_semarray(semid
, &array
, target_su
.array
);
4089 ret
= get_errno(semctl(semid
, semnum
, cmd
, arg
));
4090 err
= host_to_target_semarray(semid
, target_su
.array
, &array
);
4097 err
= target_to_host_semid_ds(&dsarg
, target_su
.buf
);
4101 ret
= get_errno(semctl(semid
, semnum
, cmd
, arg
));
4102 err
= host_to_target_semid_ds(target_su
.buf
, &dsarg
);
4108 arg
.__buf
= &seminfo
;
4109 ret
= get_errno(semctl(semid
, semnum
, cmd
, arg
));
4110 err
= host_to_target_seminfo(target_su
.__buf
, &seminfo
);
4118 ret
= get_errno(semctl(semid
, semnum
, cmd
, NULL
));
4125 struct target_sembuf
{
4126 unsigned short sem_num
;
4131 static inline abi_long
target_to_host_sembuf(struct sembuf
*host_sembuf
,
4132 abi_ulong target_addr
,
4135 struct target_sembuf
*target_sembuf
;
4138 target_sembuf
= lock_user(VERIFY_READ
, target_addr
,
4139 nsops
*sizeof(struct target_sembuf
), 1);
4141 return -TARGET_EFAULT
;
4143 for(i
=0; i
<nsops
; i
++) {
4144 __get_user(host_sembuf
[i
].sem_num
, &target_sembuf
[i
].sem_num
);
4145 __get_user(host_sembuf
[i
].sem_op
, &target_sembuf
[i
].sem_op
);
4146 __get_user(host_sembuf
[i
].sem_flg
, &target_sembuf
[i
].sem_flg
);
4149 unlock_user(target_sembuf
, target_addr
, 0);
4154 #if defined(TARGET_NR_ipc) || defined(TARGET_NR_semop) || \
4155 defined(TARGET_NR_semtimedop) || defined(TARGET_NR_semtimedop_time64)
4158 * This macro is required to handle the s390 variants, which passes the
4159 * arguments in a different order than default.
4162 #define SEMTIMEDOP_IPC_ARGS(__nsops, __sops, __timeout) \
4163 (__nsops), (__timeout), (__sops)
4165 #define SEMTIMEDOP_IPC_ARGS(__nsops, __sops, __timeout) \
4166 (__nsops), 0, (__sops), (__timeout)
4169 static inline abi_long
do_semtimedop(int semid
,
4172 abi_long timeout
, bool time64
)
4174 struct sembuf
*sops
;
4175 struct timespec ts
, *pts
= NULL
;
4181 if (target_to_host_timespec64(pts
, timeout
)) {
4182 return -TARGET_EFAULT
;
4185 if (target_to_host_timespec(pts
, timeout
)) {
4186 return -TARGET_EFAULT
;
4191 if (nsops
> TARGET_SEMOPM
) {
4192 return -TARGET_E2BIG
;
4195 sops
= g_new(struct sembuf
, nsops
);
4197 if (target_to_host_sembuf(sops
, ptr
, nsops
)) {
4199 return -TARGET_EFAULT
;
4202 ret
= -TARGET_ENOSYS
;
4203 #ifdef __NR_semtimedop
4204 ret
= get_errno(safe_semtimedop(semid
, sops
, nsops
, pts
));
4207 if (ret
== -TARGET_ENOSYS
) {
4208 ret
= get_errno(safe_ipc(IPCOP_semtimedop
, semid
,
4209 SEMTIMEDOP_IPC_ARGS(nsops
, sops
, (long)pts
)));
4217 struct target_msqid_ds
4219 struct target_ipc_perm msg_perm
;
4220 abi_ulong msg_stime
;
4221 #if TARGET_ABI_BITS == 32
4222 abi_ulong __unused1
;
4224 abi_ulong msg_rtime
;
4225 #if TARGET_ABI_BITS == 32
4226 abi_ulong __unused2
;
4228 abi_ulong msg_ctime
;
4229 #if TARGET_ABI_BITS == 32
4230 abi_ulong __unused3
;
4232 abi_ulong __msg_cbytes
;
4234 abi_ulong msg_qbytes
;
4235 abi_ulong msg_lspid
;
4236 abi_ulong msg_lrpid
;
4237 abi_ulong __unused4
;
4238 abi_ulong __unused5
;
4241 static inline abi_long
target_to_host_msqid_ds(struct msqid_ds
*host_md
,
4242 abi_ulong target_addr
)
4244 struct target_msqid_ds
*target_md
;
4246 if (!lock_user_struct(VERIFY_READ
, target_md
, target_addr
, 1))
4247 return -TARGET_EFAULT
;
4248 if (target_to_host_ipc_perm(&(host_md
->msg_perm
),target_addr
))
4249 return -TARGET_EFAULT
;
4250 host_md
->msg_stime
= tswapal(target_md
->msg_stime
);
4251 host_md
->msg_rtime
= tswapal(target_md
->msg_rtime
);
4252 host_md
->msg_ctime
= tswapal(target_md
->msg_ctime
);
4253 host_md
->__msg_cbytes
= tswapal(target_md
->__msg_cbytes
);
4254 host_md
->msg_qnum
= tswapal(target_md
->msg_qnum
);
4255 host_md
->msg_qbytes
= tswapal(target_md
->msg_qbytes
);
4256 host_md
->msg_lspid
= tswapal(target_md
->msg_lspid
);
4257 host_md
->msg_lrpid
= tswapal(target_md
->msg_lrpid
);
4258 unlock_user_struct(target_md
, target_addr
, 0);
4262 static inline abi_long
host_to_target_msqid_ds(abi_ulong target_addr
,
4263 struct msqid_ds
*host_md
)
4265 struct target_msqid_ds
*target_md
;
4267 if (!lock_user_struct(VERIFY_WRITE
, target_md
, target_addr
, 0))
4268 return -TARGET_EFAULT
;
4269 if (host_to_target_ipc_perm(target_addr
,&(host_md
->msg_perm
)))
4270 return -TARGET_EFAULT
;
4271 target_md
->msg_stime
= tswapal(host_md
->msg_stime
);
4272 target_md
->msg_rtime
= tswapal(host_md
->msg_rtime
);
4273 target_md
->msg_ctime
= tswapal(host_md
->msg_ctime
);
4274 target_md
->__msg_cbytes
= tswapal(host_md
->__msg_cbytes
);
4275 target_md
->msg_qnum
= tswapal(host_md
->msg_qnum
);
4276 target_md
->msg_qbytes
= tswapal(host_md
->msg_qbytes
);
4277 target_md
->msg_lspid
= tswapal(host_md
->msg_lspid
);
4278 target_md
->msg_lrpid
= tswapal(host_md
->msg_lrpid
);
4279 unlock_user_struct(target_md
, target_addr
, 1);
4283 struct target_msginfo
{
4291 unsigned short int msgseg
;
4294 static inline abi_long
host_to_target_msginfo(abi_ulong target_addr
,
4295 struct msginfo
*host_msginfo
)
4297 struct target_msginfo
*target_msginfo
;
4298 if (!lock_user_struct(VERIFY_WRITE
, target_msginfo
, target_addr
, 0))
4299 return -TARGET_EFAULT
;
4300 __put_user(host_msginfo
->msgpool
, &target_msginfo
->msgpool
);
4301 __put_user(host_msginfo
->msgmap
, &target_msginfo
->msgmap
);
4302 __put_user(host_msginfo
->msgmax
, &target_msginfo
->msgmax
);
4303 __put_user(host_msginfo
->msgmnb
, &target_msginfo
->msgmnb
);
4304 __put_user(host_msginfo
->msgmni
, &target_msginfo
->msgmni
);
4305 __put_user(host_msginfo
->msgssz
, &target_msginfo
->msgssz
);
4306 __put_user(host_msginfo
->msgtql
, &target_msginfo
->msgtql
);
4307 __put_user(host_msginfo
->msgseg
, &target_msginfo
->msgseg
);
4308 unlock_user_struct(target_msginfo
, target_addr
, 1);
4312 static inline abi_long
do_msgctl(int msgid
, int cmd
, abi_long ptr
)
4314 struct msqid_ds dsarg
;
4315 struct msginfo msginfo
;
4316 abi_long ret
= -TARGET_EINVAL
;
4324 if (target_to_host_msqid_ds(&dsarg
,ptr
))
4325 return -TARGET_EFAULT
;
4326 ret
= get_errno(msgctl(msgid
, cmd
, &dsarg
));
4327 if (host_to_target_msqid_ds(ptr
,&dsarg
))
4328 return -TARGET_EFAULT
;
4331 ret
= get_errno(msgctl(msgid
, cmd
, NULL
));
4335 ret
= get_errno(msgctl(msgid
, cmd
, (struct msqid_ds
*)&msginfo
));
4336 if (host_to_target_msginfo(ptr
, &msginfo
))
4337 return -TARGET_EFAULT
;
4344 struct target_msgbuf
{
4349 static inline abi_long
do_msgsnd(int msqid
, abi_long msgp
,
4350 ssize_t msgsz
, int msgflg
)
4352 struct target_msgbuf
*target_mb
;
4353 struct msgbuf
*host_mb
;
4357 return -TARGET_EINVAL
;
4360 if (!lock_user_struct(VERIFY_READ
, target_mb
, msgp
, 0))
4361 return -TARGET_EFAULT
;
4362 host_mb
= g_try_malloc(msgsz
+ sizeof(long));
4364 unlock_user_struct(target_mb
, msgp
, 0);
4365 return -TARGET_ENOMEM
;
4367 host_mb
->mtype
= (abi_long
) tswapal(target_mb
->mtype
);
4368 memcpy(host_mb
->mtext
, target_mb
->mtext
, msgsz
);
4369 ret
= -TARGET_ENOSYS
;
4371 ret
= get_errno(safe_msgsnd(msqid
, host_mb
, msgsz
, msgflg
));
4374 if (ret
== -TARGET_ENOSYS
) {
4376 ret
= get_errno(safe_ipc(IPCOP_msgsnd
, msqid
, msgsz
, msgflg
,
4379 ret
= get_errno(safe_ipc(IPCOP_msgsnd
, msqid
, msgsz
, msgflg
,
4385 unlock_user_struct(target_mb
, msgp
, 0);
4391 #if defined(__sparc__)
4392 /* SPARC for msgrcv it does not use the kludge on final 2 arguments. */
4393 #define MSGRCV_ARGS(__msgp, __msgtyp) __msgp, __msgtyp
4394 #elif defined(__s390x__)
4395 /* The s390 sys_ipc variant has only five parameters. */
4396 #define MSGRCV_ARGS(__msgp, __msgtyp) \
4397 ((long int[]){(long int)__msgp, __msgtyp})
4399 #define MSGRCV_ARGS(__msgp, __msgtyp) \
4400 ((long int[]){(long int)__msgp, __msgtyp}), 0
4404 static inline abi_long
do_msgrcv(int msqid
, abi_long msgp
,
4405 ssize_t msgsz
, abi_long msgtyp
,
4408 struct target_msgbuf
*target_mb
;
4410 struct msgbuf
*host_mb
;
4414 return -TARGET_EINVAL
;
4417 if (!lock_user_struct(VERIFY_WRITE
, target_mb
, msgp
, 0))
4418 return -TARGET_EFAULT
;
4420 host_mb
= g_try_malloc(msgsz
+ sizeof(long));
4422 ret
= -TARGET_ENOMEM
;
4425 ret
= -TARGET_ENOSYS
;
4427 ret
= get_errno(safe_msgrcv(msqid
, host_mb
, msgsz
, msgtyp
, msgflg
));
4430 if (ret
== -TARGET_ENOSYS
) {
4431 ret
= get_errno(safe_ipc(IPCOP_CALL(1, IPCOP_msgrcv
), msqid
, msgsz
,
4432 msgflg
, MSGRCV_ARGS(host_mb
, msgtyp
)));
4437 abi_ulong target_mtext_addr
= msgp
+ sizeof(abi_ulong
);
4438 target_mtext
= lock_user(VERIFY_WRITE
, target_mtext_addr
, ret
, 0);
4439 if (!target_mtext
) {
4440 ret
= -TARGET_EFAULT
;
4443 memcpy(target_mb
->mtext
, host_mb
->mtext
, ret
);
4444 unlock_user(target_mtext
, target_mtext_addr
, ret
);
4447 target_mb
->mtype
= tswapal(host_mb
->mtype
);
4451 unlock_user_struct(target_mb
, msgp
, 1);
4456 static inline abi_long
target_to_host_shmid_ds(struct shmid_ds
*host_sd
,
4457 abi_ulong target_addr
)
4459 struct target_shmid_ds
*target_sd
;
4461 if (!lock_user_struct(VERIFY_READ
, target_sd
, target_addr
, 1))
4462 return -TARGET_EFAULT
;
4463 if (target_to_host_ipc_perm(&(host_sd
->shm_perm
), target_addr
))
4464 return -TARGET_EFAULT
;
4465 __get_user(host_sd
->shm_segsz
, &target_sd
->shm_segsz
);
4466 __get_user(host_sd
->shm_atime
, &target_sd
->shm_atime
);
4467 __get_user(host_sd
->shm_dtime
, &target_sd
->shm_dtime
);
4468 __get_user(host_sd
->shm_ctime
, &target_sd
->shm_ctime
);
4469 __get_user(host_sd
->shm_cpid
, &target_sd
->shm_cpid
);
4470 __get_user(host_sd
->shm_lpid
, &target_sd
->shm_lpid
);
4471 __get_user(host_sd
->shm_nattch
, &target_sd
->shm_nattch
);
4472 unlock_user_struct(target_sd
, target_addr
, 0);
4476 static inline abi_long
host_to_target_shmid_ds(abi_ulong target_addr
,
4477 struct shmid_ds
*host_sd
)
4479 struct target_shmid_ds
*target_sd
;
4481 if (!lock_user_struct(VERIFY_WRITE
, target_sd
, target_addr
, 0))
4482 return -TARGET_EFAULT
;
4483 if (host_to_target_ipc_perm(target_addr
, &(host_sd
->shm_perm
)))
4484 return -TARGET_EFAULT
;
4485 __put_user(host_sd
->shm_segsz
, &target_sd
->shm_segsz
);
4486 __put_user(host_sd
->shm_atime
, &target_sd
->shm_atime
);
4487 __put_user(host_sd
->shm_dtime
, &target_sd
->shm_dtime
);
4488 __put_user(host_sd
->shm_ctime
, &target_sd
->shm_ctime
);
4489 __put_user(host_sd
->shm_cpid
, &target_sd
->shm_cpid
);
4490 __put_user(host_sd
->shm_lpid
, &target_sd
->shm_lpid
);
4491 __put_user(host_sd
->shm_nattch
, &target_sd
->shm_nattch
);
4492 unlock_user_struct(target_sd
, target_addr
, 1);
4496 struct target_shminfo
{
4504 static inline abi_long
host_to_target_shminfo(abi_ulong target_addr
,
4505 struct shminfo
*host_shminfo
)
4507 struct target_shminfo
*target_shminfo
;
4508 if (!lock_user_struct(VERIFY_WRITE
, target_shminfo
, target_addr
, 0))
4509 return -TARGET_EFAULT
;
4510 __put_user(host_shminfo
->shmmax
, &target_shminfo
->shmmax
);
4511 __put_user(host_shminfo
->shmmin
, &target_shminfo
->shmmin
);
4512 __put_user(host_shminfo
->shmmni
, &target_shminfo
->shmmni
);
4513 __put_user(host_shminfo
->shmseg
, &target_shminfo
->shmseg
);
4514 __put_user(host_shminfo
->shmall
, &target_shminfo
->shmall
);
4515 unlock_user_struct(target_shminfo
, target_addr
, 1);
4519 struct target_shm_info
{
4524 abi_ulong swap_attempts
;
4525 abi_ulong swap_successes
;
4528 static inline abi_long
host_to_target_shm_info(abi_ulong target_addr
,
4529 struct shm_info
*host_shm_info
)
4531 struct target_shm_info
*target_shm_info
;
4532 if (!lock_user_struct(VERIFY_WRITE
, target_shm_info
, target_addr
, 0))
4533 return -TARGET_EFAULT
;
4534 __put_user(host_shm_info
->used_ids
, &target_shm_info
->used_ids
);
4535 __put_user(host_shm_info
->shm_tot
, &target_shm_info
->shm_tot
);
4536 __put_user(host_shm_info
->shm_rss
, &target_shm_info
->shm_rss
);
4537 __put_user(host_shm_info
->shm_swp
, &target_shm_info
->shm_swp
);
4538 __put_user(host_shm_info
->swap_attempts
, &target_shm_info
->swap_attempts
);
4539 __put_user(host_shm_info
->swap_successes
, &target_shm_info
->swap_successes
);
4540 unlock_user_struct(target_shm_info
, target_addr
, 1);
4544 static inline abi_long
do_shmctl(int shmid
, int cmd
, abi_long buf
)
4546 struct shmid_ds dsarg
;
4547 struct shminfo shminfo
;
4548 struct shm_info shm_info
;
4549 abi_long ret
= -TARGET_EINVAL
;
4557 if (target_to_host_shmid_ds(&dsarg
, buf
))
4558 return -TARGET_EFAULT
;
4559 ret
= get_errno(shmctl(shmid
, cmd
, &dsarg
));
4560 if (host_to_target_shmid_ds(buf
, &dsarg
))
4561 return -TARGET_EFAULT
;
4564 ret
= get_errno(shmctl(shmid
, cmd
, (struct shmid_ds
*)&shminfo
));
4565 if (host_to_target_shminfo(buf
, &shminfo
))
4566 return -TARGET_EFAULT
;
4569 ret
= get_errno(shmctl(shmid
, cmd
, (struct shmid_ds
*)&shm_info
));
4570 if (host_to_target_shm_info(buf
, &shm_info
))
4571 return -TARGET_EFAULT
;
4576 ret
= get_errno(shmctl(shmid
, cmd
, NULL
));
4583 #ifndef TARGET_FORCE_SHMLBA
4584 /* For most architectures, SHMLBA is the same as the page size;
4585 * some architectures have larger values, in which case they should
4586 * define TARGET_FORCE_SHMLBA and provide a target_shmlba() function.
4587 * This corresponds to the kernel arch code defining __ARCH_FORCE_SHMLBA
4588 * and defining its own value for SHMLBA.
4590 * The kernel also permits SHMLBA to be set by the architecture to a
4591 * value larger than the page size without setting __ARCH_FORCE_SHMLBA;
4592 * this means that addresses are rounded to the large size if
4593 * SHM_RND is set but addresses not aligned to that size are not rejected
4594 * as long as they are at least page-aligned. Since the only architecture
4595 * which uses this is ia64 this code doesn't provide for that oddity.
4597 static inline abi_ulong
target_shmlba(CPUArchState
*cpu_env
)
4599 return TARGET_PAGE_SIZE
;
4603 static inline abi_ulong
do_shmat(CPUArchState
*cpu_env
,
4604 int shmid
, abi_ulong shmaddr
, int shmflg
)
4606 CPUState
*cpu
= env_cpu(cpu_env
);
4609 struct shmid_ds shm_info
;
4613 /* shmat pointers are always untagged */
4615 /* find out the length of the shared memory segment */
4616 ret
= get_errno(shmctl(shmid
, IPC_STAT
, &shm_info
));
4617 if (is_error(ret
)) {
4618 /* can't get length, bail out */
4622 shmlba
= target_shmlba(cpu_env
);
4624 if (shmaddr
& (shmlba
- 1)) {
4625 if (shmflg
& SHM_RND
) {
4626 shmaddr
&= ~(shmlba
- 1);
4628 return -TARGET_EINVAL
;
4631 if (!guest_range_valid_untagged(shmaddr
, shm_info
.shm_segsz
)) {
4632 return -TARGET_EINVAL
;
4638 * We're mapping shared memory, so ensure we generate code for parallel
4639 * execution and flush old translations. This will work up to the level
4640 * supported by the host -- anything that requires EXCP_ATOMIC will not
4641 * be atomic with respect to an external process.
4643 if (!(cpu
->tcg_cflags
& CF_PARALLEL
)) {
4644 cpu
->tcg_cflags
|= CF_PARALLEL
;
4649 host_raddr
= shmat(shmid
, (void *)g2h_untagged(shmaddr
), shmflg
);
4651 abi_ulong mmap_start
;
4653 /* In order to use the host shmat, we need to honor host SHMLBA. */
4654 mmap_start
= mmap_find_vma(0, shm_info
.shm_segsz
, MAX(SHMLBA
, shmlba
));
4656 if (mmap_start
== -1) {
4658 host_raddr
= (void *)-1;
4660 host_raddr
= shmat(shmid
, g2h_untagged(mmap_start
),
4661 shmflg
| SHM_REMAP
);
4664 if (host_raddr
== (void *)-1) {
4666 return get_errno((long)host_raddr
);
4668 raddr
=h2g((unsigned long)host_raddr
);
4670 page_set_flags(raddr
, raddr
+ shm_info
.shm_segsz
,
4671 PAGE_VALID
| PAGE_RESET
| PAGE_READ
|
4672 (shmflg
& SHM_RDONLY
? 0 : PAGE_WRITE
));
4674 for (i
= 0; i
< N_SHM_REGIONS
; i
++) {
4675 if (!shm_regions
[i
].in_use
) {
4676 shm_regions
[i
].in_use
= true;
4677 shm_regions
[i
].start
= raddr
;
4678 shm_regions
[i
].size
= shm_info
.shm_segsz
;
4688 static inline abi_long
do_shmdt(abi_ulong shmaddr
)
4693 /* shmdt pointers are always untagged */
4697 for (i
= 0; i
< N_SHM_REGIONS
; ++i
) {
4698 if (shm_regions
[i
].in_use
&& shm_regions
[i
].start
== shmaddr
) {
4699 shm_regions
[i
].in_use
= false;
4700 page_set_flags(shmaddr
, shmaddr
+ shm_regions
[i
].size
, 0);
4704 rv
= get_errno(shmdt(g2h_untagged(shmaddr
)));
4711 #ifdef TARGET_NR_ipc
4712 /* ??? This only works with linear mappings. */
4713 /* do_ipc() must return target values and target errnos. */
4714 static abi_long
do_ipc(CPUArchState
*cpu_env
,
4715 unsigned int call
, abi_long first
,
4716 abi_long second
, abi_long third
,
4717 abi_long ptr
, abi_long fifth
)
4722 version
= call
>> 16;
4727 ret
= do_semtimedop(first
, ptr
, second
, 0, false);
4729 case IPCOP_semtimedop
:
4731 * The s390 sys_ipc variant has only five parameters instead of six
4732 * (as for default variant) and the only difference is the handling of
4733 * SEMTIMEDOP where on s390 the third parameter is used as a pointer
4734 * to a struct timespec where the generic variant uses fifth parameter.
4736 #if defined(TARGET_S390X)
4737 ret
= do_semtimedop(first
, ptr
, second
, third
, TARGET_ABI_BITS
== 64);
4739 ret
= do_semtimedop(first
, ptr
, second
, fifth
, TARGET_ABI_BITS
== 64);
4744 ret
= get_errno(semget(first
, second
, third
));
4747 case IPCOP_semctl
: {
4748 /* The semun argument to semctl is passed by value, so dereference the
4751 get_user_ual(atptr
, ptr
);
4752 ret
= do_semctl(first
, second
, third
, atptr
);
4757 ret
= get_errno(msgget(first
, second
));
4761 ret
= do_msgsnd(first
, ptr
, second
, third
);
4765 ret
= do_msgctl(first
, second
, ptr
);
4772 struct target_ipc_kludge
{
4777 if (!lock_user_struct(VERIFY_READ
, tmp
, ptr
, 1)) {
4778 ret
= -TARGET_EFAULT
;
4782 ret
= do_msgrcv(first
, tswapal(tmp
->msgp
), second
, tswapal(tmp
->msgtyp
), third
);
4784 unlock_user_struct(tmp
, ptr
, 0);
4788 ret
= do_msgrcv(first
, ptr
, second
, fifth
, third
);
4797 raddr
= do_shmat(cpu_env
, first
, ptr
, second
);
4798 if (is_error(raddr
))
4799 return get_errno(raddr
);
4800 if (put_user_ual(raddr
, third
))
4801 return -TARGET_EFAULT
;
4805 ret
= -TARGET_EINVAL
;
4810 ret
= do_shmdt(ptr
);
4814 /* IPC_* flag values are the same on all linux platforms */
4815 ret
= get_errno(shmget(first
, second
, third
));
4818 /* IPC_* and SHM_* command values are the same on all linux platforms */
4820 ret
= do_shmctl(first
, second
, ptr
);
4823 qemu_log_mask(LOG_UNIMP
, "Unsupported ipc call: %d (version %d)\n",
4825 ret
= -TARGET_ENOSYS
;
4832 /* kernel structure types definitions */
4834 #define STRUCT(name, ...) STRUCT_ ## name,
4835 #define STRUCT_SPECIAL(name) STRUCT_ ## name,
4837 #include "syscall_types.h"
4841 #undef STRUCT_SPECIAL
4843 #define STRUCT(name, ...) static const argtype struct_ ## name ## _def[] = { __VA_ARGS__, TYPE_NULL };
4844 #define STRUCT_SPECIAL(name)
4845 #include "syscall_types.h"
4847 #undef STRUCT_SPECIAL
4849 #define MAX_STRUCT_SIZE 4096
4851 #ifdef CONFIG_FIEMAP
4852 /* So fiemap access checks don't overflow on 32 bit systems.
4853 * This is very slightly smaller than the limit imposed by
4854 * the underlying kernel.
4856 #define FIEMAP_MAX_EXTENTS ((UINT_MAX - sizeof(struct fiemap)) \
4857 / sizeof(struct fiemap_extent))
4859 static abi_long
do_ioctl_fs_ioc_fiemap(const IOCTLEntry
*ie
, uint8_t *buf_temp
,
4860 int fd
, int cmd
, abi_long arg
)
4862 /* The parameter for this ioctl is a struct fiemap followed
4863 * by an array of struct fiemap_extent whose size is set
4864 * in fiemap->fm_extent_count. The array is filled in by the
4867 int target_size_in
, target_size_out
;
4869 const argtype
*arg_type
= ie
->arg_type
;
4870 const argtype extent_arg_type
[] = { MK_STRUCT(STRUCT_fiemap_extent
) };
4873 int i
, extent_size
= thunk_type_size(extent_arg_type
, 0);
4877 assert(arg_type
[0] == TYPE_PTR
);
4878 assert(ie
->access
== IOC_RW
);
4880 target_size_in
= thunk_type_size(arg_type
, 0);
4881 argptr
= lock_user(VERIFY_READ
, arg
, target_size_in
, 1);
4883 return -TARGET_EFAULT
;
4885 thunk_convert(buf_temp
, argptr
, arg_type
, THUNK_HOST
);
4886 unlock_user(argptr
, arg
, 0);
4887 fm
= (struct fiemap
*)buf_temp
;
4888 if (fm
->fm_extent_count
> FIEMAP_MAX_EXTENTS
) {
4889 return -TARGET_EINVAL
;
4892 outbufsz
= sizeof (*fm
) +
4893 (sizeof(struct fiemap_extent
) * fm
->fm_extent_count
);
4895 if (outbufsz
> MAX_STRUCT_SIZE
) {
4896 /* We can't fit all the extents into the fixed size buffer.
4897 * Allocate one that is large enough and use it instead.
4899 fm
= g_try_malloc(outbufsz
);
4901 return -TARGET_ENOMEM
;
4903 memcpy(fm
, buf_temp
, sizeof(struct fiemap
));
4906 ret
= get_errno(safe_ioctl(fd
, ie
->host_cmd
, fm
));
4907 if (!is_error(ret
)) {
4908 target_size_out
= target_size_in
;
4909 /* An extent_count of 0 means we were only counting the extents
4910 * so there are no structs to copy
4912 if (fm
->fm_extent_count
!= 0) {
4913 target_size_out
+= fm
->fm_mapped_extents
* extent_size
;
4915 argptr
= lock_user(VERIFY_WRITE
, arg
, target_size_out
, 0);
4917 ret
= -TARGET_EFAULT
;
4919 /* Convert the struct fiemap */
4920 thunk_convert(argptr
, fm
, arg_type
, THUNK_TARGET
);
4921 if (fm
->fm_extent_count
!= 0) {
4922 p
= argptr
+ target_size_in
;
4923 /* ...and then all the struct fiemap_extents */
4924 for (i
= 0; i
< fm
->fm_mapped_extents
; i
++) {
4925 thunk_convert(p
, &fm
->fm_extents
[i
], extent_arg_type
,
4930 unlock_user(argptr
, arg
, target_size_out
);
4940 static abi_long
do_ioctl_ifconf(const IOCTLEntry
*ie
, uint8_t *buf_temp
,
4941 int fd
, int cmd
, abi_long arg
)
4943 const argtype
*arg_type
= ie
->arg_type
;
4947 struct ifconf
*host_ifconf
;
4949 const argtype ifreq_arg_type
[] = { MK_STRUCT(STRUCT_sockaddr_ifreq
) };
4950 const argtype ifreq_max_type
[] = { MK_STRUCT(STRUCT_ifmap_ifreq
) };
4951 int target_ifreq_size
;
4956 abi_long target_ifc_buf
;
4960 assert(arg_type
[0] == TYPE_PTR
);
4961 assert(ie
->access
== IOC_RW
);
4964 target_size
= thunk_type_size(arg_type
, 0);
4966 argptr
= lock_user(VERIFY_READ
, arg
, target_size
, 1);
4968 return -TARGET_EFAULT
;
4969 thunk_convert(buf_temp
, argptr
, arg_type
, THUNK_HOST
);
4970 unlock_user(argptr
, arg
, 0);
4972 host_ifconf
= (struct ifconf
*)(unsigned long)buf_temp
;
4973 target_ifc_buf
= (abi_long
)(unsigned long)host_ifconf
->ifc_buf
;
4974 target_ifreq_size
= thunk_type_size(ifreq_max_type
, 0);
4976 if (target_ifc_buf
!= 0) {
4977 target_ifc_len
= host_ifconf
->ifc_len
;
4978 nb_ifreq
= target_ifc_len
/ target_ifreq_size
;
4979 host_ifc_len
= nb_ifreq
* sizeof(struct ifreq
);
4981 outbufsz
= sizeof(*host_ifconf
) + host_ifc_len
;
4982 if (outbufsz
> MAX_STRUCT_SIZE
) {
4984 * We can't fit all the extents into the fixed size buffer.
4985 * Allocate one that is large enough and use it instead.
4987 host_ifconf
= malloc(outbufsz
);
4989 return -TARGET_ENOMEM
;
4991 memcpy(host_ifconf
, buf_temp
, sizeof(*host_ifconf
));
4994 host_ifc_buf
= (char *)host_ifconf
+ sizeof(*host_ifconf
);
4996 host_ifconf
->ifc_len
= host_ifc_len
;
4998 host_ifc_buf
= NULL
;
5000 host_ifconf
->ifc_buf
= host_ifc_buf
;
5002 ret
= get_errno(safe_ioctl(fd
, ie
->host_cmd
, host_ifconf
));
5003 if (!is_error(ret
)) {
5004 /* convert host ifc_len to target ifc_len */
5006 nb_ifreq
= host_ifconf
->ifc_len
/ sizeof(struct ifreq
);
5007 target_ifc_len
= nb_ifreq
* target_ifreq_size
;
5008 host_ifconf
->ifc_len
= target_ifc_len
;
5010 /* restore target ifc_buf */
5012 host_ifconf
->ifc_buf
= (char *)(unsigned long)target_ifc_buf
;
5014 /* copy struct ifconf to target user */
5016 argptr
= lock_user(VERIFY_WRITE
, arg
, target_size
, 0);
5018 return -TARGET_EFAULT
;
5019 thunk_convert(argptr
, host_ifconf
, arg_type
, THUNK_TARGET
);
5020 unlock_user(argptr
, arg
, target_size
);
5022 if (target_ifc_buf
!= 0) {
5023 /* copy ifreq[] to target user */
5024 argptr
= lock_user(VERIFY_WRITE
, target_ifc_buf
, target_ifc_len
, 0);
5025 for (i
= 0; i
< nb_ifreq
; i
++) {
5026 thunk_convert(argptr
+ i
* target_ifreq_size
,
5027 host_ifc_buf
+ i
* sizeof(struct ifreq
),
5028 ifreq_arg_type
, THUNK_TARGET
);
5030 unlock_user(argptr
, target_ifc_buf
, target_ifc_len
);
5041 #if defined(CONFIG_USBFS)
5042 #if HOST_LONG_BITS > 64
5043 #error USBDEVFS thunks do not support >64 bit hosts yet.
5046 uint64_t target_urb_adr
;
5047 uint64_t target_buf_adr
;
5048 char *target_buf_ptr
;
5049 struct usbdevfs_urb host_urb
;
5052 static GHashTable
*usbdevfs_urb_hashtable(void)
5054 static GHashTable
*urb_hashtable
;
5056 if (!urb_hashtable
) {
5057 urb_hashtable
= g_hash_table_new(g_int64_hash
, g_int64_equal
);
5059 return urb_hashtable
;
5062 static void urb_hashtable_insert(struct live_urb
*urb
)
5064 GHashTable
*urb_hashtable
= usbdevfs_urb_hashtable();
5065 g_hash_table_insert(urb_hashtable
, urb
, urb
);
5068 static struct live_urb
*urb_hashtable_lookup(uint64_t target_urb_adr
)
5070 GHashTable
*urb_hashtable
= usbdevfs_urb_hashtable();
5071 return g_hash_table_lookup(urb_hashtable
, &target_urb_adr
);
5074 static void urb_hashtable_remove(struct live_urb
*urb
)
5076 GHashTable
*urb_hashtable
= usbdevfs_urb_hashtable();
5077 g_hash_table_remove(urb_hashtable
, urb
);
5081 do_ioctl_usbdevfs_reapurb(const IOCTLEntry
*ie
, uint8_t *buf_temp
,
5082 int fd
, int cmd
, abi_long arg
)
5084 const argtype usbfsurb_arg_type
[] = { MK_STRUCT(STRUCT_usbdevfs_urb
) };
5085 const argtype ptrvoid_arg_type
[] = { TYPE_PTRVOID
, 0, 0 };
5086 struct live_urb
*lurb
;
5090 uintptr_t target_urb_adr
;
5093 target_size
= thunk_type_size(usbfsurb_arg_type
, THUNK_TARGET
);
5095 memset(buf_temp
, 0, sizeof(uint64_t));
5096 ret
= get_errno(safe_ioctl(fd
, ie
->host_cmd
, buf_temp
));
5097 if (is_error(ret
)) {
5101 memcpy(&hurb
, buf_temp
, sizeof(uint64_t));
5102 lurb
= (void *)((uintptr_t)hurb
- offsetof(struct live_urb
, host_urb
));
5103 if (!lurb
->target_urb_adr
) {
5104 return -TARGET_EFAULT
;
5106 urb_hashtable_remove(lurb
);
5107 unlock_user(lurb
->target_buf_ptr
, lurb
->target_buf_adr
,
5108 lurb
->host_urb
.buffer_length
);
5109 lurb
->target_buf_ptr
= NULL
;
5111 /* restore the guest buffer pointer */
5112 lurb
->host_urb
.buffer
= (void *)(uintptr_t)lurb
->target_buf_adr
;
5114 /* update the guest urb struct */
5115 argptr
= lock_user(VERIFY_WRITE
, lurb
->target_urb_adr
, target_size
, 0);
5118 return -TARGET_EFAULT
;
5120 thunk_convert(argptr
, &lurb
->host_urb
, usbfsurb_arg_type
, THUNK_TARGET
);
5121 unlock_user(argptr
, lurb
->target_urb_adr
, target_size
);
5123 target_size
= thunk_type_size(ptrvoid_arg_type
, THUNK_TARGET
);
5124 /* write back the urb handle */
5125 argptr
= lock_user(VERIFY_WRITE
, arg
, target_size
, 0);
5128 return -TARGET_EFAULT
;
5131 /* GHashTable uses 64-bit keys but thunk_convert expects uintptr_t */
5132 target_urb_adr
= lurb
->target_urb_adr
;
5133 thunk_convert(argptr
, &target_urb_adr
, ptrvoid_arg_type
, THUNK_TARGET
);
5134 unlock_user(argptr
, arg
, target_size
);
5141 do_ioctl_usbdevfs_discardurb(const IOCTLEntry
*ie
,
5142 uint8_t *buf_temp
__attribute__((unused
)),
5143 int fd
, int cmd
, abi_long arg
)
5145 struct live_urb
*lurb
;
5147 /* map target address back to host URB with metadata. */
5148 lurb
= urb_hashtable_lookup(arg
);
5150 return -TARGET_EFAULT
;
5152 return get_errno(safe_ioctl(fd
, ie
->host_cmd
, &lurb
->host_urb
));
5156 do_ioctl_usbdevfs_submiturb(const IOCTLEntry
*ie
, uint8_t *buf_temp
,
5157 int fd
, int cmd
, abi_long arg
)
5159 const argtype
*arg_type
= ie
->arg_type
;
5164 struct live_urb
*lurb
;
5167 * each submitted URB needs to map to a unique ID for the
5168 * kernel, and that unique ID needs to be a pointer to
5169 * host memory. hence, we need to malloc for each URB.
5170 * isochronous transfers have a variable length struct.
5173 target_size
= thunk_type_size(arg_type
, THUNK_TARGET
);
5175 /* construct host copy of urb and metadata */
5176 lurb
= g_try_malloc0(sizeof(struct live_urb
));
5178 return -TARGET_ENOMEM
;
5181 argptr
= lock_user(VERIFY_READ
, arg
, target_size
, 1);
5184 return -TARGET_EFAULT
;
5186 thunk_convert(&lurb
->host_urb
, argptr
, arg_type
, THUNK_HOST
);
5187 unlock_user(argptr
, arg
, 0);
5189 lurb
->target_urb_adr
= arg
;
5190 lurb
->target_buf_adr
= (uintptr_t)lurb
->host_urb
.buffer
;
5192 /* buffer space used depends on endpoint type so lock the entire buffer */
5193 /* control type urbs should check the buffer contents for true direction */
5194 rw_dir
= lurb
->host_urb
.endpoint
& USB_DIR_IN
? VERIFY_WRITE
: VERIFY_READ
;
5195 lurb
->target_buf_ptr
= lock_user(rw_dir
, lurb
->target_buf_adr
,
5196 lurb
->host_urb
.buffer_length
, 1);
5197 if (lurb
->target_buf_ptr
== NULL
) {
5199 return -TARGET_EFAULT
;
5202 /* update buffer pointer in host copy */
5203 lurb
->host_urb
.buffer
= lurb
->target_buf_ptr
;
5205 ret
= get_errno(safe_ioctl(fd
, ie
->host_cmd
, &lurb
->host_urb
));
5206 if (is_error(ret
)) {
5207 unlock_user(lurb
->target_buf_ptr
, lurb
->target_buf_adr
, 0);
5210 urb_hashtable_insert(lurb
);
5215 #endif /* CONFIG_USBFS */
5217 static abi_long
do_ioctl_dm(const IOCTLEntry
*ie
, uint8_t *buf_temp
, int fd
,
5218 int cmd
, abi_long arg
)
5221 struct dm_ioctl
*host_dm
;
5222 abi_long guest_data
;
5223 uint32_t guest_data_size
;
5225 const argtype
*arg_type
= ie
->arg_type
;
5227 void *big_buf
= NULL
;
5231 target_size
= thunk_type_size(arg_type
, 0);
5232 argptr
= lock_user(VERIFY_READ
, arg
, target_size
, 1);
5234 ret
= -TARGET_EFAULT
;
5237 thunk_convert(buf_temp
, argptr
, arg_type
, THUNK_HOST
);
5238 unlock_user(argptr
, arg
, 0);
5240 /* buf_temp is too small, so fetch things into a bigger buffer */
5241 big_buf
= g_malloc0(((struct dm_ioctl
*)buf_temp
)->data_size
* 2);
5242 memcpy(big_buf
, buf_temp
, target_size
);
5246 guest_data
= arg
+ host_dm
->data_start
;
5247 if ((guest_data
- arg
) < 0) {
5248 ret
= -TARGET_EINVAL
;
5251 guest_data_size
= host_dm
->data_size
- host_dm
->data_start
;
5252 host_data
= (char*)host_dm
+ host_dm
->data_start
;
5254 argptr
= lock_user(VERIFY_READ
, guest_data
, guest_data_size
, 1);
5256 ret
= -TARGET_EFAULT
;
5260 switch (ie
->host_cmd
) {
5262 case DM_LIST_DEVICES
:
5265 case DM_DEV_SUSPEND
:
5268 case DM_TABLE_STATUS
:
5269 case DM_TABLE_CLEAR
:
5271 case DM_LIST_VERSIONS
:
5275 case DM_DEV_SET_GEOMETRY
:
5276 /* data contains only strings */
5277 memcpy(host_data
, argptr
, guest_data_size
);
5280 memcpy(host_data
, argptr
, guest_data_size
);
5281 *(uint64_t*)host_data
= tswap64(*(uint64_t*)argptr
);
5285 void *gspec
= argptr
;
5286 void *cur_data
= host_data
;
5287 const argtype arg_type
[] = { MK_STRUCT(STRUCT_dm_target_spec
) };
5288 int spec_size
= thunk_type_size(arg_type
, 0);
5291 for (i
= 0; i
< host_dm
->target_count
; i
++) {
5292 struct dm_target_spec
*spec
= cur_data
;
5296 thunk_convert(spec
, gspec
, arg_type
, THUNK_HOST
);
5297 slen
= strlen((char*)gspec
+ spec_size
) + 1;
5299 spec
->next
= sizeof(*spec
) + slen
;
5300 strcpy((char*)&spec
[1], gspec
+ spec_size
);
5302 cur_data
+= spec
->next
;
5307 ret
= -TARGET_EINVAL
;
5308 unlock_user(argptr
, guest_data
, 0);
5311 unlock_user(argptr
, guest_data
, 0);
5313 ret
= get_errno(safe_ioctl(fd
, ie
->host_cmd
, buf_temp
));
5314 if (!is_error(ret
)) {
5315 guest_data
= arg
+ host_dm
->data_start
;
5316 guest_data_size
= host_dm
->data_size
- host_dm
->data_start
;
5317 argptr
= lock_user(VERIFY_WRITE
, guest_data
, guest_data_size
, 0);
5318 switch (ie
->host_cmd
) {
5323 case DM_DEV_SUSPEND
:
5326 case DM_TABLE_CLEAR
:
5328 case DM_DEV_SET_GEOMETRY
:
5329 /* no return data */
5331 case DM_LIST_DEVICES
:
5333 struct dm_name_list
*nl
= (void*)host_dm
+ host_dm
->data_start
;
5334 uint32_t remaining_data
= guest_data_size
;
5335 void *cur_data
= argptr
;
5336 const argtype arg_type
[] = { MK_STRUCT(STRUCT_dm_name_list
) };
5337 int nl_size
= 12; /* can't use thunk_size due to alignment */
5340 uint32_t next
= nl
->next
;
5342 nl
->next
= nl_size
+ (strlen(nl
->name
) + 1);
5344 if (remaining_data
< nl
->next
) {
5345 host_dm
->flags
|= DM_BUFFER_FULL_FLAG
;
5348 thunk_convert(cur_data
, nl
, arg_type
, THUNK_TARGET
);
5349 strcpy(cur_data
+ nl_size
, nl
->name
);
5350 cur_data
+= nl
->next
;
5351 remaining_data
-= nl
->next
;
5355 nl
= (void*)nl
+ next
;
5360 case DM_TABLE_STATUS
:
5362 struct dm_target_spec
*spec
= (void*)host_dm
+ host_dm
->data_start
;
5363 void *cur_data
= argptr
;
5364 const argtype arg_type
[] = { MK_STRUCT(STRUCT_dm_target_spec
) };
5365 int spec_size
= thunk_type_size(arg_type
, 0);
5368 for (i
= 0; i
< host_dm
->target_count
; i
++) {
5369 uint32_t next
= spec
->next
;
5370 int slen
= strlen((char*)&spec
[1]) + 1;
5371 spec
->next
= (cur_data
- argptr
) + spec_size
+ slen
;
5372 if (guest_data_size
< spec
->next
) {
5373 host_dm
->flags
|= DM_BUFFER_FULL_FLAG
;
5376 thunk_convert(cur_data
, spec
, arg_type
, THUNK_TARGET
);
5377 strcpy(cur_data
+ spec_size
, (char*)&spec
[1]);
5378 cur_data
= argptr
+ spec
->next
;
5379 spec
= (void*)host_dm
+ host_dm
->data_start
+ next
;
5385 void *hdata
= (void*)host_dm
+ host_dm
->data_start
;
5386 int count
= *(uint32_t*)hdata
;
5387 uint64_t *hdev
= hdata
+ 8;
5388 uint64_t *gdev
= argptr
+ 8;
5391 *(uint32_t*)argptr
= tswap32(count
);
5392 for (i
= 0; i
< count
; i
++) {
5393 *gdev
= tswap64(*hdev
);
5399 case DM_LIST_VERSIONS
:
5401 struct dm_target_versions
*vers
= (void*)host_dm
+ host_dm
->data_start
;
5402 uint32_t remaining_data
= guest_data_size
;
5403 void *cur_data
= argptr
;
5404 const argtype arg_type
[] = { MK_STRUCT(STRUCT_dm_target_versions
) };
5405 int vers_size
= thunk_type_size(arg_type
, 0);
5408 uint32_t next
= vers
->next
;
5410 vers
->next
= vers_size
+ (strlen(vers
->name
) + 1);
5412 if (remaining_data
< vers
->next
) {
5413 host_dm
->flags
|= DM_BUFFER_FULL_FLAG
;
5416 thunk_convert(cur_data
, vers
, arg_type
, THUNK_TARGET
);
5417 strcpy(cur_data
+ vers_size
, vers
->name
);
5418 cur_data
+= vers
->next
;
5419 remaining_data
-= vers
->next
;
5423 vers
= (void*)vers
+ next
;
5428 unlock_user(argptr
, guest_data
, 0);
5429 ret
= -TARGET_EINVAL
;
5432 unlock_user(argptr
, guest_data
, guest_data_size
);
5434 argptr
= lock_user(VERIFY_WRITE
, arg
, target_size
, 0);
5436 ret
= -TARGET_EFAULT
;
5439 thunk_convert(argptr
, buf_temp
, arg_type
, THUNK_TARGET
);
5440 unlock_user(argptr
, arg
, target_size
);
5447 static abi_long
do_ioctl_blkpg(const IOCTLEntry
*ie
, uint8_t *buf_temp
, int fd
,
5448 int cmd
, abi_long arg
)
5452 const argtype
*arg_type
= ie
->arg_type
;
5453 const argtype part_arg_type
[] = { MK_STRUCT(STRUCT_blkpg_partition
) };
5456 struct blkpg_ioctl_arg
*host_blkpg
= (void*)buf_temp
;
5457 struct blkpg_partition host_part
;
5459 /* Read and convert blkpg */
5461 target_size
= thunk_type_size(arg_type
, 0);
5462 argptr
= lock_user(VERIFY_READ
, arg
, target_size
, 1);
5464 ret
= -TARGET_EFAULT
;
5467 thunk_convert(buf_temp
, argptr
, arg_type
, THUNK_HOST
);
5468 unlock_user(argptr
, arg
, 0);
5470 switch (host_blkpg
->op
) {
5471 case BLKPG_ADD_PARTITION
:
5472 case BLKPG_DEL_PARTITION
:
5473 /* payload is struct blkpg_partition */
5476 /* Unknown opcode */
5477 ret
= -TARGET_EINVAL
;
5481 /* Read and convert blkpg->data */
5482 arg
= (abi_long
)(uintptr_t)host_blkpg
->data
;
5483 target_size
= thunk_type_size(part_arg_type
, 0);
5484 argptr
= lock_user(VERIFY_READ
, arg
, target_size
, 1);
5486 ret
= -TARGET_EFAULT
;
5489 thunk_convert(&host_part
, argptr
, part_arg_type
, THUNK_HOST
);
5490 unlock_user(argptr
, arg
, 0);
5492 /* Swizzle the data pointer to our local copy and call! */
5493 host_blkpg
->data
= &host_part
;
5494 ret
= get_errno(safe_ioctl(fd
, ie
->host_cmd
, host_blkpg
));
5500 static abi_long
do_ioctl_rt(const IOCTLEntry
*ie
, uint8_t *buf_temp
,
5501 int fd
, int cmd
, abi_long arg
)
5503 const argtype
*arg_type
= ie
->arg_type
;
5504 const StructEntry
*se
;
5505 const argtype
*field_types
;
5506 const int *dst_offsets
, *src_offsets
;
5509 abi_ulong
*target_rt_dev_ptr
= NULL
;
5510 unsigned long *host_rt_dev_ptr
= NULL
;
5514 assert(ie
->access
== IOC_W
);
5515 assert(*arg_type
== TYPE_PTR
);
5517 assert(*arg_type
== TYPE_STRUCT
);
5518 target_size
= thunk_type_size(arg_type
, 0);
5519 argptr
= lock_user(VERIFY_READ
, arg
, target_size
, 1);
5521 return -TARGET_EFAULT
;
5524 assert(*arg_type
== (int)STRUCT_rtentry
);
5525 se
= struct_entries
+ *arg_type
++;
5526 assert(se
->convert
[0] == NULL
);
5527 /* convert struct here to be able to catch rt_dev string */
5528 field_types
= se
->field_types
;
5529 dst_offsets
= se
->field_offsets
[THUNK_HOST
];
5530 src_offsets
= se
->field_offsets
[THUNK_TARGET
];
5531 for (i
= 0; i
< se
->nb_fields
; i
++) {
5532 if (dst_offsets
[i
] == offsetof(struct rtentry
, rt_dev
)) {
5533 assert(*field_types
== TYPE_PTRVOID
);
5534 target_rt_dev_ptr
= (abi_ulong
*)(argptr
+ src_offsets
[i
]);
5535 host_rt_dev_ptr
= (unsigned long *)(buf_temp
+ dst_offsets
[i
]);
5536 if (*target_rt_dev_ptr
!= 0) {
5537 *host_rt_dev_ptr
= (unsigned long)lock_user_string(
5538 tswapal(*target_rt_dev_ptr
));
5539 if (!*host_rt_dev_ptr
) {
5540 unlock_user(argptr
, arg
, 0);
5541 return -TARGET_EFAULT
;
5544 *host_rt_dev_ptr
= 0;
5549 field_types
= thunk_convert(buf_temp
+ dst_offsets
[i
],
5550 argptr
+ src_offsets
[i
],
5551 field_types
, THUNK_HOST
);
5553 unlock_user(argptr
, arg
, 0);
5555 ret
= get_errno(safe_ioctl(fd
, ie
->host_cmd
, buf_temp
));
5557 assert(host_rt_dev_ptr
!= NULL
);
5558 assert(target_rt_dev_ptr
!= NULL
);
5559 if (*host_rt_dev_ptr
!= 0) {
5560 unlock_user((void *)*host_rt_dev_ptr
,
5561 *target_rt_dev_ptr
, 0);
5566 static abi_long
do_ioctl_kdsigaccept(const IOCTLEntry
*ie
, uint8_t *buf_temp
,
5567 int fd
, int cmd
, abi_long arg
)
5569 int sig
= target_to_host_signal(arg
);
5570 return get_errno(safe_ioctl(fd
, ie
->host_cmd
, sig
));
5573 static abi_long
do_ioctl_SIOCGSTAMP(const IOCTLEntry
*ie
, uint8_t *buf_temp
,
5574 int fd
, int cmd
, abi_long arg
)
5579 ret
= get_errno(safe_ioctl(fd
, SIOCGSTAMP
, &tv
));
5580 if (is_error(ret
)) {
5584 if (cmd
== (int)TARGET_SIOCGSTAMP_OLD
) {
5585 if (copy_to_user_timeval(arg
, &tv
)) {
5586 return -TARGET_EFAULT
;
5589 if (copy_to_user_timeval64(arg
, &tv
)) {
5590 return -TARGET_EFAULT
;
5597 static abi_long
do_ioctl_SIOCGSTAMPNS(const IOCTLEntry
*ie
, uint8_t *buf_temp
,
5598 int fd
, int cmd
, abi_long arg
)
5603 ret
= get_errno(safe_ioctl(fd
, SIOCGSTAMPNS
, &ts
));
5604 if (is_error(ret
)) {
5608 if (cmd
== (int)TARGET_SIOCGSTAMPNS_OLD
) {
5609 if (host_to_target_timespec(arg
, &ts
)) {
5610 return -TARGET_EFAULT
;
5613 if (host_to_target_timespec64(arg
, &ts
)) {
5614 return -TARGET_EFAULT
;
5622 static abi_long
do_ioctl_tiocgptpeer(const IOCTLEntry
*ie
, uint8_t *buf_temp
,
5623 int fd
, int cmd
, abi_long arg
)
5625 int flags
= target_to_host_bitmask(arg
, fcntl_flags_tbl
);
5626 return get_errno(safe_ioctl(fd
, ie
->host_cmd
, flags
));
5632 static void unlock_drm_version(struct drm_version
*host_ver
,
5633 struct target_drm_version
*target_ver
,
5636 unlock_user(host_ver
->name
, target_ver
->name
,
5637 copy
? host_ver
->name_len
: 0);
5638 unlock_user(host_ver
->date
, target_ver
->date
,
5639 copy
? host_ver
->date_len
: 0);
5640 unlock_user(host_ver
->desc
, target_ver
->desc
,
5641 copy
? host_ver
->desc_len
: 0);
5644 static inline abi_long
target_to_host_drmversion(struct drm_version
*host_ver
,
5645 struct target_drm_version
*target_ver
)
5647 memset(host_ver
, 0, sizeof(*host_ver
));
5649 __get_user(host_ver
->name_len
, &target_ver
->name_len
);
5650 if (host_ver
->name_len
) {
5651 host_ver
->name
= lock_user(VERIFY_WRITE
, target_ver
->name
,
5652 target_ver
->name_len
, 0);
5653 if (!host_ver
->name
) {
5658 __get_user(host_ver
->date_len
, &target_ver
->date_len
);
5659 if (host_ver
->date_len
) {
5660 host_ver
->date
= lock_user(VERIFY_WRITE
, target_ver
->date
,
5661 target_ver
->date_len
, 0);
5662 if (!host_ver
->date
) {
5667 __get_user(host_ver
->desc_len
, &target_ver
->desc_len
);
5668 if (host_ver
->desc_len
) {
5669 host_ver
->desc
= lock_user(VERIFY_WRITE
, target_ver
->desc
,
5670 target_ver
->desc_len
, 0);
5671 if (!host_ver
->desc
) {
5678 unlock_drm_version(host_ver
, target_ver
, false);
5682 static inline void host_to_target_drmversion(
5683 struct target_drm_version
*target_ver
,
5684 struct drm_version
*host_ver
)
5686 __put_user(host_ver
->version_major
, &target_ver
->version_major
);
5687 __put_user(host_ver
->version_minor
, &target_ver
->version_minor
);
5688 __put_user(host_ver
->version_patchlevel
, &target_ver
->version_patchlevel
);
5689 __put_user(host_ver
->name_len
, &target_ver
->name_len
);
5690 __put_user(host_ver
->date_len
, &target_ver
->date_len
);
5691 __put_user(host_ver
->desc_len
, &target_ver
->desc_len
);
5692 unlock_drm_version(host_ver
, target_ver
, true);
5695 static abi_long
do_ioctl_drm(const IOCTLEntry
*ie
, uint8_t *buf_temp
,
5696 int fd
, int cmd
, abi_long arg
)
5698 struct drm_version
*ver
;
5699 struct target_drm_version
*target_ver
;
5702 switch (ie
->host_cmd
) {
5703 case DRM_IOCTL_VERSION
:
5704 if (!lock_user_struct(VERIFY_WRITE
, target_ver
, arg
, 0)) {
5705 return -TARGET_EFAULT
;
5707 ver
= (struct drm_version
*)buf_temp
;
5708 ret
= target_to_host_drmversion(ver
, target_ver
);
5709 if (!is_error(ret
)) {
5710 ret
= get_errno(safe_ioctl(fd
, ie
->host_cmd
, ver
));
5711 if (is_error(ret
)) {
5712 unlock_drm_version(ver
, target_ver
, false);
5714 host_to_target_drmversion(target_ver
, ver
);
5717 unlock_user_struct(target_ver
, arg
, 0);
5720 return -TARGET_ENOSYS
;
5723 static abi_long
do_ioctl_drm_i915_getparam(const IOCTLEntry
*ie
,
5724 struct drm_i915_getparam
*gparam
,
5725 int fd
, abi_long arg
)
5729 struct target_drm_i915_getparam
*target_gparam
;
5731 if (!lock_user_struct(VERIFY_READ
, target_gparam
, arg
, 0)) {
5732 return -TARGET_EFAULT
;
5735 __get_user(gparam
->param
, &target_gparam
->param
);
5736 gparam
->value
= &value
;
5737 ret
= get_errno(safe_ioctl(fd
, ie
->host_cmd
, gparam
));
5738 put_user_s32(value
, target_gparam
->value
);
5740 unlock_user_struct(target_gparam
, arg
, 0);
5744 static abi_long
do_ioctl_drm_i915(const IOCTLEntry
*ie
, uint8_t *buf_temp
,
5745 int fd
, int cmd
, abi_long arg
)
5747 switch (ie
->host_cmd
) {
5748 case DRM_IOCTL_I915_GETPARAM
:
5749 return do_ioctl_drm_i915_getparam(ie
,
5750 (struct drm_i915_getparam
*)buf_temp
,
5753 return -TARGET_ENOSYS
;
5759 static abi_long
do_ioctl_TUNSETTXFILTER(const IOCTLEntry
*ie
, uint8_t *buf_temp
,
5760 int fd
, int cmd
, abi_long arg
)
5762 struct tun_filter
*filter
= (struct tun_filter
*)buf_temp
;
5763 struct tun_filter
*target_filter
;
5766 assert(ie
->access
== IOC_W
);
5768 target_filter
= lock_user(VERIFY_READ
, arg
, sizeof(*target_filter
), 1);
5769 if (!target_filter
) {
5770 return -TARGET_EFAULT
;
5772 filter
->flags
= tswap16(target_filter
->flags
);
5773 filter
->count
= tswap16(target_filter
->count
);
5774 unlock_user(target_filter
, arg
, 0);
5776 if (filter
->count
) {
5777 if (offsetof(struct tun_filter
, addr
) + filter
->count
* ETH_ALEN
>
5779 return -TARGET_EFAULT
;
5782 target_addr
= lock_user(VERIFY_READ
,
5783 arg
+ offsetof(struct tun_filter
, addr
),
5784 filter
->count
* ETH_ALEN
, 1);
5786 return -TARGET_EFAULT
;
5788 memcpy(filter
->addr
, target_addr
, filter
->count
* ETH_ALEN
);
5789 unlock_user(target_addr
, arg
+ offsetof(struct tun_filter
, addr
), 0);
5792 return get_errno(safe_ioctl(fd
, ie
->host_cmd
, filter
));
5795 IOCTLEntry ioctl_entries
[] = {
5796 #define IOCTL(cmd, access, ...) \
5797 { TARGET_ ## cmd, cmd, #cmd, access, 0, { __VA_ARGS__ } },
5798 #define IOCTL_SPECIAL(cmd, access, dofn, ...) \
5799 { TARGET_ ## cmd, cmd, #cmd, access, dofn, { __VA_ARGS__ } },
5800 #define IOCTL_IGNORE(cmd) \
5801 { TARGET_ ## cmd, 0, #cmd },
5806 /* ??? Implement proper locking for ioctls. */
5807 /* do_ioctl() Must return target values and target errnos. */
5808 static abi_long
do_ioctl(int fd
, int cmd
, abi_long arg
)
5810 const IOCTLEntry
*ie
;
5811 const argtype
*arg_type
;
5813 uint8_t buf_temp
[MAX_STRUCT_SIZE
];
5819 if (ie
->target_cmd
== 0) {
5821 LOG_UNIMP
, "Unsupported ioctl: cmd=0x%04lx\n", (long)cmd
);
5822 return -TARGET_ENOSYS
;
5824 if (ie
->target_cmd
== cmd
)
5828 arg_type
= ie
->arg_type
;
5830 return ie
->do_ioctl(ie
, buf_temp
, fd
, cmd
, arg
);
5831 } else if (!ie
->host_cmd
) {
5832 /* Some architectures define BSD ioctls in their headers
5833 that are not implemented in Linux. */
5834 return -TARGET_ENOSYS
;
5837 switch(arg_type
[0]) {
5840 ret
= get_errno(safe_ioctl(fd
, ie
->host_cmd
));
5846 ret
= get_errno(safe_ioctl(fd
, ie
->host_cmd
, arg
));
5850 target_size
= thunk_type_size(arg_type
, 0);
5851 switch(ie
->access
) {
5853 ret
= get_errno(safe_ioctl(fd
, ie
->host_cmd
, buf_temp
));
5854 if (!is_error(ret
)) {
5855 argptr
= lock_user(VERIFY_WRITE
, arg
, target_size
, 0);
5857 return -TARGET_EFAULT
;
5858 thunk_convert(argptr
, buf_temp
, arg_type
, THUNK_TARGET
);
5859 unlock_user(argptr
, arg
, target_size
);
5863 argptr
= lock_user(VERIFY_READ
, arg
, target_size
, 1);
5865 return -TARGET_EFAULT
;
5866 thunk_convert(buf_temp
, argptr
, arg_type
, THUNK_HOST
);
5867 unlock_user(argptr
, arg
, 0);
5868 ret
= get_errno(safe_ioctl(fd
, ie
->host_cmd
, buf_temp
));
5872 argptr
= lock_user(VERIFY_READ
, arg
, target_size
, 1);
5874 return -TARGET_EFAULT
;
5875 thunk_convert(buf_temp
, argptr
, arg_type
, THUNK_HOST
);
5876 unlock_user(argptr
, arg
, 0);
5877 ret
= get_errno(safe_ioctl(fd
, ie
->host_cmd
, buf_temp
));
5878 if (!is_error(ret
)) {
5879 argptr
= lock_user(VERIFY_WRITE
, arg
, target_size
, 0);
5881 return -TARGET_EFAULT
;
5882 thunk_convert(argptr
, buf_temp
, arg_type
, THUNK_TARGET
);
5883 unlock_user(argptr
, arg
, target_size
);
5889 qemu_log_mask(LOG_UNIMP
,
5890 "Unsupported ioctl type: cmd=0x%04lx type=%d\n",
5891 (long)cmd
, arg_type
[0]);
5892 ret
= -TARGET_ENOSYS
;
5898 static const bitmask_transtbl iflag_tbl
[] = {
5899 { TARGET_IGNBRK
, TARGET_IGNBRK
, IGNBRK
, IGNBRK
},
5900 { TARGET_BRKINT
, TARGET_BRKINT
, BRKINT
, BRKINT
},
5901 { TARGET_IGNPAR
, TARGET_IGNPAR
, IGNPAR
, IGNPAR
},
5902 { TARGET_PARMRK
, TARGET_PARMRK
, PARMRK
, PARMRK
},
5903 { TARGET_INPCK
, TARGET_INPCK
, INPCK
, INPCK
},
5904 { TARGET_ISTRIP
, TARGET_ISTRIP
, ISTRIP
, ISTRIP
},
5905 { TARGET_INLCR
, TARGET_INLCR
, INLCR
, INLCR
},
5906 { TARGET_IGNCR
, TARGET_IGNCR
, IGNCR
, IGNCR
},
5907 { TARGET_ICRNL
, TARGET_ICRNL
, ICRNL
, ICRNL
},
5908 { TARGET_IUCLC
, TARGET_IUCLC
, IUCLC
, IUCLC
},
5909 { TARGET_IXON
, TARGET_IXON
, IXON
, IXON
},
5910 { TARGET_IXANY
, TARGET_IXANY
, IXANY
, IXANY
},
5911 { TARGET_IXOFF
, TARGET_IXOFF
, IXOFF
, IXOFF
},
5912 { TARGET_IMAXBEL
, TARGET_IMAXBEL
, IMAXBEL
, IMAXBEL
},
5913 { TARGET_IUTF8
, TARGET_IUTF8
, IUTF8
, IUTF8
},
5917 static const bitmask_transtbl oflag_tbl
[] = {
5918 { TARGET_OPOST
, TARGET_OPOST
, OPOST
, OPOST
},
5919 { TARGET_OLCUC
, TARGET_OLCUC
, OLCUC
, OLCUC
},
5920 { TARGET_ONLCR
, TARGET_ONLCR
, ONLCR
, ONLCR
},
5921 { TARGET_OCRNL
, TARGET_OCRNL
, OCRNL
, OCRNL
},
5922 { TARGET_ONOCR
, TARGET_ONOCR
, ONOCR
, ONOCR
},
5923 { TARGET_ONLRET
, TARGET_ONLRET
, ONLRET
, ONLRET
},
5924 { TARGET_OFILL
, TARGET_OFILL
, OFILL
, OFILL
},
5925 { TARGET_OFDEL
, TARGET_OFDEL
, OFDEL
, OFDEL
},
5926 { TARGET_NLDLY
, TARGET_NL0
, NLDLY
, NL0
},
5927 { TARGET_NLDLY
, TARGET_NL1
, NLDLY
, NL1
},
5928 { TARGET_CRDLY
, TARGET_CR0
, CRDLY
, CR0
},
5929 { TARGET_CRDLY
, TARGET_CR1
, CRDLY
, CR1
},
5930 { TARGET_CRDLY
, TARGET_CR2
, CRDLY
, CR2
},
5931 { TARGET_CRDLY
, TARGET_CR3
, CRDLY
, CR3
},
5932 { TARGET_TABDLY
, TARGET_TAB0
, TABDLY
, TAB0
},
5933 { TARGET_TABDLY
, TARGET_TAB1
, TABDLY
, TAB1
},
5934 { TARGET_TABDLY
, TARGET_TAB2
, TABDLY
, TAB2
},
5935 { TARGET_TABDLY
, TARGET_TAB3
, TABDLY
, TAB3
},
5936 { TARGET_BSDLY
, TARGET_BS0
, BSDLY
, BS0
},
5937 { TARGET_BSDLY
, TARGET_BS1
, BSDLY
, BS1
},
5938 { TARGET_VTDLY
, TARGET_VT0
, VTDLY
, VT0
},
5939 { TARGET_VTDLY
, TARGET_VT1
, VTDLY
, VT1
},
5940 { TARGET_FFDLY
, TARGET_FF0
, FFDLY
, FF0
},
5941 { TARGET_FFDLY
, TARGET_FF1
, FFDLY
, FF1
},
5945 static const bitmask_transtbl cflag_tbl
[] = {
5946 { TARGET_CBAUD
, TARGET_B0
, CBAUD
, B0
},
5947 { TARGET_CBAUD
, TARGET_B50
, CBAUD
, B50
},
5948 { TARGET_CBAUD
, TARGET_B75
, CBAUD
, B75
},
5949 { TARGET_CBAUD
, TARGET_B110
, CBAUD
, B110
},
5950 { TARGET_CBAUD
, TARGET_B134
, CBAUD
, B134
},
5951 { TARGET_CBAUD
, TARGET_B150
, CBAUD
, B150
},
5952 { TARGET_CBAUD
, TARGET_B200
, CBAUD
, B200
},
5953 { TARGET_CBAUD
, TARGET_B300
, CBAUD
, B300
},
5954 { TARGET_CBAUD
, TARGET_B600
, CBAUD
, B600
},
5955 { TARGET_CBAUD
, TARGET_B1200
, CBAUD
, B1200
},
5956 { TARGET_CBAUD
, TARGET_B1800
, CBAUD
, B1800
},
5957 { TARGET_CBAUD
, TARGET_B2400
, CBAUD
, B2400
},
5958 { TARGET_CBAUD
, TARGET_B4800
, CBAUD
, B4800
},
5959 { TARGET_CBAUD
, TARGET_B9600
, CBAUD
, B9600
},
5960 { TARGET_CBAUD
, TARGET_B19200
, CBAUD
, B19200
},
5961 { TARGET_CBAUD
, TARGET_B38400
, CBAUD
, B38400
},
5962 { TARGET_CBAUD
, TARGET_B57600
, CBAUD
, B57600
},
5963 { TARGET_CBAUD
, TARGET_B115200
, CBAUD
, B115200
},
5964 { TARGET_CBAUD
, TARGET_B230400
, CBAUD
, B230400
},
5965 { TARGET_CBAUD
, TARGET_B460800
, CBAUD
, B460800
},
5966 { TARGET_CSIZE
, TARGET_CS5
, CSIZE
, CS5
},
5967 { TARGET_CSIZE
, TARGET_CS6
, CSIZE
, CS6
},
5968 { TARGET_CSIZE
, TARGET_CS7
, CSIZE
, CS7
},
5969 { TARGET_CSIZE
, TARGET_CS8
, CSIZE
, CS8
},
5970 { TARGET_CSTOPB
, TARGET_CSTOPB
, CSTOPB
, CSTOPB
},
5971 { TARGET_CREAD
, TARGET_CREAD
, CREAD
, CREAD
},
5972 { TARGET_PARENB
, TARGET_PARENB
, PARENB
, PARENB
},
5973 { TARGET_PARODD
, TARGET_PARODD
, PARODD
, PARODD
},
5974 { TARGET_HUPCL
, TARGET_HUPCL
, HUPCL
, HUPCL
},
5975 { TARGET_CLOCAL
, TARGET_CLOCAL
, CLOCAL
, CLOCAL
},
5976 { TARGET_CRTSCTS
, TARGET_CRTSCTS
, CRTSCTS
, CRTSCTS
},
5980 static const bitmask_transtbl lflag_tbl
[] = {
5981 { TARGET_ISIG
, TARGET_ISIG
, ISIG
, ISIG
},
5982 { TARGET_ICANON
, TARGET_ICANON
, ICANON
, ICANON
},
5983 { TARGET_XCASE
, TARGET_XCASE
, XCASE
, XCASE
},
5984 { TARGET_ECHO
, TARGET_ECHO
, ECHO
, ECHO
},
5985 { TARGET_ECHOE
, TARGET_ECHOE
, ECHOE
, ECHOE
},
5986 { TARGET_ECHOK
, TARGET_ECHOK
, ECHOK
, ECHOK
},
5987 { TARGET_ECHONL
, TARGET_ECHONL
, ECHONL
, ECHONL
},
5988 { TARGET_NOFLSH
, TARGET_NOFLSH
, NOFLSH
, NOFLSH
},
5989 { TARGET_TOSTOP
, TARGET_TOSTOP
, TOSTOP
, TOSTOP
},
5990 { TARGET_ECHOCTL
, TARGET_ECHOCTL
, ECHOCTL
, ECHOCTL
},
5991 { TARGET_ECHOPRT
, TARGET_ECHOPRT
, ECHOPRT
, ECHOPRT
},
5992 { TARGET_ECHOKE
, TARGET_ECHOKE
, ECHOKE
, ECHOKE
},
5993 { TARGET_FLUSHO
, TARGET_FLUSHO
, FLUSHO
, FLUSHO
},
5994 { TARGET_PENDIN
, TARGET_PENDIN
, PENDIN
, PENDIN
},
5995 { TARGET_IEXTEN
, TARGET_IEXTEN
, IEXTEN
, IEXTEN
},
5996 { TARGET_EXTPROC
, TARGET_EXTPROC
, EXTPROC
, EXTPROC
},
6000 static void target_to_host_termios (void *dst
, const void *src
)
6002 struct host_termios
*host
= dst
;
6003 const struct target_termios
*target
= src
;
6006 target_to_host_bitmask(tswap32(target
->c_iflag
), iflag_tbl
);
6008 target_to_host_bitmask(tswap32(target
->c_oflag
), oflag_tbl
);
6010 target_to_host_bitmask(tswap32(target
->c_cflag
), cflag_tbl
);
6012 target_to_host_bitmask(tswap32(target
->c_lflag
), lflag_tbl
);
6013 host
->c_line
= target
->c_line
;
6015 memset(host
->c_cc
, 0, sizeof(host
->c_cc
));
6016 host
->c_cc
[VINTR
] = target
->c_cc
[TARGET_VINTR
];
6017 host
->c_cc
[VQUIT
] = target
->c_cc
[TARGET_VQUIT
];
6018 host
->c_cc
[VERASE
] = target
->c_cc
[TARGET_VERASE
];
6019 host
->c_cc
[VKILL
] = target
->c_cc
[TARGET_VKILL
];
6020 host
->c_cc
[VEOF
] = target
->c_cc
[TARGET_VEOF
];
6021 host
->c_cc
[VTIME
] = target
->c_cc
[TARGET_VTIME
];
6022 host
->c_cc
[VMIN
] = target
->c_cc
[TARGET_VMIN
];
6023 host
->c_cc
[VSWTC
] = target
->c_cc
[TARGET_VSWTC
];
6024 host
->c_cc
[VSTART
] = target
->c_cc
[TARGET_VSTART
];
6025 host
->c_cc
[VSTOP
] = target
->c_cc
[TARGET_VSTOP
];
6026 host
->c_cc
[VSUSP
] = target
->c_cc
[TARGET_VSUSP
];
6027 host
->c_cc
[VEOL
] = target
->c_cc
[TARGET_VEOL
];
6028 host
->c_cc
[VREPRINT
] = target
->c_cc
[TARGET_VREPRINT
];
6029 host
->c_cc
[VDISCARD
] = target
->c_cc
[TARGET_VDISCARD
];
6030 host
->c_cc
[VWERASE
] = target
->c_cc
[TARGET_VWERASE
];
6031 host
->c_cc
[VLNEXT
] = target
->c_cc
[TARGET_VLNEXT
];
6032 host
->c_cc
[VEOL2
] = target
->c_cc
[TARGET_VEOL2
];
6035 static void host_to_target_termios (void *dst
, const void *src
)
6037 struct target_termios
*target
= dst
;
6038 const struct host_termios
*host
= src
;
6041 tswap32(host_to_target_bitmask(host
->c_iflag
, iflag_tbl
));
6043 tswap32(host_to_target_bitmask(host
->c_oflag
, oflag_tbl
));
6045 tswap32(host_to_target_bitmask(host
->c_cflag
, cflag_tbl
));
6047 tswap32(host_to_target_bitmask(host
->c_lflag
, lflag_tbl
));
6048 target
->c_line
= host
->c_line
;
6050 memset(target
->c_cc
, 0, sizeof(target
->c_cc
));
6051 target
->c_cc
[TARGET_VINTR
] = host
->c_cc
[VINTR
];
6052 target
->c_cc
[TARGET_VQUIT
] = host
->c_cc
[VQUIT
];
6053 target
->c_cc
[TARGET_VERASE
] = host
->c_cc
[VERASE
];
6054 target
->c_cc
[TARGET_VKILL
] = host
->c_cc
[VKILL
];
6055 target
->c_cc
[TARGET_VEOF
] = host
->c_cc
[VEOF
];
6056 target
->c_cc
[TARGET_VTIME
] = host
->c_cc
[VTIME
];
6057 target
->c_cc
[TARGET_VMIN
] = host
->c_cc
[VMIN
];
6058 target
->c_cc
[TARGET_VSWTC
] = host
->c_cc
[VSWTC
];
6059 target
->c_cc
[TARGET_VSTART
] = host
->c_cc
[VSTART
];
6060 target
->c_cc
[TARGET_VSTOP
] = host
->c_cc
[VSTOP
];
6061 target
->c_cc
[TARGET_VSUSP
] = host
->c_cc
[VSUSP
];
6062 target
->c_cc
[TARGET_VEOL
] = host
->c_cc
[VEOL
];
6063 target
->c_cc
[TARGET_VREPRINT
] = host
->c_cc
[VREPRINT
];
6064 target
->c_cc
[TARGET_VDISCARD
] = host
->c_cc
[VDISCARD
];
6065 target
->c_cc
[TARGET_VWERASE
] = host
->c_cc
[VWERASE
];
6066 target
->c_cc
[TARGET_VLNEXT
] = host
->c_cc
[VLNEXT
];
6067 target
->c_cc
[TARGET_VEOL2
] = host
->c_cc
[VEOL2
];
6070 static const StructEntry struct_termios_def
= {
6071 .convert
= { host_to_target_termios
, target_to_host_termios
},
6072 .size
= { sizeof(struct target_termios
), sizeof(struct host_termios
) },
6073 .align
= { __alignof__(struct target_termios
), __alignof__(struct host_termios
) },
6074 .print
= print_termios
,
6077 static const bitmask_transtbl mmap_flags_tbl
[] = {
6078 { TARGET_MAP_SHARED
, TARGET_MAP_SHARED
, MAP_SHARED
, MAP_SHARED
},
6079 { TARGET_MAP_PRIVATE
, TARGET_MAP_PRIVATE
, MAP_PRIVATE
, MAP_PRIVATE
},
6080 { TARGET_MAP_FIXED
, TARGET_MAP_FIXED
, MAP_FIXED
, MAP_FIXED
},
6081 { TARGET_MAP_ANONYMOUS
, TARGET_MAP_ANONYMOUS
,
6082 MAP_ANONYMOUS
, MAP_ANONYMOUS
},
6083 { TARGET_MAP_GROWSDOWN
, TARGET_MAP_GROWSDOWN
,
6084 MAP_GROWSDOWN
, MAP_GROWSDOWN
},
6085 { TARGET_MAP_DENYWRITE
, TARGET_MAP_DENYWRITE
,
6086 MAP_DENYWRITE
, MAP_DENYWRITE
},
6087 { TARGET_MAP_EXECUTABLE
, TARGET_MAP_EXECUTABLE
,
6088 MAP_EXECUTABLE
, MAP_EXECUTABLE
},
6089 { TARGET_MAP_LOCKED
, TARGET_MAP_LOCKED
, MAP_LOCKED
, MAP_LOCKED
},
6090 { TARGET_MAP_NORESERVE
, TARGET_MAP_NORESERVE
,
6091 MAP_NORESERVE
, MAP_NORESERVE
},
6092 { TARGET_MAP_HUGETLB
, TARGET_MAP_HUGETLB
, MAP_HUGETLB
, MAP_HUGETLB
},
6093 /* MAP_STACK had been ignored by the kernel for quite some time.
6094 Recognize it for the target insofar as we do not want to pass
6095 it through to the host. */
6096 { TARGET_MAP_STACK
, TARGET_MAP_STACK
, 0, 0 },
6101 * NOTE: TARGET_ABI32 is defined for TARGET_I386 (but not for TARGET_X86_64)
6102 * TARGET_I386 is defined if TARGET_X86_64 is defined
6104 #if defined(TARGET_I386)
6106 /* NOTE: there is really one LDT for all the threads */
6107 static uint8_t *ldt_table
;
6109 static abi_long
read_ldt(abi_ulong ptr
, unsigned long bytecount
)
6116 size
= TARGET_LDT_ENTRIES
* TARGET_LDT_ENTRY_SIZE
;
6117 if (size
> bytecount
)
6119 p
= lock_user(VERIFY_WRITE
, ptr
, size
, 0);
6121 return -TARGET_EFAULT
;
6122 /* ??? Should this by byteswapped? */
6123 memcpy(p
, ldt_table
, size
);
6124 unlock_user(p
, ptr
, size
);
6128 /* XXX: add locking support */
6129 static abi_long
write_ldt(CPUX86State
*env
,
6130 abi_ulong ptr
, unsigned long bytecount
, int oldmode
)
6132 struct target_modify_ldt_ldt_s ldt_info
;
6133 struct target_modify_ldt_ldt_s
*target_ldt_info
;
6134 int seg_32bit
, contents
, read_exec_only
, limit_in_pages
;
6135 int seg_not_present
, useable
, lm
;
6136 uint32_t *lp
, entry_1
, entry_2
;
6138 if (bytecount
!= sizeof(ldt_info
))
6139 return -TARGET_EINVAL
;
6140 if (!lock_user_struct(VERIFY_READ
, target_ldt_info
, ptr
, 1))
6141 return -TARGET_EFAULT
;
6142 ldt_info
.entry_number
= tswap32(target_ldt_info
->entry_number
);
6143 ldt_info
.base_addr
= tswapal(target_ldt_info
->base_addr
);
6144 ldt_info
.limit
= tswap32(target_ldt_info
->limit
);
6145 ldt_info
.flags
= tswap32(target_ldt_info
->flags
);
6146 unlock_user_struct(target_ldt_info
, ptr
, 0);
6148 if (ldt_info
.entry_number
>= TARGET_LDT_ENTRIES
)
6149 return -TARGET_EINVAL
;
6150 seg_32bit
= ldt_info
.flags
& 1;
6151 contents
= (ldt_info
.flags
>> 1) & 3;
6152 read_exec_only
= (ldt_info
.flags
>> 3) & 1;
6153 limit_in_pages
= (ldt_info
.flags
>> 4) & 1;
6154 seg_not_present
= (ldt_info
.flags
>> 5) & 1;
6155 useable
= (ldt_info
.flags
>> 6) & 1;
6159 lm
= (ldt_info
.flags
>> 7) & 1;
6161 if (contents
== 3) {
6163 return -TARGET_EINVAL
;
6164 if (seg_not_present
== 0)
6165 return -TARGET_EINVAL
;
6167 /* allocate the LDT */
6169 env
->ldt
.base
= target_mmap(0,
6170 TARGET_LDT_ENTRIES
* TARGET_LDT_ENTRY_SIZE
,
6171 PROT_READ
|PROT_WRITE
,
6172 MAP_ANONYMOUS
|MAP_PRIVATE
, -1, 0);
6173 if (env
->ldt
.base
== -1)
6174 return -TARGET_ENOMEM
;
6175 memset(g2h_untagged(env
->ldt
.base
), 0,
6176 TARGET_LDT_ENTRIES
* TARGET_LDT_ENTRY_SIZE
);
6177 env
->ldt
.limit
= 0xffff;
6178 ldt_table
= g2h_untagged(env
->ldt
.base
);
6181 /* NOTE: same code as Linux kernel */
6182 /* Allow LDTs to be cleared by the user. */
6183 if (ldt_info
.base_addr
== 0 && ldt_info
.limit
== 0) {
6186 read_exec_only
== 1 &&
6188 limit_in_pages
== 0 &&
6189 seg_not_present
== 1 &&
6197 entry_1
= ((ldt_info
.base_addr
& 0x0000ffff) << 16) |
6198 (ldt_info
.limit
& 0x0ffff);
6199 entry_2
= (ldt_info
.base_addr
& 0xff000000) |
6200 ((ldt_info
.base_addr
& 0x00ff0000) >> 16) |
6201 (ldt_info
.limit
& 0xf0000) |
6202 ((read_exec_only
^ 1) << 9) |
6204 ((seg_not_present
^ 1) << 15) |
6206 (limit_in_pages
<< 23) |
6210 entry_2
|= (useable
<< 20);
6212 /* Install the new entry ... */
6214 lp
= (uint32_t *)(ldt_table
+ (ldt_info
.entry_number
<< 3));
6215 lp
[0] = tswap32(entry_1
);
6216 lp
[1] = tswap32(entry_2
);
6220 /* specific and weird i386 syscalls */
6221 static abi_long
do_modify_ldt(CPUX86State
*env
, int func
, abi_ulong ptr
,
6222 unsigned long bytecount
)
6228 ret
= read_ldt(ptr
, bytecount
);
6231 ret
= write_ldt(env
, ptr
, bytecount
, 1);
6234 ret
= write_ldt(env
, ptr
, bytecount
, 0);
6237 ret
= -TARGET_ENOSYS
;
6243 #if defined(TARGET_ABI32)
6244 abi_long
do_set_thread_area(CPUX86State
*env
, abi_ulong ptr
)
6246 uint64_t *gdt_table
= g2h_untagged(env
->gdt
.base
);
6247 struct target_modify_ldt_ldt_s ldt_info
;
6248 struct target_modify_ldt_ldt_s
*target_ldt_info
;
6249 int seg_32bit
, contents
, read_exec_only
, limit_in_pages
;
6250 int seg_not_present
, useable
, lm
;
6251 uint32_t *lp
, entry_1
, entry_2
;
6254 lock_user_struct(VERIFY_WRITE
, target_ldt_info
, ptr
, 1);
6255 if (!target_ldt_info
)
6256 return -TARGET_EFAULT
;
6257 ldt_info
.entry_number
= tswap32(target_ldt_info
->entry_number
);
6258 ldt_info
.base_addr
= tswapal(target_ldt_info
->base_addr
);
6259 ldt_info
.limit
= tswap32(target_ldt_info
->limit
);
6260 ldt_info
.flags
= tswap32(target_ldt_info
->flags
);
6261 if (ldt_info
.entry_number
== -1) {
6262 for (i
=TARGET_GDT_ENTRY_TLS_MIN
; i
<=TARGET_GDT_ENTRY_TLS_MAX
; i
++) {
6263 if (gdt_table
[i
] == 0) {
6264 ldt_info
.entry_number
= i
;
6265 target_ldt_info
->entry_number
= tswap32(i
);
6270 unlock_user_struct(target_ldt_info
, ptr
, 1);
6272 if (ldt_info
.entry_number
< TARGET_GDT_ENTRY_TLS_MIN
||
6273 ldt_info
.entry_number
> TARGET_GDT_ENTRY_TLS_MAX
)
6274 return -TARGET_EINVAL
;
6275 seg_32bit
= ldt_info
.flags
& 1;
6276 contents
= (ldt_info
.flags
>> 1) & 3;
6277 read_exec_only
= (ldt_info
.flags
>> 3) & 1;
6278 limit_in_pages
= (ldt_info
.flags
>> 4) & 1;
6279 seg_not_present
= (ldt_info
.flags
>> 5) & 1;
6280 useable
= (ldt_info
.flags
>> 6) & 1;
6284 lm
= (ldt_info
.flags
>> 7) & 1;
6287 if (contents
== 3) {
6288 if (seg_not_present
== 0)
6289 return -TARGET_EINVAL
;
6292 /* NOTE: same code as Linux kernel */
6293 /* Allow LDTs to be cleared by the user. */
6294 if (ldt_info
.base_addr
== 0 && ldt_info
.limit
== 0) {
6295 if ((contents
== 0 &&
6296 read_exec_only
== 1 &&
6298 limit_in_pages
== 0 &&
6299 seg_not_present
== 1 &&
6307 entry_1
= ((ldt_info
.base_addr
& 0x0000ffff) << 16) |
6308 (ldt_info
.limit
& 0x0ffff);
6309 entry_2
= (ldt_info
.base_addr
& 0xff000000) |
6310 ((ldt_info
.base_addr
& 0x00ff0000) >> 16) |
6311 (ldt_info
.limit
& 0xf0000) |
6312 ((read_exec_only
^ 1) << 9) |
6314 ((seg_not_present
^ 1) << 15) |
6316 (limit_in_pages
<< 23) |
6321 /* Install the new entry ... */
6323 lp
= (uint32_t *)(gdt_table
+ ldt_info
.entry_number
);
6324 lp
[0] = tswap32(entry_1
);
6325 lp
[1] = tswap32(entry_2
);
6329 static abi_long
do_get_thread_area(CPUX86State
*env
, abi_ulong ptr
)
6331 struct target_modify_ldt_ldt_s
*target_ldt_info
;
6332 uint64_t *gdt_table
= g2h_untagged(env
->gdt
.base
);
6333 uint32_t base_addr
, limit
, flags
;
6334 int seg_32bit
, contents
, read_exec_only
, limit_in_pages
, idx
;
6335 int seg_not_present
, useable
, lm
;
6336 uint32_t *lp
, entry_1
, entry_2
;
6338 lock_user_struct(VERIFY_WRITE
, target_ldt_info
, ptr
, 1);
6339 if (!target_ldt_info
)
6340 return -TARGET_EFAULT
;
6341 idx
= tswap32(target_ldt_info
->entry_number
);
6342 if (idx
< TARGET_GDT_ENTRY_TLS_MIN
||
6343 idx
> TARGET_GDT_ENTRY_TLS_MAX
) {
6344 unlock_user_struct(target_ldt_info
, ptr
, 1);
6345 return -TARGET_EINVAL
;
6347 lp
= (uint32_t *)(gdt_table
+ idx
);
6348 entry_1
= tswap32(lp
[0]);
6349 entry_2
= tswap32(lp
[1]);
6351 read_exec_only
= ((entry_2
>> 9) & 1) ^ 1;
6352 contents
= (entry_2
>> 10) & 3;
6353 seg_not_present
= ((entry_2
>> 15) & 1) ^ 1;
6354 seg_32bit
= (entry_2
>> 22) & 1;
6355 limit_in_pages
= (entry_2
>> 23) & 1;
6356 useable
= (entry_2
>> 20) & 1;
6360 lm
= (entry_2
>> 21) & 1;
6362 flags
= (seg_32bit
<< 0) | (contents
<< 1) |
6363 (read_exec_only
<< 3) | (limit_in_pages
<< 4) |
6364 (seg_not_present
<< 5) | (useable
<< 6) | (lm
<< 7);
6365 limit
= (entry_1
& 0xffff) | (entry_2
& 0xf0000);
6366 base_addr
= (entry_1
>> 16) |
6367 (entry_2
& 0xff000000) |
6368 ((entry_2
& 0xff) << 16);
6369 target_ldt_info
->base_addr
= tswapal(base_addr
);
6370 target_ldt_info
->limit
= tswap32(limit
);
6371 target_ldt_info
->flags
= tswap32(flags
);
6372 unlock_user_struct(target_ldt_info
, ptr
, 1);
6376 abi_long
do_arch_prctl(CPUX86State
*env
, int code
, abi_ulong addr
)
6378 return -TARGET_ENOSYS
;
6381 abi_long
do_arch_prctl(CPUX86State
*env
, int code
, abi_ulong addr
)
6388 case TARGET_ARCH_SET_GS
:
6389 case TARGET_ARCH_SET_FS
:
6390 if (code
== TARGET_ARCH_SET_GS
)
6394 cpu_x86_load_seg(env
, idx
, 0);
6395 env
->segs
[idx
].base
= addr
;
6397 case TARGET_ARCH_GET_GS
:
6398 case TARGET_ARCH_GET_FS
:
6399 if (code
== TARGET_ARCH_GET_GS
)
6403 val
= env
->segs
[idx
].base
;
6404 if (put_user(val
, addr
, abi_ulong
))
6405 ret
= -TARGET_EFAULT
;
6408 ret
= -TARGET_EINVAL
;
6413 #endif /* defined(TARGET_ABI32 */
6415 #endif /* defined(TARGET_I386) */
6417 #define NEW_STACK_SIZE 0x40000
6420 static pthread_mutex_t clone_lock
= PTHREAD_MUTEX_INITIALIZER
;
6423 pthread_mutex_t mutex
;
6424 pthread_cond_t cond
;
6427 abi_ulong child_tidptr
;
6428 abi_ulong parent_tidptr
;
6432 static void *clone_func(void *arg
)
6434 new_thread_info
*info
= arg
;
6439 rcu_register_thread();
6440 tcg_register_thread();
6444 ts
= (TaskState
*)cpu
->opaque
;
6445 info
->tid
= sys_gettid();
6447 if (info
->child_tidptr
)
6448 put_user_u32(info
->tid
, info
->child_tidptr
);
6449 if (info
->parent_tidptr
)
6450 put_user_u32(info
->tid
, info
->parent_tidptr
);
6451 qemu_guest_random_seed_thread_part2(cpu
->random_seed
);
6452 /* Enable signals. */
6453 sigprocmask(SIG_SETMASK
, &info
->sigmask
, NULL
);
6454 /* Signal to the parent that we're ready. */
6455 pthread_mutex_lock(&info
->mutex
);
6456 pthread_cond_broadcast(&info
->cond
);
6457 pthread_mutex_unlock(&info
->mutex
);
6458 /* Wait until the parent has finished initializing the tls state. */
6459 pthread_mutex_lock(&clone_lock
);
6460 pthread_mutex_unlock(&clone_lock
);
6466 /* do_fork() Must return host values and target errnos (unlike most
6467 do_*() functions). */
6468 static int do_fork(CPUArchState
*env
, unsigned int flags
, abi_ulong newsp
,
6469 abi_ulong parent_tidptr
, target_ulong newtls
,
6470 abi_ulong child_tidptr
)
6472 CPUState
*cpu
= env_cpu(env
);
6476 CPUArchState
*new_env
;
6479 flags
&= ~CLONE_IGNORED_FLAGS
;
6481 /* Emulate vfork() with fork() */
6482 if (flags
& CLONE_VFORK
)
6483 flags
&= ~(CLONE_VFORK
| CLONE_VM
);
6485 if (flags
& CLONE_VM
) {
6486 TaskState
*parent_ts
= (TaskState
*)cpu
->opaque
;
6487 new_thread_info info
;
6488 pthread_attr_t attr
;
6490 if (((flags
& CLONE_THREAD_FLAGS
) != CLONE_THREAD_FLAGS
) ||
6491 (flags
& CLONE_INVALID_THREAD_FLAGS
)) {
6492 return -TARGET_EINVAL
;
6495 ts
= g_new0(TaskState
, 1);
6496 init_task_state(ts
);
6498 /* Grab a mutex so that thread setup appears atomic. */
6499 pthread_mutex_lock(&clone_lock
);
6502 * If this is our first additional thread, we need to ensure we
6503 * generate code for parallel execution and flush old translations.
6504 * Do this now so that the copy gets CF_PARALLEL too.
6506 if (!(cpu
->tcg_cflags
& CF_PARALLEL
)) {
6507 cpu
->tcg_cflags
|= CF_PARALLEL
;
6511 /* we create a new CPU instance. */
6512 new_env
= cpu_copy(env
);
6513 /* Init regs that differ from the parent. */
6514 cpu_clone_regs_child(new_env
, newsp
, flags
);
6515 cpu_clone_regs_parent(env
, flags
);
6516 new_cpu
= env_cpu(new_env
);
6517 new_cpu
->opaque
= ts
;
6518 ts
->bprm
= parent_ts
->bprm
;
6519 ts
->info
= parent_ts
->info
;
6520 ts
->signal_mask
= parent_ts
->signal_mask
;
6522 if (flags
& CLONE_CHILD_CLEARTID
) {
6523 ts
->child_tidptr
= child_tidptr
;
6526 if (flags
& CLONE_SETTLS
) {
6527 cpu_set_tls (new_env
, newtls
);
6530 memset(&info
, 0, sizeof(info
));
6531 pthread_mutex_init(&info
.mutex
, NULL
);
6532 pthread_mutex_lock(&info
.mutex
);
6533 pthread_cond_init(&info
.cond
, NULL
);
6535 if (flags
& CLONE_CHILD_SETTID
) {
6536 info
.child_tidptr
= child_tidptr
;
6538 if (flags
& CLONE_PARENT_SETTID
) {
6539 info
.parent_tidptr
= parent_tidptr
;
6542 ret
= pthread_attr_init(&attr
);
6543 ret
= pthread_attr_setstacksize(&attr
, NEW_STACK_SIZE
);
6544 ret
= pthread_attr_setdetachstate(&attr
, PTHREAD_CREATE_DETACHED
);
6545 /* It is not safe to deliver signals until the child has finished
6546 initializing, so temporarily block all signals. */
6547 sigfillset(&sigmask
);
6548 sigprocmask(SIG_BLOCK
, &sigmask
, &info
.sigmask
);
6549 cpu
->random_seed
= qemu_guest_random_seed_thread_part1();
6551 ret
= pthread_create(&info
.thread
, &attr
, clone_func
, &info
);
6552 /* TODO: Free new CPU state if thread creation failed. */
6554 sigprocmask(SIG_SETMASK
, &info
.sigmask
, NULL
);
6555 pthread_attr_destroy(&attr
);
6557 /* Wait for the child to initialize. */
6558 pthread_cond_wait(&info
.cond
, &info
.mutex
);
6563 pthread_mutex_unlock(&info
.mutex
);
6564 pthread_cond_destroy(&info
.cond
);
6565 pthread_mutex_destroy(&info
.mutex
);
6566 pthread_mutex_unlock(&clone_lock
);
6568 /* if no CLONE_VM, we consider it is a fork */
6569 if (flags
& CLONE_INVALID_FORK_FLAGS
) {
6570 return -TARGET_EINVAL
;
6573 /* We can't support custom termination signals */
6574 if ((flags
& CSIGNAL
) != TARGET_SIGCHLD
) {
6575 return -TARGET_EINVAL
;
6578 if (block_signals()) {
6579 return -TARGET_ERESTARTSYS
;
6585 /* Child Process. */
6586 cpu_clone_regs_child(env
, newsp
, flags
);
6588 /* There is a race condition here. The parent process could
6589 theoretically read the TID in the child process before the child
6590 tid is set. This would require using either ptrace
6591 (not implemented) or having *_tidptr to point at a shared memory
6592 mapping. We can't repeat the spinlock hack used above because
6593 the child process gets its own copy of the lock. */
6594 if (flags
& CLONE_CHILD_SETTID
)
6595 put_user_u32(sys_gettid(), child_tidptr
);
6596 if (flags
& CLONE_PARENT_SETTID
)
6597 put_user_u32(sys_gettid(), parent_tidptr
);
6598 ts
= (TaskState
*)cpu
->opaque
;
6599 if (flags
& CLONE_SETTLS
)
6600 cpu_set_tls (env
, newtls
);
6601 if (flags
& CLONE_CHILD_CLEARTID
)
6602 ts
->child_tidptr
= child_tidptr
;
6604 cpu_clone_regs_parent(env
, flags
);
6611 /* warning : doesn't handle linux specific flags... */
6612 static int target_to_host_fcntl_cmd(int cmd
)
6617 case TARGET_F_DUPFD
:
6618 case TARGET_F_GETFD
:
6619 case TARGET_F_SETFD
:
6620 case TARGET_F_GETFL
:
6621 case TARGET_F_SETFL
:
6622 case TARGET_F_OFD_GETLK
:
6623 case TARGET_F_OFD_SETLK
:
6624 case TARGET_F_OFD_SETLKW
:
6627 case TARGET_F_GETLK
:
6630 case TARGET_F_SETLK
:
6633 case TARGET_F_SETLKW
:
6636 case TARGET_F_GETOWN
:
6639 case TARGET_F_SETOWN
:
6642 case TARGET_F_GETSIG
:
6645 case TARGET_F_SETSIG
:
6648 #if TARGET_ABI_BITS == 32
6649 case TARGET_F_GETLK64
:
6652 case TARGET_F_SETLK64
:
6655 case TARGET_F_SETLKW64
:
6659 case TARGET_F_SETLEASE
:
6662 case TARGET_F_GETLEASE
:
6665 #ifdef F_DUPFD_CLOEXEC
6666 case TARGET_F_DUPFD_CLOEXEC
:
6667 ret
= F_DUPFD_CLOEXEC
;
6670 case TARGET_F_NOTIFY
:
6674 case TARGET_F_GETOWN_EX
:
6679 case TARGET_F_SETOWN_EX
:
6684 case TARGET_F_SETPIPE_SZ
:
6687 case TARGET_F_GETPIPE_SZ
:
6692 case TARGET_F_ADD_SEALS
:
6695 case TARGET_F_GET_SEALS
:
6700 ret
= -TARGET_EINVAL
;
6704 #if defined(__powerpc64__)
6705 /* On PPC64, glibc headers has the F_*LK* defined to 12, 13 and 14 and
6706 * is not supported by kernel. The glibc fcntl call actually adjusts
6707 * them to 5, 6 and 7 before making the syscall(). Since we make the
6708 * syscall directly, adjust to what is supported by the kernel.
6710 if (ret
>= F_GETLK64
&& ret
<= F_SETLKW64
) {
6711 ret
-= F_GETLK64
- 5;
6718 #define FLOCK_TRANSTBL \
6720 TRANSTBL_CONVERT(F_RDLCK); \
6721 TRANSTBL_CONVERT(F_WRLCK); \
6722 TRANSTBL_CONVERT(F_UNLCK); \
6725 static int target_to_host_flock(int type
)
6727 #define TRANSTBL_CONVERT(a) case TARGET_##a: return a
6729 #undef TRANSTBL_CONVERT
6730 return -TARGET_EINVAL
;
6733 static int host_to_target_flock(int type
)
6735 #define TRANSTBL_CONVERT(a) case a: return TARGET_##a
6737 #undef TRANSTBL_CONVERT
6738 /* if we don't know how to convert the value coming
6739 * from the host we copy to the target field as-is
6744 static inline abi_long
copy_from_user_flock(struct flock64
*fl
,
6745 abi_ulong target_flock_addr
)
6747 struct target_flock
*target_fl
;
6750 if (!lock_user_struct(VERIFY_READ
, target_fl
, target_flock_addr
, 1)) {
6751 return -TARGET_EFAULT
;
6754 __get_user(l_type
, &target_fl
->l_type
);
6755 l_type
= target_to_host_flock(l_type
);
6759 fl
->l_type
= l_type
;
6760 __get_user(fl
->l_whence
, &target_fl
->l_whence
);
6761 __get_user(fl
->l_start
, &target_fl
->l_start
);
6762 __get_user(fl
->l_len
, &target_fl
->l_len
);
6763 __get_user(fl
->l_pid
, &target_fl
->l_pid
);
6764 unlock_user_struct(target_fl
, target_flock_addr
, 0);
6768 static inline abi_long
copy_to_user_flock(abi_ulong target_flock_addr
,
6769 const struct flock64
*fl
)
6771 struct target_flock
*target_fl
;
6774 if (!lock_user_struct(VERIFY_WRITE
, target_fl
, target_flock_addr
, 0)) {
6775 return -TARGET_EFAULT
;
6778 l_type
= host_to_target_flock(fl
->l_type
);
6779 __put_user(l_type
, &target_fl
->l_type
);
6780 __put_user(fl
->l_whence
, &target_fl
->l_whence
);
6781 __put_user(fl
->l_start
, &target_fl
->l_start
);
6782 __put_user(fl
->l_len
, &target_fl
->l_len
);
6783 __put_user(fl
->l_pid
, &target_fl
->l_pid
);
6784 unlock_user_struct(target_fl
, target_flock_addr
, 1);
6788 typedef abi_long
from_flock64_fn(struct flock64
*fl
, abi_ulong target_addr
);
6789 typedef abi_long
to_flock64_fn(abi_ulong target_addr
, const struct flock64
*fl
);
6791 #if defined(TARGET_ARM) && TARGET_ABI_BITS == 32
6792 static inline abi_long
copy_from_user_oabi_flock64(struct flock64
*fl
,
6793 abi_ulong target_flock_addr
)
6795 struct target_oabi_flock64
*target_fl
;
6798 if (!lock_user_struct(VERIFY_READ
, target_fl
, target_flock_addr
, 1)) {
6799 return -TARGET_EFAULT
;
6802 __get_user(l_type
, &target_fl
->l_type
);
6803 l_type
= target_to_host_flock(l_type
);
6807 fl
->l_type
= l_type
;
6808 __get_user(fl
->l_whence
, &target_fl
->l_whence
);
6809 __get_user(fl
->l_start
, &target_fl
->l_start
);
6810 __get_user(fl
->l_len
, &target_fl
->l_len
);
6811 __get_user(fl
->l_pid
, &target_fl
->l_pid
);
6812 unlock_user_struct(target_fl
, target_flock_addr
, 0);
6816 static inline abi_long
copy_to_user_oabi_flock64(abi_ulong target_flock_addr
,
6817 const struct flock64
*fl
)
6819 struct target_oabi_flock64
*target_fl
;
6822 if (!lock_user_struct(VERIFY_WRITE
, target_fl
, target_flock_addr
, 0)) {
6823 return -TARGET_EFAULT
;
6826 l_type
= host_to_target_flock(fl
->l_type
);
6827 __put_user(l_type
, &target_fl
->l_type
);
6828 __put_user(fl
->l_whence
, &target_fl
->l_whence
);
6829 __put_user(fl
->l_start
, &target_fl
->l_start
);
6830 __put_user(fl
->l_len
, &target_fl
->l_len
);
6831 __put_user(fl
->l_pid
, &target_fl
->l_pid
);
6832 unlock_user_struct(target_fl
, target_flock_addr
, 1);
6837 static inline abi_long
copy_from_user_flock64(struct flock64
*fl
,
6838 abi_ulong target_flock_addr
)
6840 struct target_flock64
*target_fl
;
6843 if (!lock_user_struct(VERIFY_READ
, target_fl
, target_flock_addr
, 1)) {
6844 return -TARGET_EFAULT
;
6847 __get_user(l_type
, &target_fl
->l_type
);
6848 l_type
= target_to_host_flock(l_type
);
6852 fl
->l_type
= l_type
;
6853 __get_user(fl
->l_whence
, &target_fl
->l_whence
);
6854 __get_user(fl
->l_start
, &target_fl
->l_start
);
6855 __get_user(fl
->l_len
, &target_fl
->l_len
);
6856 __get_user(fl
->l_pid
, &target_fl
->l_pid
);
6857 unlock_user_struct(target_fl
, target_flock_addr
, 0);
6861 static inline abi_long
copy_to_user_flock64(abi_ulong target_flock_addr
,
6862 const struct flock64
*fl
)
6864 struct target_flock64
*target_fl
;
6867 if (!lock_user_struct(VERIFY_WRITE
, target_fl
, target_flock_addr
, 0)) {
6868 return -TARGET_EFAULT
;
6871 l_type
= host_to_target_flock(fl
->l_type
);
6872 __put_user(l_type
, &target_fl
->l_type
);
6873 __put_user(fl
->l_whence
, &target_fl
->l_whence
);
6874 __put_user(fl
->l_start
, &target_fl
->l_start
);
6875 __put_user(fl
->l_len
, &target_fl
->l_len
);
6876 __put_user(fl
->l_pid
, &target_fl
->l_pid
);
6877 unlock_user_struct(target_fl
, target_flock_addr
, 1);
6881 static abi_long
do_fcntl(int fd
, int cmd
, abi_ulong arg
)
6883 struct flock64 fl64
;
6885 struct f_owner_ex fox
;
6886 struct target_f_owner_ex
*target_fox
;
6889 int host_cmd
= target_to_host_fcntl_cmd(cmd
);
6891 if (host_cmd
== -TARGET_EINVAL
)
6895 case TARGET_F_GETLK
:
6896 ret
= copy_from_user_flock(&fl64
, arg
);
6900 ret
= get_errno(safe_fcntl(fd
, host_cmd
, &fl64
));
6902 ret
= copy_to_user_flock(arg
, &fl64
);
6906 case TARGET_F_SETLK
:
6907 case TARGET_F_SETLKW
:
6908 ret
= copy_from_user_flock(&fl64
, arg
);
6912 ret
= get_errno(safe_fcntl(fd
, host_cmd
, &fl64
));
6915 case TARGET_F_GETLK64
:
6916 case TARGET_F_OFD_GETLK
:
6917 ret
= copy_from_user_flock64(&fl64
, arg
);
6921 ret
= get_errno(safe_fcntl(fd
, host_cmd
, &fl64
));
6923 ret
= copy_to_user_flock64(arg
, &fl64
);
6926 case TARGET_F_SETLK64
:
6927 case TARGET_F_SETLKW64
:
6928 case TARGET_F_OFD_SETLK
:
6929 case TARGET_F_OFD_SETLKW
:
6930 ret
= copy_from_user_flock64(&fl64
, arg
);
6934 ret
= get_errno(safe_fcntl(fd
, host_cmd
, &fl64
));
6937 case TARGET_F_GETFL
:
6938 ret
= get_errno(safe_fcntl(fd
, host_cmd
, arg
));
6940 ret
= host_to_target_bitmask(ret
, fcntl_flags_tbl
);
6944 case TARGET_F_SETFL
:
6945 ret
= get_errno(safe_fcntl(fd
, host_cmd
,
6946 target_to_host_bitmask(arg
,
6951 case TARGET_F_GETOWN_EX
:
6952 ret
= get_errno(safe_fcntl(fd
, host_cmd
, &fox
));
6954 if (!lock_user_struct(VERIFY_WRITE
, target_fox
, arg
, 0))
6955 return -TARGET_EFAULT
;
6956 target_fox
->type
= tswap32(fox
.type
);
6957 target_fox
->pid
= tswap32(fox
.pid
);
6958 unlock_user_struct(target_fox
, arg
, 1);
6964 case TARGET_F_SETOWN_EX
:
6965 if (!lock_user_struct(VERIFY_READ
, target_fox
, arg
, 1))
6966 return -TARGET_EFAULT
;
6967 fox
.type
= tswap32(target_fox
->type
);
6968 fox
.pid
= tswap32(target_fox
->pid
);
6969 unlock_user_struct(target_fox
, arg
, 0);
6970 ret
= get_errno(safe_fcntl(fd
, host_cmd
, &fox
));
6974 case TARGET_F_SETSIG
:
6975 ret
= get_errno(safe_fcntl(fd
, host_cmd
, target_to_host_signal(arg
)));
6978 case TARGET_F_GETSIG
:
6979 ret
= host_to_target_signal(get_errno(safe_fcntl(fd
, host_cmd
, arg
)));
6982 case TARGET_F_SETOWN
:
6983 case TARGET_F_GETOWN
:
6984 case TARGET_F_SETLEASE
:
6985 case TARGET_F_GETLEASE
:
6986 case TARGET_F_SETPIPE_SZ
:
6987 case TARGET_F_GETPIPE_SZ
:
6988 case TARGET_F_ADD_SEALS
:
6989 case TARGET_F_GET_SEALS
:
6990 ret
= get_errno(safe_fcntl(fd
, host_cmd
, arg
));
6994 ret
= get_errno(safe_fcntl(fd
, cmd
, arg
));
7002 static inline int high2lowuid(int uid
)
7010 static inline int high2lowgid(int gid
)
7018 static inline int low2highuid(int uid
)
7020 if ((int16_t)uid
== -1)
7026 static inline int low2highgid(int gid
)
7028 if ((int16_t)gid
== -1)
7033 static inline int tswapid(int id
)
7038 #define put_user_id(x, gaddr) put_user_u16(x, gaddr)
7040 #else /* !USE_UID16 */
7041 static inline int high2lowuid(int uid
)
7045 static inline int high2lowgid(int gid
)
7049 static inline int low2highuid(int uid
)
7053 static inline int low2highgid(int gid
)
7057 static inline int tswapid(int id
)
7062 #define put_user_id(x, gaddr) put_user_u32(x, gaddr)
7064 #endif /* USE_UID16 */
7066 /* We must do direct syscalls for setting UID/GID, because we want to
7067 * implement the Linux system call semantics of "change only for this thread",
7068 * not the libc/POSIX semantics of "change for all threads in process".
7069 * (See http://ewontfix.com/17/ for more details.)
7070 * We use the 32-bit version of the syscalls if present; if it is not
7071 * then either the host architecture supports 32-bit UIDs natively with
7072 * the standard syscall, or the 16-bit UID is the best we can do.
7074 #ifdef __NR_setuid32
7075 #define __NR_sys_setuid __NR_setuid32
7077 #define __NR_sys_setuid __NR_setuid
7079 #ifdef __NR_setgid32
7080 #define __NR_sys_setgid __NR_setgid32
7082 #define __NR_sys_setgid __NR_setgid
7084 #ifdef __NR_setresuid32
7085 #define __NR_sys_setresuid __NR_setresuid32
7087 #define __NR_sys_setresuid __NR_setresuid
7089 #ifdef __NR_setresgid32
7090 #define __NR_sys_setresgid __NR_setresgid32
7092 #define __NR_sys_setresgid __NR_setresgid
7095 _syscall1(int, sys_setuid
, uid_t
, uid
)
7096 _syscall1(int, sys_setgid
, gid_t
, gid
)
7097 _syscall3(int, sys_setresuid
, uid_t
, ruid
, uid_t
, euid
, uid_t
, suid
)
7098 _syscall3(int, sys_setresgid
, gid_t
, rgid
, gid_t
, egid
, gid_t
, sgid
)
7100 void syscall_init(void)
7103 const argtype
*arg_type
;
7107 thunk_init(STRUCT_MAX
);
7109 #define STRUCT(name, ...) thunk_register_struct(STRUCT_ ## name, #name, struct_ ## name ## _def);
7110 #define STRUCT_SPECIAL(name) thunk_register_struct_direct(STRUCT_ ## name, #name, &struct_ ## name ## _def);
7111 #include "syscall_types.h"
7113 #undef STRUCT_SPECIAL
7115 /* Build target_to_host_errno_table[] table from
7116 * host_to_target_errno_table[]. */
7117 for (i
= 0; i
< ERRNO_TABLE_SIZE
; i
++) {
7118 target_to_host_errno_table
[host_to_target_errno_table
[i
]] = i
;
7121 /* we patch the ioctl size if necessary. We rely on the fact that
7122 no ioctl has all the bits at '1' in the size field */
7124 while (ie
->target_cmd
!= 0) {
7125 if (((ie
->target_cmd
>> TARGET_IOC_SIZESHIFT
) & TARGET_IOC_SIZEMASK
) ==
7126 TARGET_IOC_SIZEMASK
) {
7127 arg_type
= ie
->arg_type
;
7128 if (arg_type
[0] != TYPE_PTR
) {
7129 fprintf(stderr
, "cannot patch size for ioctl 0x%x\n",
7134 size
= thunk_type_size(arg_type
, 0);
7135 ie
->target_cmd
= (ie
->target_cmd
&
7136 ~(TARGET_IOC_SIZEMASK
<< TARGET_IOC_SIZESHIFT
)) |
7137 (size
<< TARGET_IOC_SIZESHIFT
);
7140 /* automatic consistency check if same arch */
7141 #if (defined(__i386__) && defined(TARGET_I386) && defined(TARGET_ABI32)) || \
7142 (defined(__x86_64__) && defined(TARGET_X86_64))
7143 if (unlikely(ie
->target_cmd
!= ie
->host_cmd
)) {
7144 fprintf(stderr
, "ERROR: ioctl(%s): target=0x%x host=0x%x\n",
7145 ie
->name
, ie
->target_cmd
, ie
->host_cmd
);
7152 #ifdef TARGET_NR_truncate64
7153 static inline abi_long
target_truncate64(void *cpu_env
, const char *arg1
,
7158 if (regpairs_aligned(cpu_env
, TARGET_NR_truncate64
)) {
7162 return get_errno(truncate64(arg1
, target_offset64(arg2
, arg3
)));
7166 #ifdef TARGET_NR_ftruncate64
7167 static inline abi_long
target_ftruncate64(void *cpu_env
, abi_long arg1
,
7172 if (regpairs_aligned(cpu_env
, TARGET_NR_ftruncate64
)) {
7176 return get_errno(ftruncate64(arg1
, target_offset64(arg2
, arg3
)));
7180 #if defined(TARGET_NR_timer_settime) || \
7181 (defined(TARGET_NR_timerfd_settime) && defined(CONFIG_TIMERFD))
7182 static inline abi_long
target_to_host_itimerspec(struct itimerspec
*host_its
,
7183 abi_ulong target_addr
)
7185 if (target_to_host_timespec(&host_its
->it_interval
, target_addr
+
7186 offsetof(struct target_itimerspec
,
7188 target_to_host_timespec(&host_its
->it_value
, target_addr
+
7189 offsetof(struct target_itimerspec
,
7191 return -TARGET_EFAULT
;
7198 #if defined(TARGET_NR_timer_settime64) || \
7199 (defined(TARGET_NR_timerfd_settime64) && defined(CONFIG_TIMERFD))
7200 static inline abi_long
target_to_host_itimerspec64(struct itimerspec
*host_its
,
7201 abi_ulong target_addr
)
7203 if (target_to_host_timespec64(&host_its
->it_interval
, target_addr
+
7204 offsetof(struct target__kernel_itimerspec
,
7206 target_to_host_timespec64(&host_its
->it_value
, target_addr
+
7207 offsetof(struct target__kernel_itimerspec
,
7209 return -TARGET_EFAULT
;
7216 #if ((defined(TARGET_NR_timerfd_gettime) || \
7217 defined(TARGET_NR_timerfd_settime)) && defined(CONFIG_TIMERFD)) || \
7218 defined(TARGET_NR_timer_gettime) || defined(TARGET_NR_timer_settime)
7219 static inline abi_long
host_to_target_itimerspec(abi_ulong target_addr
,
7220 struct itimerspec
*host_its
)
7222 if (host_to_target_timespec(target_addr
+ offsetof(struct target_itimerspec
,
7224 &host_its
->it_interval
) ||
7225 host_to_target_timespec(target_addr
+ offsetof(struct target_itimerspec
,
7227 &host_its
->it_value
)) {
7228 return -TARGET_EFAULT
;
7234 #if ((defined(TARGET_NR_timerfd_gettime64) || \
7235 defined(TARGET_NR_timerfd_settime64)) && defined(CONFIG_TIMERFD)) || \
7236 defined(TARGET_NR_timer_gettime64) || defined(TARGET_NR_timer_settime64)
7237 static inline abi_long
host_to_target_itimerspec64(abi_ulong target_addr
,
7238 struct itimerspec
*host_its
)
7240 if (host_to_target_timespec64(target_addr
+
7241 offsetof(struct target__kernel_itimerspec
,
7243 &host_its
->it_interval
) ||
7244 host_to_target_timespec64(target_addr
+
7245 offsetof(struct target__kernel_itimerspec
,
7247 &host_its
->it_value
)) {
7248 return -TARGET_EFAULT
;
7254 #if defined(TARGET_NR_adjtimex) || \
7255 (defined(TARGET_NR_clock_adjtime) && defined(CONFIG_CLOCK_ADJTIME))
7256 static inline abi_long
target_to_host_timex(struct timex
*host_tx
,
7257 abi_long target_addr
)
7259 struct target_timex
*target_tx
;
7261 if (!lock_user_struct(VERIFY_READ
, target_tx
, target_addr
, 1)) {
7262 return -TARGET_EFAULT
;
7265 __get_user(host_tx
->modes
, &target_tx
->modes
);
7266 __get_user(host_tx
->offset
, &target_tx
->offset
);
7267 __get_user(host_tx
->freq
, &target_tx
->freq
);
7268 __get_user(host_tx
->maxerror
, &target_tx
->maxerror
);
7269 __get_user(host_tx
->esterror
, &target_tx
->esterror
);
7270 __get_user(host_tx
->status
, &target_tx
->status
);
7271 __get_user(host_tx
->constant
, &target_tx
->constant
);
7272 __get_user(host_tx
->precision
, &target_tx
->precision
);
7273 __get_user(host_tx
->tolerance
, &target_tx
->tolerance
);
7274 __get_user(host_tx
->time
.tv_sec
, &target_tx
->time
.tv_sec
);
7275 __get_user(host_tx
->time
.tv_usec
, &target_tx
->time
.tv_usec
);
7276 __get_user(host_tx
->tick
, &target_tx
->tick
);
7277 __get_user(host_tx
->ppsfreq
, &target_tx
->ppsfreq
);
7278 __get_user(host_tx
->jitter
, &target_tx
->jitter
);
7279 __get_user(host_tx
->shift
, &target_tx
->shift
);
7280 __get_user(host_tx
->stabil
, &target_tx
->stabil
);
7281 __get_user(host_tx
->jitcnt
, &target_tx
->jitcnt
);
7282 __get_user(host_tx
->calcnt
, &target_tx
->calcnt
);
7283 __get_user(host_tx
->errcnt
, &target_tx
->errcnt
);
7284 __get_user(host_tx
->stbcnt
, &target_tx
->stbcnt
);
7285 __get_user(host_tx
->tai
, &target_tx
->tai
);
7287 unlock_user_struct(target_tx
, target_addr
, 0);
7291 static inline abi_long
host_to_target_timex(abi_long target_addr
,
7292 struct timex
*host_tx
)
7294 struct target_timex
*target_tx
;
7296 if (!lock_user_struct(VERIFY_WRITE
, target_tx
, target_addr
, 0)) {
7297 return -TARGET_EFAULT
;
7300 __put_user(host_tx
->modes
, &target_tx
->modes
);
7301 __put_user(host_tx
->offset
, &target_tx
->offset
);
7302 __put_user(host_tx
->freq
, &target_tx
->freq
);
7303 __put_user(host_tx
->maxerror
, &target_tx
->maxerror
);
7304 __put_user(host_tx
->esterror
, &target_tx
->esterror
);
7305 __put_user(host_tx
->status
, &target_tx
->status
);
7306 __put_user(host_tx
->constant
, &target_tx
->constant
);
7307 __put_user(host_tx
->precision
, &target_tx
->precision
);
7308 __put_user(host_tx
->tolerance
, &target_tx
->tolerance
);
7309 __put_user(host_tx
->time
.tv_sec
, &target_tx
->time
.tv_sec
);
7310 __put_user(host_tx
->time
.tv_usec
, &target_tx
->time
.tv_usec
);
7311 __put_user(host_tx
->tick
, &target_tx
->tick
);
7312 __put_user(host_tx
->ppsfreq
, &target_tx
->ppsfreq
);
7313 __put_user(host_tx
->jitter
, &target_tx
->jitter
);
7314 __put_user(host_tx
->shift
, &target_tx
->shift
);
7315 __put_user(host_tx
->stabil
, &target_tx
->stabil
);
7316 __put_user(host_tx
->jitcnt
, &target_tx
->jitcnt
);
7317 __put_user(host_tx
->calcnt
, &target_tx
->calcnt
);
7318 __put_user(host_tx
->errcnt
, &target_tx
->errcnt
);
7319 __put_user(host_tx
->stbcnt
, &target_tx
->stbcnt
);
7320 __put_user(host_tx
->tai
, &target_tx
->tai
);
7322 unlock_user_struct(target_tx
, target_addr
, 1);
7328 #if defined(TARGET_NR_clock_adjtime64) && defined(CONFIG_CLOCK_ADJTIME)
7329 static inline abi_long
target_to_host_timex64(struct timex
*host_tx
,
7330 abi_long target_addr
)
7332 struct target__kernel_timex
*target_tx
;
7334 if (copy_from_user_timeval64(&host_tx
->time
, target_addr
+
7335 offsetof(struct target__kernel_timex
,
7337 return -TARGET_EFAULT
;
7340 if (!lock_user_struct(VERIFY_READ
, target_tx
, target_addr
, 1)) {
7341 return -TARGET_EFAULT
;
7344 __get_user(host_tx
->modes
, &target_tx
->modes
);
7345 __get_user(host_tx
->offset
, &target_tx
->offset
);
7346 __get_user(host_tx
->freq
, &target_tx
->freq
);
7347 __get_user(host_tx
->maxerror
, &target_tx
->maxerror
);
7348 __get_user(host_tx
->esterror
, &target_tx
->esterror
);
7349 __get_user(host_tx
->status
, &target_tx
->status
);
7350 __get_user(host_tx
->constant
, &target_tx
->constant
);
7351 __get_user(host_tx
->precision
, &target_tx
->precision
);
7352 __get_user(host_tx
->tolerance
, &target_tx
->tolerance
);
7353 __get_user(host_tx
->tick
, &target_tx
->tick
);
7354 __get_user(host_tx
->ppsfreq
, &target_tx
->ppsfreq
);
7355 __get_user(host_tx
->jitter
, &target_tx
->jitter
);
7356 __get_user(host_tx
->shift
, &target_tx
->shift
);
7357 __get_user(host_tx
->stabil
, &target_tx
->stabil
);
7358 __get_user(host_tx
->jitcnt
, &target_tx
->jitcnt
);
7359 __get_user(host_tx
->calcnt
, &target_tx
->calcnt
);
7360 __get_user(host_tx
->errcnt
, &target_tx
->errcnt
);
7361 __get_user(host_tx
->stbcnt
, &target_tx
->stbcnt
);
7362 __get_user(host_tx
->tai
, &target_tx
->tai
);
7364 unlock_user_struct(target_tx
, target_addr
, 0);
7368 static inline abi_long
host_to_target_timex64(abi_long target_addr
,
7369 struct timex
*host_tx
)
7371 struct target__kernel_timex
*target_tx
;
7373 if (copy_to_user_timeval64(target_addr
+
7374 offsetof(struct target__kernel_timex
, time
),
7376 return -TARGET_EFAULT
;
7379 if (!lock_user_struct(VERIFY_WRITE
, target_tx
, target_addr
, 0)) {
7380 return -TARGET_EFAULT
;
7383 __put_user(host_tx
->modes
, &target_tx
->modes
);
7384 __put_user(host_tx
->offset
, &target_tx
->offset
);
7385 __put_user(host_tx
->freq
, &target_tx
->freq
);
7386 __put_user(host_tx
->maxerror
, &target_tx
->maxerror
);
7387 __put_user(host_tx
->esterror
, &target_tx
->esterror
);
7388 __put_user(host_tx
->status
, &target_tx
->status
);
7389 __put_user(host_tx
->constant
, &target_tx
->constant
);
7390 __put_user(host_tx
->precision
, &target_tx
->precision
);
7391 __put_user(host_tx
->tolerance
, &target_tx
->tolerance
);
7392 __put_user(host_tx
->tick
, &target_tx
->tick
);
7393 __put_user(host_tx
->ppsfreq
, &target_tx
->ppsfreq
);
7394 __put_user(host_tx
->jitter
, &target_tx
->jitter
);
7395 __put_user(host_tx
->shift
, &target_tx
->shift
);
7396 __put_user(host_tx
->stabil
, &target_tx
->stabil
);
7397 __put_user(host_tx
->jitcnt
, &target_tx
->jitcnt
);
7398 __put_user(host_tx
->calcnt
, &target_tx
->calcnt
);
7399 __put_user(host_tx
->errcnt
, &target_tx
->errcnt
);
7400 __put_user(host_tx
->stbcnt
, &target_tx
->stbcnt
);
7401 __put_user(host_tx
->tai
, &target_tx
->tai
);
7403 unlock_user_struct(target_tx
, target_addr
, 1);
7408 #ifndef HAVE_SIGEV_NOTIFY_THREAD_ID
7409 #define sigev_notify_thread_id _sigev_un._tid
7412 static inline abi_long
target_to_host_sigevent(struct sigevent
*host_sevp
,
7413 abi_ulong target_addr
)
7415 struct target_sigevent
*target_sevp
;
7417 if (!lock_user_struct(VERIFY_READ
, target_sevp
, target_addr
, 1)) {
7418 return -TARGET_EFAULT
;
7421 /* This union is awkward on 64 bit systems because it has a 32 bit
7422 * integer and a pointer in it; we follow the conversion approach
7423 * used for handling sigval types in signal.c so the guest should get
7424 * the correct value back even if we did a 64 bit byteswap and it's
7425 * using the 32 bit integer.
7427 host_sevp
->sigev_value
.sival_ptr
=
7428 (void *)(uintptr_t)tswapal(target_sevp
->sigev_value
.sival_ptr
);
7429 host_sevp
->sigev_signo
=
7430 target_to_host_signal(tswap32(target_sevp
->sigev_signo
));
7431 host_sevp
->sigev_notify
= tswap32(target_sevp
->sigev_notify
);
7432 host_sevp
->sigev_notify_thread_id
= tswap32(target_sevp
->_sigev_un
._tid
);
7434 unlock_user_struct(target_sevp
, target_addr
, 1);
7438 #if defined(TARGET_NR_mlockall)
7439 static inline int target_to_host_mlockall_arg(int arg
)
7443 if (arg
& TARGET_MCL_CURRENT
) {
7444 result
|= MCL_CURRENT
;
7446 if (arg
& TARGET_MCL_FUTURE
) {
7447 result
|= MCL_FUTURE
;
7450 if (arg
& TARGET_MCL_ONFAULT
) {
7451 result
|= MCL_ONFAULT
;
7459 #if (defined(TARGET_NR_stat64) || defined(TARGET_NR_lstat64) || \
7460 defined(TARGET_NR_fstat64) || defined(TARGET_NR_fstatat64) || \
7461 defined(TARGET_NR_newfstatat))
7462 static inline abi_long
host_to_target_stat64(void *cpu_env
,
7463 abi_ulong target_addr
,
7464 struct stat
*host_st
)
7466 #if defined(TARGET_ARM) && defined(TARGET_ABI32)
7467 if (((CPUARMState
*)cpu_env
)->eabi
) {
7468 struct target_eabi_stat64
*target_st
;
7470 if (!lock_user_struct(VERIFY_WRITE
, target_st
, target_addr
, 0))
7471 return -TARGET_EFAULT
;
7472 memset(target_st
, 0, sizeof(struct target_eabi_stat64
));
7473 __put_user(host_st
->st_dev
, &target_st
->st_dev
);
7474 __put_user(host_st
->st_ino
, &target_st
->st_ino
);
7475 #ifdef TARGET_STAT64_HAS_BROKEN_ST_INO
7476 __put_user(host_st
->st_ino
, &target_st
->__st_ino
);
7478 __put_user(host_st
->st_mode
, &target_st
->st_mode
);
7479 __put_user(host_st
->st_nlink
, &target_st
->st_nlink
);
7480 __put_user(host_st
->st_uid
, &target_st
->st_uid
);
7481 __put_user(host_st
->st_gid
, &target_st
->st_gid
);
7482 __put_user(host_st
->st_rdev
, &target_st
->st_rdev
);
7483 __put_user(host_st
->st_size
, &target_st
->st_size
);
7484 __put_user(host_st
->st_blksize
, &target_st
->st_blksize
);
7485 __put_user(host_st
->st_blocks
, &target_st
->st_blocks
);
7486 __put_user(host_st
->st_atime
, &target_st
->target_st_atime
);
7487 __put_user(host_st
->st_mtime
, &target_st
->target_st_mtime
);
7488 __put_user(host_st
->st_ctime
, &target_st
->target_st_ctime
);
7489 #ifdef HAVE_STRUCT_STAT_ST_ATIM
7490 __put_user(host_st
->st_atim
.tv_nsec
, &target_st
->target_st_atime_nsec
);
7491 __put_user(host_st
->st_mtim
.tv_nsec
, &target_st
->target_st_mtime_nsec
);
7492 __put_user(host_st
->st_ctim
.tv_nsec
, &target_st
->target_st_ctime_nsec
);
7494 unlock_user_struct(target_st
, target_addr
, 1);
7498 #if defined(TARGET_HAS_STRUCT_STAT64)
7499 struct target_stat64
*target_st
;
7501 struct target_stat
*target_st
;
7504 if (!lock_user_struct(VERIFY_WRITE
, target_st
, target_addr
, 0))
7505 return -TARGET_EFAULT
;
7506 memset(target_st
, 0, sizeof(*target_st
));
7507 __put_user(host_st
->st_dev
, &target_st
->st_dev
);
7508 __put_user(host_st
->st_ino
, &target_st
->st_ino
);
7509 #ifdef TARGET_STAT64_HAS_BROKEN_ST_INO
7510 __put_user(host_st
->st_ino
, &target_st
->__st_ino
);
7512 __put_user(host_st
->st_mode
, &target_st
->st_mode
);
7513 __put_user(host_st
->st_nlink
, &target_st
->st_nlink
);
7514 __put_user(host_st
->st_uid
, &target_st
->st_uid
);
7515 __put_user(host_st
->st_gid
, &target_st
->st_gid
);
7516 __put_user(host_st
->st_rdev
, &target_st
->st_rdev
);
7517 /* XXX: better use of kernel struct */
7518 __put_user(host_st
->st_size
, &target_st
->st_size
);
7519 __put_user(host_st
->st_blksize
, &target_st
->st_blksize
);
7520 __put_user(host_st
->st_blocks
, &target_st
->st_blocks
);
7521 __put_user(host_st
->st_atime
, &target_st
->target_st_atime
);
7522 __put_user(host_st
->st_mtime
, &target_st
->target_st_mtime
);
7523 __put_user(host_st
->st_ctime
, &target_st
->target_st_ctime
);
7524 #ifdef HAVE_STRUCT_STAT_ST_ATIM
7525 __put_user(host_st
->st_atim
.tv_nsec
, &target_st
->target_st_atime_nsec
);
7526 __put_user(host_st
->st_mtim
.tv_nsec
, &target_st
->target_st_mtime_nsec
);
7527 __put_user(host_st
->st_ctim
.tv_nsec
, &target_st
->target_st_ctime_nsec
);
7529 unlock_user_struct(target_st
, target_addr
, 1);
7536 #if defined(TARGET_NR_statx) && defined(__NR_statx)
7537 static inline abi_long
host_to_target_statx(struct target_statx
*host_stx
,
7538 abi_ulong target_addr
)
7540 struct target_statx
*target_stx
;
7542 if (!lock_user_struct(VERIFY_WRITE
, target_stx
, target_addr
, 0)) {
7543 return -TARGET_EFAULT
;
7545 memset(target_stx
, 0, sizeof(*target_stx
));
7547 __put_user(host_stx
->stx_mask
, &target_stx
->stx_mask
);
7548 __put_user(host_stx
->stx_blksize
, &target_stx
->stx_blksize
);
7549 __put_user(host_stx
->stx_attributes
, &target_stx
->stx_attributes
);
7550 __put_user(host_stx
->stx_nlink
, &target_stx
->stx_nlink
);
7551 __put_user(host_stx
->stx_uid
, &target_stx
->stx_uid
);
7552 __put_user(host_stx
->stx_gid
, &target_stx
->stx_gid
);
7553 __put_user(host_stx
->stx_mode
, &target_stx
->stx_mode
);
7554 __put_user(host_stx
->stx_ino
, &target_stx
->stx_ino
);
7555 __put_user(host_stx
->stx_size
, &target_stx
->stx_size
);
7556 __put_user(host_stx
->stx_blocks
, &target_stx
->stx_blocks
);
7557 __put_user(host_stx
->stx_attributes_mask
, &target_stx
->stx_attributes_mask
);
7558 __put_user(host_stx
->stx_atime
.tv_sec
, &target_stx
->stx_atime
.tv_sec
);
7559 __put_user(host_stx
->stx_atime
.tv_nsec
, &target_stx
->stx_atime
.tv_nsec
);
7560 __put_user(host_stx
->stx_btime
.tv_sec
, &target_stx
->stx_btime
.tv_sec
);
7561 __put_user(host_stx
->stx_btime
.tv_nsec
, &target_stx
->stx_btime
.tv_nsec
);
7562 __put_user(host_stx
->stx_ctime
.tv_sec
, &target_stx
->stx_ctime
.tv_sec
);
7563 __put_user(host_stx
->stx_ctime
.tv_nsec
, &target_stx
->stx_ctime
.tv_nsec
);
7564 __put_user(host_stx
->stx_mtime
.tv_sec
, &target_stx
->stx_mtime
.tv_sec
);
7565 __put_user(host_stx
->stx_mtime
.tv_nsec
, &target_stx
->stx_mtime
.tv_nsec
);
7566 __put_user(host_stx
->stx_rdev_major
, &target_stx
->stx_rdev_major
);
7567 __put_user(host_stx
->stx_rdev_minor
, &target_stx
->stx_rdev_minor
);
7568 __put_user(host_stx
->stx_dev_major
, &target_stx
->stx_dev_major
);
7569 __put_user(host_stx
->stx_dev_minor
, &target_stx
->stx_dev_minor
);
7571 unlock_user_struct(target_stx
, target_addr
, 1);
7577 static int do_sys_futex(int *uaddr
, int op
, int val
,
7578 const struct timespec
*timeout
, int *uaddr2
,
7581 #if HOST_LONG_BITS == 64
7582 #if defined(__NR_futex)
7583 /* always a 64-bit time_t, it doesn't define _time64 version */
7584 return sys_futex(uaddr
, op
, val
, timeout
, uaddr2
, val3
);
7587 #else /* HOST_LONG_BITS == 64 */
7588 #if defined(__NR_futex_time64)
7589 if (sizeof(timeout
->tv_sec
) == 8) {
7590 /* _time64 function on 32bit arch */
7591 return sys_futex_time64(uaddr
, op
, val
, timeout
, uaddr2
, val3
);
7594 #if defined(__NR_futex)
7595 /* old function on 32bit arch */
7596 return sys_futex(uaddr
, op
, val
, timeout
, uaddr2
, val3
);
7598 #endif /* HOST_LONG_BITS == 64 */
7599 g_assert_not_reached();
7602 static int do_safe_futex(int *uaddr
, int op
, int val
,
7603 const struct timespec
*timeout
, int *uaddr2
,
7606 #if HOST_LONG_BITS == 64
7607 #if defined(__NR_futex)
7608 /* always a 64-bit time_t, it doesn't define _time64 version */
7609 return get_errno(safe_futex(uaddr
, op
, val
, timeout
, uaddr2
, val3
));
7611 #else /* HOST_LONG_BITS == 64 */
7612 #if defined(__NR_futex_time64)
7613 if (sizeof(timeout
->tv_sec
) == 8) {
7614 /* _time64 function on 32bit arch */
7615 return get_errno(safe_futex_time64(uaddr
, op
, val
, timeout
, uaddr2
,
7619 #if defined(__NR_futex)
7620 /* old function on 32bit arch */
7621 return get_errno(safe_futex(uaddr
, op
, val
, timeout
, uaddr2
, val3
));
7623 #endif /* HOST_LONG_BITS == 64 */
7624 return -TARGET_ENOSYS
;
7627 /* ??? Using host futex calls even when target atomic operations
7628 are not really atomic probably breaks things. However implementing
7629 futexes locally would make futexes shared between multiple processes
7630 tricky. However they're probably useless because guest atomic
7631 operations won't work either. */
7632 #if defined(TARGET_NR_futex)
7633 static int do_futex(CPUState
*cpu
, target_ulong uaddr
, int op
, int val
,
7634 target_ulong timeout
, target_ulong uaddr2
, int val3
)
7636 struct timespec ts
, *pts
;
7639 /* ??? We assume FUTEX_* constants are the same on both host
7641 #ifdef FUTEX_CMD_MASK
7642 base_op
= op
& FUTEX_CMD_MASK
;
7648 case FUTEX_WAIT_BITSET
:
7651 target_to_host_timespec(pts
, timeout
);
7655 return do_safe_futex(g2h(cpu
, uaddr
),
7656 op
, tswap32(val
), pts
, NULL
, val3
);
7658 return do_safe_futex(g2h(cpu
, uaddr
),
7659 op
, val
, NULL
, NULL
, 0);
7661 return do_safe_futex(g2h(cpu
, uaddr
),
7662 op
, val
, NULL
, NULL
, 0);
7664 case FUTEX_CMP_REQUEUE
:
7666 /* For FUTEX_REQUEUE, FUTEX_CMP_REQUEUE, and FUTEX_WAKE_OP, the
7667 TIMEOUT parameter is interpreted as a uint32_t by the kernel.
7668 But the prototype takes a `struct timespec *'; insert casts
7669 to satisfy the compiler. We do not need to tswap TIMEOUT
7670 since it's not compared to guest memory. */
7671 pts
= (struct timespec
*)(uintptr_t) timeout
;
7672 return do_safe_futex(g2h(cpu
, uaddr
), op
, val
, pts
, g2h(cpu
, uaddr2
),
7673 (base_op
== FUTEX_CMP_REQUEUE
7674 ? tswap32(val3
) : val3
));
7676 return -TARGET_ENOSYS
;
7681 #if defined(TARGET_NR_futex_time64)
7682 static int do_futex_time64(CPUState
*cpu
, target_ulong uaddr
, int op
,
7683 int val
, target_ulong timeout
,
7684 target_ulong uaddr2
, int val3
)
7686 struct timespec ts
, *pts
;
7689 /* ??? We assume FUTEX_* constants are the same on both host
7691 #ifdef FUTEX_CMD_MASK
7692 base_op
= op
& FUTEX_CMD_MASK
;
7698 case FUTEX_WAIT_BITSET
:
7701 if (target_to_host_timespec64(pts
, timeout
)) {
7702 return -TARGET_EFAULT
;
7707 return do_safe_futex(g2h(cpu
, uaddr
), op
,
7708 tswap32(val
), pts
, NULL
, val3
);
7710 return do_safe_futex(g2h(cpu
, uaddr
), op
, val
, NULL
, NULL
, 0);
7712 return do_safe_futex(g2h(cpu
, uaddr
), op
, val
, NULL
, NULL
, 0);
7714 case FUTEX_CMP_REQUEUE
:
7716 /* For FUTEX_REQUEUE, FUTEX_CMP_REQUEUE, and FUTEX_WAKE_OP, the
7717 TIMEOUT parameter is interpreted as a uint32_t by the kernel.
7718 But the prototype takes a `struct timespec *'; insert casts
7719 to satisfy the compiler. We do not need to tswap TIMEOUT
7720 since it's not compared to guest memory. */
7721 pts
= (struct timespec
*)(uintptr_t) timeout
;
7722 return do_safe_futex(g2h(cpu
, uaddr
), op
, val
, pts
, g2h(cpu
, uaddr2
),
7723 (base_op
== FUTEX_CMP_REQUEUE
7724 ? tswap32(val3
) : val3
));
7726 return -TARGET_ENOSYS
;
7731 #if defined(TARGET_NR_name_to_handle_at) && defined(CONFIG_OPEN_BY_HANDLE)
7732 static abi_long
do_name_to_handle_at(abi_long dirfd
, abi_long pathname
,
7733 abi_long handle
, abi_long mount_id
,
7736 struct file_handle
*target_fh
;
7737 struct file_handle
*fh
;
7741 unsigned int size
, total_size
;
7743 if (get_user_s32(size
, handle
)) {
7744 return -TARGET_EFAULT
;
7747 name
= lock_user_string(pathname
);
7749 return -TARGET_EFAULT
;
7752 total_size
= sizeof(struct file_handle
) + size
;
7753 target_fh
= lock_user(VERIFY_WRITE
, handle
, total_size
, 0);
7755 unlock_user(name
, pathname
, 0);
7756 return -TARGET_EFAULT
;
7759 fh
= g_malloc0(total_size
);
7760 fh
->handle_bytes
= size
;
7762 ret
= get_errno(name_to_handle_at(dirfd
, path(name
), fh
, &mid
, flags
));
7763 unlock_user(name
, pathname
, 0);
7765 /* man name_to_handle_at(2):
7766 * Other than the use of the handle_bytes field, the caller should treat
7767 * the file_handle structure as an opaque data type
7770 memcpy(target_fh
, fh
, total_size
);
7771 target_fh
->handle_bytes
= tswap32(fh
->handle_bytes
);
7772 target_fh
->handle_type
= tswap32(fh
->handle_type
);
7774 unlock_user(target_fh
, handle
, total_size
);
7776 if (put_user_s32(mid
, mount_id
)) {
7777 return -TARGET_EFAULT
;
7785 #if defined(TARGET_NR_open_by_handle_at) && defined(CONFIG_OPEN_BY_HANDLE)
7786 static abi_long
do_open_by_handle_at(abi_long mount_fd
, abi_long handle
,
7789 struct file_handle
*target_fh
;
7790 struct file_handle
*fh
;
7791 unsigned int size
, total_size
;
7794 if (get_user_s32(size
, handle
)) {
7795 return -TARGET_EFAULT
;
7798 total_size
= sizeof(struct file_handle
) + size
;
7799 target_fh
= lock_user(VERIFY_READ
, handle
, total_size
, 1);
7801 return -TARGET_EFAULT
;
7804 fh
= g_memdup(target_fh
, total_size
);
7805 fh
->handle_bytes
= size
;
7806 fh
->handle_type
= tswap32(target_fh
->handle_type
);
7808 ret
= get_errno(open_by_handle_at(mount_fd
, fh
,
7809 target_to_host_bitmask(flags
, fcntl_flags_tbl
)));
7813 unlock_user(target_fh
, handle
, total_size
);
7819 #if defined(TARGET_NR_signalfd) || defined(TARGET_NR_signalfd4)
7821 static abi_long
do_signalfd4(int fd
, abi_long mask
, int flags
)
7824 target_sigset_t
*target_mask
;
7828 if (flags
& ~(TARGET_O_NONBLOCK_MASK
| TARGET_O_CLOEXEC
)) {
7829 return -TARGET_EINVAL
;
7831 if (!lock_user_struct(VERIFY_READ
, target_mask
, mask
, 1)) {
7832 return -TARGET_EFAULT
;
7835 target_to_host_sigset(&host_mask
, target_mask
);
7837 host_flags
= target_to_host_bitmask(flags
, fcntl_flags_tbl
);
7839 ret
= get_errno(signalfd(fd
, &host_mask
, host_flags
));
7841 fd_trans_register(ret
, &target_signalfd_trans
);
7844 unlock_user_struct(target_mask
, mask
, 0);
7850 /* Map host to target signal numbers for the wait family of syscalls.
7851 Assume all other status bits are the same. */
7852 int host_to_target_waitstatus(int status
)
7854 if (WIFSIGNALED(status
)) {
7855 return host_to_target_signal(WTERMSIG(status
)) | (status
& ~0x7f);
7857 if (WIFSTOPPED(status
)) {
7858 return (host_to_target_signal(WSTOPSIG(status
)) << 8)
7864 static int open_self_cmdline(void *cpu_env
, int fd
)
7866 CPUState
*cpu
= env_cpu((CPUArchState
*)cpu_env
);
7867 struct linux_binprm
*bprm
= ((TaskState
*)cpu
->opaque
)->bprm
;
7870 for (i
= 0; i
< bprm
->argc
; i
++) {
7871 size_t len
= strlen(bprm
->argv
[i
]) + 1;
7873 if (write(fd
, bprm
->argv
[i
], len
) != len
) {
7881 static int open_self_maps(void *cpu_env
, int fd
)
7883 CPUState
*cpu
= env_cpu((CPUArchState
*)cpu_env
);
7884 TaskState
*ts
= cpu
->opaque
;
7885 GSList
*map_info
= read_self_maps();
7889 for (s
= map_info
; s
; s
= g_slist_next(s
)) {
7890 MapInfo
*e
= (MapInfo
*) s
->data
;
7892 if (h2g_valid(e
->start
)) {
7893 unsigned long min
= e
->start
;
7894 unsigned long max
= e
->end
;
7895 int flags
= page_get_flags(h2g(min
));
7898 max
= h2g_valid(max
- 1) ?
7899 max
: (uintptr_t) g2h_untagged(GUEST_ADDR_MAX
) + 1;
7901 if (page_check_range(h2g(min
), max
- min
, flags
) == -1) {
7905 if (h2g(min
) == ts
->info
->stack_limit
) {
7911 count
= dprintf(fd
, TARGET_ABI_FMT_ptr
"-" TARGET_ABI_FMT_ptr
7912 " %c%c%c%c %08" PRIx64
" %s %"PRId64
,
7913 h2g(min
), h2g(max
- 1) + 1,
7914 (flags
& PAGE_READ
) ? 'r' : '-',
7915 (flags
& PAGE_WRITE_ORG
) ? 'w' : '-',
7916 (flags
& PAGE_EXEC
) ? 'x' : '-',
7917 e
->is_priv
? 'p' : '-',
7918 (uint64_t) e
->offset
, e
->dev
, e
->inode
);
7920 dprintf(fd
, "%*s%s\n", 73 - count
, "", path
);
7927 free_self_maps(map_info
);
7929 #ifdef TARGET_VSYSCALL_PAGE
7931 * We only support execution from the vsyscall page.
7932 * This is as if CONFIG_LEGACY_VSYSCALL_XONLY=y from v5.3.
7934 count
= dprintf(fd
, TARGET_FMT_lx
"-" TARGET_FMT_lx
7935 " --xp 00000000 00:00 0",
7936 TARGET_VSYSCALL_PAGE
, TARGET_VSYSCALL_PAGE
+ TARGET_PAGE_SIZE
);
7937 dprintf(fd
, "%*s%s\n", 73 - count
, "", "[vsyscall]");
7943 static int open_self_stat(void *cpu_env
, int fd
)
7945 CPUState
*cpu
= env_cpu((CPUArchState
*)cpu_env
);
7946 TaskState
*ts
= cpu
->opaque
;
7947 g_autoptr(GString
) buf
= g_string_new(NULL
);
7950 for (i
= 0; i
< 44; i
++) {
7953 g_string_printf(buf
, FMT_pid
" ", getpid());
7954 } else if (i
== 1) {
7956 gchar
*bin
= g_strrstr(ts
->bprm
->argv
[0], "/");
7957 bin
= bin
? bin
+ 1 : ts
->bprm
->argv
[0];
7958 g_string_printf(buf
, "(%.15s) ", bin
);
7959 } else if (i
== 3) {
7961 g_string_printf(buf
, FMT_pid
" ", getppid());
7962 } else if (i
== 27) {
7964 g_string_printf(buf
, TARGET_ABI_FMT_ld
" ", ts
->info
->start_stack
);
7966 /* for the rest, there is MasterCard */
7967 g_string_printf(buf
, "0%c", i
== 43 ? '\n' : ' ');
7970 if (write(fd
, buf
->str
, buf
->len
) != buf
->len
) {
7978 static int open_self_auxv(void *cpu_env
, int fd
)
7980 CPUState
*cpu
= env_cpu((CPUArchState
*)cpu_env
);
7981 TaskState
*ts
= cpu
->opaque
;
7982 abi_ulong auxv
= ts
->info
->saved_auxv
;
7983 abi_ulong len
= ts
->info
->auxv_len
;
7987 * Auxiliary vector is stored in target process stack.
7988 * read in whole auxv vector and copy it to file
7990 ptr
= lock_user(VERIFY_READ
, auxv
, len
, 0);
7994 r
= write(fd
, ptr
, len
);
8001 lseek(fd
, 0, SEEK_SET
);
8002 unlock_user(ptr
, auxv
, len
);
8008 static int is_proc_myself(const char *filename
, const char *entry
)
8010 if (!strncmp(filename
, "/proc/", strlen("/proc/"))) {
8011 filename
+= strlen("/proc/");
8012 if (!strncmp(filename
, "self/", strlen("self/"))) {
8013 filename
+= strlen("self/");
8014 } else if (*filename
>= '1' && *filename
<= '9') {
8016 snprintf(myself
, sizeof(myself
), "%d/", getpid());
8017 if (!strncmp(filename
, myself
, strlen(myself
))) {
8018 filename
+= strlen(myself
);
8025 if (!strcmp(filename
, entry
)) {
8032 #if defined(HOST_WORDS_BIGENDIAN) != defined(TARGET_WORDS_BIGENDIAN) || \
8033 defined(TARGET_SPARC) || defined(TARGET_M68K) || defined(TARGET_HPPA)
8034 static int is_proc(const char *filename
, const char *entry
)
8036 return strcmp(filename
, entry
) == 0;
8040 #if defined(HOST_WORDS_BIGENDIAN) != defined(TARGET_WORDS_BIGENDIAN)
8041 static int open_net_route(void *cpu_env
, int fd
)
8048 fp
= fopen("/proc/net/route", "r");
8055 read
= getline(&line
, &len
, fp
);
8056 dprintf(fd
, "%s", line
);
8060 while ((read
= getline(&line
, &len
, fp
)) != -1) {
8062 uint32_t dest
, gw
, mask
;
8063 unsigned int flags
, refcnt
, use
, metric
, mtu
, window
, irtt
;
8066 fields
= sscanf(line
,
8067 "%s\t%08x\t%08x\t%04x\t%d\t%d\t%d\t%08x\t%d\t%u\t%u\n",
8068 iface
, &dest
, &gw
, &flags
, &refcnt
, &use
, &metric
,
8069 &mask
, &mtu
, &window
, &irtt
);
8073 dprintf(fd
, "%s\t%08x\t%08x\t%04x\t%d\t%d\t%d\t%08x\t%d\t%u\t%u\n",
8074 iface
, tswap32(dest
), tswap32(gw
), flags
, refcnt
, use
,
8075 metric
, tswap32(mask
), mtu
, window
, irtt
);
8085 #if defined(TARGET_SPARC)
8086 static int open_cpuinfo(void *cpu_env
, int fd
)
8088 dprintf(fd
, "type\t\t: sun4u\n");
8093 #if defined(TARGET_HPPA)
8094 static int open_cpuinfo(void *cpu_env
, int fd
)
8096 dprintf(fd
, "cpu family\t: PA-RISC 1.1e\n");
8097 dprintf(fd
, "cpu\t\t: PA7300LC (PCX-L2)\n");
8098 dprintf(fd
, "capabilities\t: os32\n");
8099 dprintf(fd
, "model\t\t: 9000/778/B160L\n");
8100 dprintf(fd
, "model name\t: Merlin L2 160 QEMU (9000/778/B160L)\n");
8105 #if defined(TARGET_M68K)
8106 static int open_hardware(void *cpu_env
, int fd
)
8108 dprintf(fd
, "Model:\t\tqemu-m68k\n");
8113 static int do_openat(void *cpu_env
, int dirfd
, const char *pathname
, int flags
, mode_t mode
)
8116 const char *filename
;
8117 int (*fill
)(void *cpu_env
, int fd
);
8118 int (*cmp
)(const char *s1
, const char *s2
);
8120 const struct fake_open
*fake_open
;
8121 static const struct fake_open fakes
[] = {
8122 { "maps", open_self_maps
, is_proc_myself
},
8123 { "stat", open_self_stat
, is_proc_myself
},
8124 { "auxv", open_self_auxv
, is_proc_myself
},
8125 { "cmdline", open_self_cmdline
, is_proc_myself
},
8126 #if defined(HOST_WORDS_BIGENDIAN) != defined(TARGET_WORDS_BIGENDIAN)
8127 { "/proc/net/route", open_net_route
, is_proc
},
8129 #if defined(TARGET_SPARC) || defined(TARGET_HPPA)
8130 { "/proc/cpuinfo", open_cpuinfo
, is_proc
},
8132 #if defined(TARGET_M68K)
8133 { "/proc/hardware", open_hardware
, is_proc
},
8135 { NULL
, NULL
, NULL
}
8138 if (is_proc_myself(pathname
, "exe")) {
8139 int execfd
= qemu_getauxval(AT_EXECFD
);
8140 return execfd
? execfd
: safe_openat(dirfd
, exec_path
, flags
, mode
);
8143 for (fake_open
= fakes
; fake_open
->filename
; fake_open
++) {
8144 if (fake_open
->cmp(pathname
, fake_open
->filename
)) {
8149 if (fake_open
->filename
) {
8151 char filename
[PATH_MAX
];
8154 /* create temporary file to map stat to */
8155 tmpdir
= getenv("TMPDIR");
8158 snprintf(filename
, sizeof(filename
), "%s/qemu-open.XXXXXX", tmpdir
);
8159 fd
= mkstemp(filename
);
8165 if ((r
= fake_open
->fill(cpu_env
, fd
))) {
8171 lseek(fd
, 0, SEEK_SET
);
8176 return safe_openat(dirfd
, path(pathname
), flags
, mode
);
8179 #define TIMER_MAGIC 0x0caf0000
8180 #define TIMER_MAGIC_MASK 0xffff0000
8182 /* Convert QEMU provided timer ID back to internal 16bit index format */
8183 static target_timer_t
get_timer_id(abi_long arg
)
8185 target_timer_t timerid
= arg
;
8187 if ((timerid
& TIMER_MAGIC_MASK
) != TIMER_MAGIC
) {
8188 return -TARGET_EINVAL
;
8193 if (timerid
>= ARRAY_SIZE(g_posix_timers
)) {
8194 return -TARGET_EINVAL
;
8200 static int target_to_host_cpu_mask(unsigned long *host_mask
,
8202 abi_ulong target_addr
,
8205 unsigned target_bits
= sizeof(abi_ulong
) * 8;
8206 unsigned host_bits
= sizeof(*host_mask
) * 8;
8207 abi_ulong
*target_mask
;
8210 assert(host_size
>= target_size
);
8212 target_mask
= lock_user(VERIFY_READ
, target_addr
, target_size
, 1);
8214 return -TARGET_EFAULT
;
8216 memset(host_mask
, 0, host_size
);
8218 for (i
= 0 ; i
< target_size
/ sizeof(abi_ulong
); i
++) {
8219 unsigned bit
= i
* target_bits
;
8222 __get_user(val
, &target_mask
[i
]);
8223 for (j
= 0; j
< target_bits
; j
++, bit
++) {
8224 if (val
& (1UL << j
)) {
8225 host_mask
[bit
/ host_bits
] |= 1UL << (bit
% host_bits
);
8230 unlock_user(target_mask
, target_addr
, 0);
8234 static int host_to_target_cpu_mask(const unsigned long *host_mask
,
8236 abi_ulong target_addr
,
8239 unsigned target_bits
= sizeof(abi_ulong
) * 8;
8240 unsigned host_bits
= sizeof(*host_mask
) * 8;
8241 abi_ulong
*target_mask
;
8244 assert(host_size
>= target_size
);
8246 target_mask
= lock_user(VERIFY_WRITE
, target_addr
, target_size
, 0);
8248 return -TARGET_EFAULT
;
8251 for (i
= 0 ; i
< target_size
/ sizeof(abi_ulong
); i
++) {
8252 unsigned bit
= i
* target_bits
;
8255 for (j
= 0; j
< target_bits
; j
++, bit
++) {
8256 if (host_mask
[bit
/ host_bits
] & (1UL << (bit
% host_bits
))) {
8260 __put_user(val
, &target_mask
[i
]);
8263 unlock_user(target_mask
, target_addr
, target_size
);
8267 #if defined(TARGET_NR_pivot_root) && defined(__NR_pivot_root)
8268 _syscall2(int, pivot_root
, const char *, new_root
, const char *, put_old
)
8271 /* This is an internal helper for do_syscall so that it is easier
8272 * to have a single return point, so that actions, such as logging
8273 * of syscall results, can be performed.
8274 * All errnos that do_syscall() returns must be -TARGET_<errcode>.
8276 static abi_long
do_syscall1(void *cpu_env
, int num
, abi_long arg1
,
8277 abi_long arg2
, abi_long arg3
, abi_long arg4
,
8278 abi_long arg5
, abi_long arg6
, abi_long arg7
,
8281 CPUState
*cpu
= env_cpu(cpu_env
);
8283 #if defined(TARGET_NR_stat) || defined(TARGET_NR_stat64) \
8284 || defined(TARGET_NR_lstat) || defined(TARGET_NR_lstat64) \
8285 || defined(TARGET_NR_fstat) || defined(TARGET_NR_fstat64) \
8286 || defined(TARGET_NR_statx)
8289 #if defined(TARGET_NR_statfs) || defined(TARGET_NR_statfs64) \
8290 || defined(TARGET_NR_fstatfs)
8296 case TARGET_NR_exit
:
8297 /* In old applications this may be used to implement _exit(2).
8298 However in threaded applications it is used for thread termination,
8299 and _exit_group is used for application termination.
8300 Do thread termination if we have more then one thread. */
8302 if (block_signals()) {
8303 return -TARGET_ERESTARTSYS
;
8306 pthread_mutex_lock(&clone_lock
);
8308 if (CPU_NEXT(first_cpu
)) {
8309 TaskState
*ts
= cpu
->opaque
;
8311 object_property_set_bool(OBJECT(cpu
), "realized", false, NULL
);
8312 object_unref(OBJECT(cpu
));
8314 * At this point the CPU should be unrealized and removed
8315 * from cpu lists. We can clean-up the rest of the thread
8316 * data without the lock held.
8319 pthread_mutex_unlock(&clone_lock
);
8321 if (ts
->child_tidptr
) {
8322 put_user_u32(0, ts
->child_tidptr
);
8323 do_sys_futex(g2h(cpu
, ts
->child_tidptr
),
8324 FUTEX_WAKE
, INT_MAX
, NULL
, NULL
, 0);
8328 rcu_unregister_thread();
8332 pthread_mutex_unlock(&clone_lock
);
8333 preexit_cleanup(cpu_env
, arg1
);
8335 return 0; /* avoid warning */
8336 case TARGET_NR_read
:
8337 if (arg2
== 0 && arg3
== 0) {
8338 return get_errno(safe_read(arg1
, 0, 0));
8340 if (!(p
= lock_user(VERIFY_WRITE
, arg2
, arg3
, 0)))
8341 return -TARGET_EFAULT
;
8342 ret
= get_errno(safe_read(arg1
, p
, arg3
));
8344 fd_trans_host_to_target_data(arg1
)) {
8345 ret
= fd_trans_host_to_target_data(arg1
)(p
, ret
);
8347 unlock_user(p
, arg2
, ret
);
8350 case TARGET_NR_write
:
8351 if (arg2
== 0 && arg3
== 0) {
8352 return get_errno(safe_write(arg1
, 0, 0));
8354 if (!(p
= lock_user(VERIFY_READ
, arg2
, arg3
, 1)))
8355 return -TARGET_EFAULT
;
8356 if (fd_trans_target_to_host_data(arg1
)) {
8357 void *copy
= g_malloc(arg3
);
8358 memcpy(copy
, p
, arg3
);
8359 ret
= fd_trans_target_to_host_data(arg1
)(copy
, arg3
);
8361 ret
= get_errno(safe_write(arg1
, copy
, ret
));
8365 ret
= get_errno(safe_write(arg1
, p
, arg3
));
8367 unlock_user(p
, arg2
, 0);
8370 #ifdef TARGET_NR_open
8371 case TARGET_NR_open
:
8372 if (!(p
= lock_user_string(arg1
)))
8373 return -TARGET_EFAULT
;
8374 ret
= get_errno(do_openat(cpu_env
, AT_FDCWD
, p
,
8375 target_to_host_bitmask(arg2
, fcntl_flags_tbl
),
8377 fd_trans_unregister(ret
);
8378 unlock_user(p
, arg1
, 0);
8381 case TARGET_NR_openat
:
8382 if (!(p
= lock_user_string(arg2
)))
8383 return -TARGET_EFAULT
;
8384 ret
= get_errno(do_openat(cpu_env
, arg1
, p
,
8385 target_to_host_bitmask(arg3
, fcntl_flags_tbl
),
8387 fd_trans_unregister(ret
);
8388 unlock_user(p
, arg2
, 0);
8390 #if defined(TARGET_NR_name_to_handle_at) && defined(CONFIG_OPEN_BY_HANDLE)
8391 case TARGET_NR_name_to_handle_at
:
8392 ret
= do_name_to_handle_at(arg1
, arg2
, arg3
, arg4
, arg5
);
8395 #if defined(TARGET_NR_open_by_handle_at) && defined(CONFIG_OPEN_BY_HANDLE)
8396 case TARGET_NR_open_by_handle_at
:
8397 ret
= do_open_by_handle_at(arg1
, arg2
, arg3
);
8398 fd_trans_unregister(ret
);
8401 case TARGET_NR_close
:
8402 fd_trans_unregister(arg1
);
8403 return get_errno(close(arg1
));
8406 return do_brk(arg1
);
8407 #ifdef TARGET_NR_fork
8408 case TARGET_NR_fork
:
8409 return get_errno(do_fork(cpu_env
, TARGET_SIGCHLD
, 0, 0, 0, 0));
8411 #ifdef TARGET_NR_waitpid
8412 case TARGET_NR_waitpid
:
8415 ret
= get_errno(safe_wait4(arg1
, &status
, arg3
, 0));
8416 if (!is_error(ret
) && arg2
&& ret
8417 && put_user_s32(host_to_target_waitstatus(status
), arg2
))
8418 return -TARGET_EFAULT
;
8422 #ifdef TARGET_NR_waitid
8423 case TARGET_NR_waitid
:
8427 ret
= get_errno(safe_waitid(arg1
, arg2
, &info
, arg4
, NULL
));
8428 if (!is_error(ret
) && arg3
&& info
.si_pid
!= 0) {
8429 if (!(p
= lock_user(VERIFY_WRITE
, arg3
, sizeof(target_siginfo_t
), 0)))
8430 return -TARGET_EFAULT
;
8431 host_to_target_siginfo(p
, &info
);
8432 unlock_user(p
, arg3
, sizeof(target_siginfo_t
));
8437 #ifdef TARGET_NR_creat /* not on alpha */
8438 case TARGET_NR_creat
:
8439 if (!(p
= lock_user_string(arg1
)))
8440 return -TARGET_EFAULT
;
8441 ret
= get_errno(creat(p
, arg2
));
8442 fd_trans_unregister(ret
);
8443 unlock_user(p
, arg1
, 0);
8446 #ifdef TARGET_NR_link
8447 case TARGET_NR_link
:
8450 p
= lock_user_string(arg1
);
8451 p2
= lock_user_string(arg2
);
8453 ret
= -TARGET_EFAULT
;
8455 ret
= get_errno(link(p
, p2
));
8456 unlock_user(p2
, arg2
, 0);
8457 unlock_user(p
, arg1
, 0);
8461 #if defined(TARGET_NR_linkat)
8462 case TARGET_NR_linkat
:
8466 return -TARGET_EFAULT
;
8467 p
= lock_user_string(arg2
);
8468 p2
= lock_user_string(arg4
);
8470 ret
= -TARGET_EFAULT
;
8472 ret
= get_errno(linkat(arg1
, p
, arg3
, p2
, arg5
));
8473 unlock_user(p
, arg2
, 0);
8474 unlock_user(p2
, arg4
, 0);
8478 #ifdef TARGET_NR_unlink
8479 case TARGET_NR_unlink
:
8480 if (!(p
= lock_user_string(arg1
)))
8481 return -TARGET_EFAULT
;
8482 ret
= get_errno(unlink(p
));
8483 unlock_user(p
, arg1
, 0);
8486 #if defined(TARGET_NR_unlinkat)
8487 case TARGET_NR_unlinkat
:
8488 if (!(p
= lock_user_string(arg2
)))
8489 return -TARGET_EFAULT
;
8490 ret
= get_errno(unlinkat(arg1
, p
, arg3
));
8491 unlock_user(p
, arg2
, 0);
8494 case TARGET_NR_execve
:
8496 char **argp
, **envp
;
8499 abi_ulong guest_argp
;
8500 abi_ulong guest_envp
;
8507 for (gp
= guest_argp
; gp
; gp
+= sizeof(abi_ulong
)) {
8508 if (get_user_ual(addr
, gp
))
8509 return -TARGET_EFAULT
;
8516 for (gp
= guest_envp
; gp
; gp
+= sizeof(abi_ulong
)) {
8517 if (get_user_ual(addr
, gp
))
8518 return -TARGET_EFAULT
;
8524 argp
= g_new0(char *, argc
+ 1);
8525 envp
= g_new0(char *, envc
+ 1);
8527 for (gp
= guest_argp
, q
= argp
; gp
;
8528 gp
+= sizeof(abi_ulong
), q
++) {
8529 if (get_user_ual(addr
, gp
))
8533 if (!(*q
= lock_user_string(addr
)))
8535 total_size
+= strlen(*q
) + 1;
8539 for (gp
= guest_envp
, q
= envp
; gp
;
8540 gp
+= sizeof(abi_ulong
), q
++) {
8541 if (get_user_ual(addr
, gp
))
8545 if (!(*q
= lock_user_string(addr
)))
8547 total_size
+= strlen(*q
) + 1;
8551 if (!(p
= lock_user_string(arg1
)))
8553 /* Although execve() is not an interruptible syscall it is
8554 * a special case where we must use the safe_syscall wrapper:
8555 * if we allow a signal to happen before we make the host
8556 * syscall then we will 'lose' it, because at the point of
8557 * execve the process leaves QEMU's control. So we use the
8558 * safe syscall wrapper to ensure that we either take the
8559 * signal as a guest signal, or else it does not happen
8560 * before the execve completes and makes it the other
8561 * program's problem.
8563 ret
= get_errno(safe_execve(p
, argp
, envp
));
8564 unlock_user(p
, arg1
, 0);
8569 ret
= -TARGET_EFAULT
;
8572 for (gp
= guest_argp
, q
= argp
; *q
;
8573 gp
+= sizeof(abi_ulong
), q
++) {
8574 if (get_user_ual(addr
, gp
)
8577 unlock_user(*q
, addr
, 0);
8579 for (gp
= guest_envp
, q
= envp
; *q
;
8580 gp
+= sizeof(abi_ulong
), q
++) {
8581 if (get_user_ual(addr
, gp
)
8584 unlock_user(*q
, addr
, 0);
8591 case TARGET_NR_chdir
:
8592 if (!(p
= lock_user_string(arg1
)))
8593 return -TARGET_EFAULT
;
8594 ret
= get_errno(chdir(p
));
8595 unlock_user(p
, arg1
, 0);
8597 #ifdef TARGET_NR_time
8598 case TARGET_NR_time
:
8601 ret
= get_errno(time(&host_time
));
8604 && put_user_sal(host_time
, arg1
))
8605 return -TARGET_EFAULT
;
8609 #ifdef TARGET_NR_mknod
8610 case TARGET_NR_mknod
:
8611 if (!(p
= lock_user_string(arg1
)))
8612 return -TARGET_EFAULT
;
8613 ret
= get_errno(mknod(p
, arg2
, arg3
));
8614 unlock_user(p
, arg1
, 0);
8617 #if defined(TARGET_NR_mknodat)
8618 case TARGET_NR_mknodat
:
8619 if (!(p
= lock_user_string(arg2
)))
8620 return -TARGET_EFAULT
;
8621 ret
= get_errno(mknodat(arg1
, p
, arg3
, arg4
));
8622 unlock_user(p
, arg2
, 0);
8625 #ifdef TARGET_NR_chmod
8626 case TARGET_NR_chmod
:
8627 if (!(p
= lock_user_string(arg1
)))
8628 return -TARGET_EFAULT
;
8629 ret
= get_errno(chmod(p
, arg2
));
8630 unlock_user(p
, arg1
, 0);
8633 #ifdef TARGET_NR_lseek
8634 case TARGET_NR_lseek
:
8635 return get_errno(lseek(arg1
, arg2
, arg3
));
8637 #if defined(TARGET_NR_getxpid) && defined(TARGET_ALPHA)
8638 /* Alpha specific */
8639 case TARGET_NR_getxpid
:
8640 ((CPUAlphaState
*)cpu_env
)->ir
[IR_A4
] = getppid();
8641 return get_errno(getpid());
8643 #ifdef TARGET_NR_getpid
8644 case TARGET_NR_getpid
:
8645 return get_errno(getpid());
8647 case TARGET_NR_mount
:
8649 /* need to look at the data field */
8653 p
= lock_user_string(arg1
);
8655 return -TARGET_EFAULT
;
8661 p2
= lock_user_string(arg2
);
8664 unlock_user(p
, arg1
, 0);
8666 return -TARGET_EFAULT
;
8670 p3
= lock_user_string(arg3
);
8673 unlock_user(p
, arg1
, 0);
8675 unlock_user(p2
, arg2
, 0);
8676 return -TARGET_EFAULT
;
8682 /* FIXME - arg5 should be locked, but it isn't clear how to
8683 * do that since it's not guaranteed to be a NULL-terminated
8687 ret
= mount(p
, p2
, p3
, (unsigned long)arg4
, NULL
);
8689 ret
= mount(p
, p2
, p3
, (unsigned long)arg4
, g2h(cpu
, arg5
));
8691 ret
= get_errno(ret
);
8694 unlock_user(p
, arg1
, 0);
8696 unlock_user(p2
, arg2
, 0);
8698 unlock_user(p3
, arg3
, 0);
8702 #if defined(TARGET_NR_umount) || defined(TARGET_NR_oldumount)
8703 #if defined(TARGET_NR_umount)
8704 case TARGET_NR_umount
:
8706 #if defined(TARGET_NR_oldumount)
8707 case TARGET_NR_oldumount
:
8709 if (!(p
= lock_user_string(arg1
)))
8710 return -TARGET_EFAULT
;
8711 ret
= get_errno(umount(p
));
8712 unlock_user(p
, arg1
, 0);
8715 #ifdef TARGET_NR_stime /* not on alpha */
8716 case TARGET_NR_stime
:
8720 if (get_user_sal(ts
.tv_sec
, arg1
)) {
8721 return -TARGET_EFAULT
;
8723 return get_errno(clock_settime(CLOCK_REALTIME
, &ts
));
8726 #ifdef TARGET_NR_alarm /* not on alpha */
8727 case TARGET_NR_alarm
:
8730 #ifdef TARGET_NR_pause /* not on alpha */
8731 case TARGET_NR_pause
:
8732 if (!block_signals()) {
8733 sigsuspend(&((TaskState
*)cpu
->opaque
)->signal_mask
);
8735 return -TARGET_EINTR
;
8737 #ifdef TARGET_NR_utime
8738 case TARGET_NR_utime
:
8740 struct utimbuf tbuf
, *host_tbuf
;
8741 struct target_utimbuf
*target_tbuf
;
8743 if (!lock_user_struct(VERIFY_READ
, target_tbuf
, arg2
, 1))
8744 return -TARGET_EFAULT
;
8745 tbuf
.actime
= tswapal(target_tbuf
->actime
);
8746 tbuf
.modtime
= tswapal(target_tbuf
->modtime
);
8747 unlock_user_struct(target_tbuf
, arg2
, 0);
8752 if (!(p
= lock_user_string(arg1
)))
8753 return -TARGET_EFAULT
;
8754 ret
= get_errno(utime(p
, host_tbuf
));
8755 unlock_user(p
, arg1
, 0);
8759 #ifdef TARGET_NR_utimes
8760 case TARGET_NR_utimes
:
8762 struct timeval
*tvp
, tv
[2];
8764 if (copy_from_user_timeval(&tv
[0], arg2
)
8765 || copy_from_user_timeval(&tv
[1],
8766 arg2
+ sizeof(struct target_timeval
)))
8767 return -TARGET_EFAULT
;
8772 if (!(p
= lock_user_string(arg1
)))
8773 return -TARGET_EFAULT
;
8774 ret
= get_errno(utimes(p
, tvp
));
8775 unlock_user(p
, arg1
, 0);
8779 #if defined(TARGET_NR_futimesat)
8780 case TARGET_NR_futimesat
:
8782 struct timeval
*tvp
, tv
[2];
8784 if (copy_from_user_timeval(&tv
[0], arg3
)
8785 || copy_from_user_timeval(&tv
[1],
8786 arg3
+ sizeof(struct target_timeval
)))
8787 return -TARGET_EFAULT
;
8792 if (!(p
= lock_user_string(arg2
))) {
8793 return -TARGET_EFAULT
;
8795 ret
= get_errno(futimesat(arg1
, path(p
), tvp
));
8796 unlock_user(p
, arg2
, 0);
8800 #ifdef TARGET_NR_access
8801 case TARGET_NR_access
:
8802 if (!(p
= lock_user_string(arg1
))) {
8803 return -TARGET_EFAULT
;
8805 ret
= get_errno(access(path(p
), arg2
));
8806 unlock_user(p
, arg1
, 0);
8809 #if defined(TARGET_NR_faccessat) && defined(__NR_faccessat)
8810 case TARGET_NR_faccessat
:
8811 if (!(p
= lock_user_string(arg2
))) {
8812 return -TARGET_EFAULT
;
8814 ret
= get_errno(faccessat(arg1
, p
, arg3
, 0));
8815 unlock_user(p
, arg2
, 0);
8818 #ifdef TARGET_NR_nice /* not on alpha */
8819 case TARGET_NR_nice
:
8820 return get_errno(nice(arg1
));
8822 case TARGET_NR_sync
:
8825 #if defined(TARGET_NR_syncfs) && defined(CONFIG_SYNCFS)
8826 case TARGET_NR_syncfs
:
8827 return get_errno(syncfs(arg1
));
8829 case TARGET_NR_kill
:
8830 return get_errno(safe_kill(arg1
, target_to_host_signal(arg2
)));
8831 #ifdef TARGET_NR_rename
8832 case TARGET_NR_rename
:
8835 p
= lock_user_string(arg1
);
8836 p2
= lock_user_string(arg2
);
8838 ret
= -TARGET_EFAULT
;
8840 ret
= get_errno(rename(p
, p2
));
8841 unlock_user(p2
, arg2
, 0);
8842 unlock_user(p
, arg1
, 0);
8846 #if defined(TARGET_NR_renameat)
8847 case TARGET_NR_renameat
:
8850 p
= lock_user_string(arg2
);
8851 p2
= lock_user_string(arg4
);
8853 ret
= -TARGET_EFAULT
;
8855 ret
= get_errno(renameat(arg1
, p
, arg3
, p2
));
8856 unlock_user(p2
, arg4
, 0);
8857 unlock_user(p
, arg2
, 0);
8861 #if defined(TARGET_NR_renameat2)
8862 case TARGET_NR_renameat2
:
8865 p
= lock_user_string(arg2
);
8866 p2
= lock_user_string(arg4
);
8868 ret
= -TARGET_EFAULT
;
8870 ret
= get_errno(sys_renameat2(arg1
, p
, arg3
, p2
, arg5
));
8872 unlock_user(p2
, arg4
, 0);
8873 unlock_user(p
, arg2
, 0);
8877 #ifdef TARGET_NR_mkdir
8878 case TARGET_NR_mkdir
:
8879 if (!(p
= lock_user_string(arg1
)))
8880 return -TARGET_EFAULT
;
8881 ret
= get_errno(mkdir(p
, arg2
));
8882 unlock_user(p
, arg1
, 0);
8885 #if defined(TARGET_NR_mkdirat)
8886 case TARGET_NR_mkdirat
:
8887 if (!(p
= lock_user_string(arg2
)))
8888 return -TARGET_EFAULT
;
8889 ret
= get_errno(mkdirat(arg1
, p
, arg3
));
8890 unlock_user(p
, arg2
, 0);
8893 #ifdef TARGET_NR_rmdir
8894 case TARGET_NR_rmdir
:
8895 if (!(p
= lock_user_string(arg1
)))
8896 return -TARGET_EFAULT
;
8897 ret
= get_errno(rmdir(p
));
8898 unlock_user(p
, arg1
, 0);
8902 ret
= get_errno(dup(arg1
));
8904 fd_trans_dup(arg1
, ret
);
8907 #ifdef TARGET_NR_pipe
8908 case TARGET_NR_pipe
:
8909 return do_pipe(cpu_env
, arg1
, 0, 0);
8911 #ifdef TARGET_NR_pipe2
8912 case TARGET_NR_pipe2
:
8913 return do_pipe(cpu_env
, arg1
,
8914 target_to_host_bitmask(arg2
, fcntl_flags_tbl
), 1);
8916 case TARGET_NR_times
:
8918 struct target_tms
*tmsp
;
8920 ret
= get_errno(times(&tms
));
8922 tmsp
= lock_user(VERIFY_WRITE
, arg1
, sizeof(struct target_tms
), 0);
8924 return -TARGET_EFAULT
;
8925 tmsp
->tms_utime
= tswapal(host_to_target_clock_t(tms
.tms_utime
));
8926 tmsp
->tms_stime
= tswapal(host_to_target_clock_t(tms
.tms_stime
));
8927 tmsp
->tms_cutime
= tswapal(host_to_target_clock_t(tms
.tms_cutime
));
8928 tmsp
->tms_cstime
= tswapal(host_to_target_clock_t(tms
.tms_cstime
));
8931 ret
= host_to_target_clock_t(ret
);
8934 case TARGET_NR_acct
:
8936 ret
= get_errno(acct(NULL
));
8938 if (!(p
= lock_user_string(arg1
))) {
8939 return -TARGET_EFAULT
;
8941 ret
= get_errno(acct(path(p
)));
8942 unlock_user(p
, arg1
, 0);
8945 #ifdef TARGET_NR_umount2
8946 case TARGET_NR_umount2
:
8947 if (!(p
= lock_user_string(arg1
)))
8948 return -TARGET_EFAULT
;
8949 ret
= get_errno(umount2(p
, arg2
));
8950 unlock_user(p
, arg1
, 0);
8953 case TARGET_NR_ioctl
:
8954 return do_ioctl(arg1
, arg2
, arg3
);
8955 #ifdef TARGET_NR_fcntl
8956 case TARGET_NR_fcntl
:
8957 return do_fcntl(arg1
, arg2
, arg3
);
8959 case TARGET_NR_setpgid
:
8960 return get_errno(setpgid(arg1
, arg2
));
8961 case TARGET_NR_umask
:
8962 return get_errno(umask(arg1
));
8963 case TARGET_NR_chroot
:
8964 if (!(p
= lock_user_string(arg1
)))
8965 return -TARGET_EFAULT
;
8966 ret
= get_errno(chroot(p
));
8967 unlock_user(p
, arg1
, 0);
8969 #ifdef TARGET_NR_dup2
8970 case TARGET_NR_dup2
:
8971 ret
= get_errno(dup2(arg1
, arg2
));
8973 fd_trans_dup(arg1
, arg2
);
8977 #if defined(CONFIG_DUP3) && defined(TARGET_NR_dup3)
8978 case TARGET_NR_dup3
:
8982 if ((arg3
& ~TARGET_O_CLOEXEC
) != 0) {
8985 host_flags
= target_to_host_bitmask(arg3
, fcntl_flags_tbl
);
8986 ret
= get_errno(dup3(arg1
, arg2
, host_flags
));
8988 fd_trans_dup(arg1
, arg2
);
8993 #ifdef TARGET_NR_getppid /* not on alpha */
8994 case TARGET_NR_getppid
:
8995 return get_errno(getppid());
8997 #ifdef TARGET_NR_getpgrp
8998 case TARGET_NR_getpgrp
:
8999 return get_errno(getpgrp());
9001 case TARGET_NR_setsid
:
9002 return get_errno(setsid());
9003 #ifdef TARGET_NR_sigaction
9004 case TARGET_NR_sigaction
:
9006 #if defined(TARGET_MIPS)
9007 struct target_sigaction act
, oact
, *pact
, *old_act
;
9010 if (!lock_user_struct(VERIFY_READ
, old_act
, arg2
, 1))
9011 return -TARGET_EFAULT
;
9012 act
._sa_handler
= old_act
->_sa_handler
;
9013 target_siginitset(&act
.sa_mask
, old_act
->sa_mask
.sig
[0]);
9014 act
.sa_flags
= old_act
->sa_flags
;
9015 unlock_user_struct(old_act
, arg2
, 0);
9021 ret
= get_errno(do_sigaction(arg1
, pact
, &oact
, 0));
9023 if (!is_error(ret
) && arg3
) {
9024 if (!lock_user_struct(VERIFY_WRITE
, old_act
, arg3
, 0))
9025 return -TARGET_EFAULT
;
9026 old_act
->_sa_handler
= oact
._sa_handler
;
9027 old_act
->sa_flags
= oact
.sa_flags
;
9028 old_act
->sa_mask
.sig
[0] = oact
.sa_mask
.sig
[0];
9029 old_act
->sa_mask
.sig
[1] = 0;
9030 old_act
->sa_mask
.sig
[2] = 0;
9031 old_act
->sa_mask
.sig
[3] = 0;
9032 unlock_user_struct(old_act
, arg3
, 1);
9035 struct target_old_sigaction
*old_act
;
9036 struct target_sigaction act
, oact
, *pact
;
9038 if (!lock_user_struct(VERIFY_READ
, old_act
, arg2
, 1))
9039 return -TARGET_EFAULT
;
9040 act
._sa_handler
= old_act
->_sa_handler
;
9041 target_siginitset(&act
.sa_mask
, old_act
->sa_mask
);
9042 act
.sa_flags
= old_act
->sa_flags
;
9043 #ifdef TARGET_ARCH_HAS_SA_RESTORER
9044 act
.sa_restorer
= old_act
->sa_restorer
;
9046 unlock_user_struct(old_act
, arg2
, 0);
9051 ret
= get_errno(do_sigaction(arg1
, pact
, &oact
, 0));
9052 if (!is_error(ret
) && arg3
) {
9053 if (!lock_user_struct(VERIFY_WRITE
, old_act
, arg3
, 0))
9054 return -TARGET_EFAULT
;
9055 old_act
->_sa_handler
= oact
._sa_handler
;
9056 old_act
->sa_mask
= oact
.sa_mask
.sig
[0];
9057 old_act
->sa_flags
= oact
.sa_flags
;
9058 #ifdef TARGET_ARCH_HAS_SA_RESTORER
9059 old_act
->sa_restorer
= oact
.sa_restorer
;
9061 unlock_user_struct(old_act
, arg3
, 1);
9067 case TARGET_NR_rt_sigaction
:
9070 * For Alpha and SPARC this is a 5 argument syscall, with
9071 * a 'restorer' parameter which must be copied into the
9072 * sa_restorer field of the sigaction struct.
9073 * For Alpha that 'restorer' is arg5; for SPARC it is arg4,
9074 * and arg5 is the sigsetsize.
9076 #if defined(TARGET_ALPHA)
9077 target_ulong sigsetsize
= arg4
;
9078 target_ulong restorer
= arg5
;
9079 #elif defined(TARGET_SPARC)
9080 target_ulong restorer
= arg4
;
9081 target_ulong sigsetsize
= arg5
;
9083 target_ulong sigsetsize
= arg4
;
9084 target_ulong restorer
= 0;
9086 struct target_sigaction
*act
= NULL
;
9087 struct target_sigaction
*oact
= NULL
;
9089 if (sigsetsize
!= sizeof(target_sigset_t
)) {
9090 return -TARGET_EINVAL
;
9092 if (arg2
&& !lock_user_struct(VERIFY_READ
, act
, arg2
, 1)) {
9093 return -TARGET_EFAULT
;
9095 if (arg3
&& !lock_user_struct(VERIFY_WRITE
, oact
, arg3
, 0)) {
9096 ret
= -TARGET_EFAULT
;
9098 ret
= get_errno(do_sigaction(arg1
, act
, oact
, restorer
));
9100 unlock_user_struct(oact
, arg3
, 1);
9104 unlock_user_struct(act
, arg2
, 0);
9108 #ifdef TARGET_NR_sgetmask /* not on alpha */
9109 case TARGET_NR_sgetmask
:
9112 abi_ulong target_set
;
9113 ret
= do_sigprocmask(0, NULL
, &cur_set
);
9115 host_to_target_old_sigset(&target_set
, &cur_set
);
9121 #ifdef TARGET_NR_ssetmask /* not on alpha */
9122 case TARGET_NR_ssetmask
:
9125 abi_ulong target_set
= arg1
;
9126 target_to_host_old_sigset(&set
, &target_set
);
9127 ret
= do_sigprocmask(SIG_SETMASK
, &set
, &oset
);
9129 host_to_target_old_sigset(&target_set
, &oset
);
9135 #ifdef TARGET_NR_sigprocmask
9136 case TARGET_NR_sigprocmask
:
9138 #if defined(TARGET_ALPHA)
9139 sigset_t set
, oldset
;
9144 case TARGET_SIG_BLOCK
:
9147 case TARGET_SIG_UNBLOCK
:
9150 case TARGET_SIG_SETMASK
:
9154 return -TARGET_EINVAL
;
9157 target_to_host_old_sigset(&set
, &mask
);
9159 ret
= do_sigprocmask(how
, &set
, &oldset
);
9160 if (!is_error(ret
)) {
9161 host_to_target_old_sigset(&mask
, &oldset
);
9163 ((CPUAlphaState
*)cpu_env
)->ir
[IR_V0
] = 0; /* force no error */
9166 sigset_t set
, oldset
, *set_ptr
;
9171 case TARGET_SIG_BLOCK
:
9174 case TARGET_SIG_UNBLOCK
:
9177 case TARGET_SIG_SETMASK
:
9181 return -TARGET_EINVAL
;
9183 if (!(p
= lock_user(VERIFY_READ
, arg2
, sizeof(target_sigset_t
), 1)))
9184 return -TARGET_EFAULT
;
9185 target_to_host_old_sigset(&set
, p
);
9186 unlock_user(p
, arg2
, 0);
9192 ret
= do_sigprocmask(how
, set_ptr
, &oldset
);
9193 if (!is_error(ret
) && arg3
) {
9194 if (!(p
= lock_user(VERIFY_WRITE
, arg3
, sizeof(target_sigset_t
), 0)))
9195 return -TARGET_EFAULT
;
9196 host_to_target_old_sigset(p
, &oldset
);
9197 unlock_user(p
, arg3
, sizeof(target_sigset_t
));
9203 case TARGET_NR_rt_sigprocmask
:
9206 sigset_t set
, oldset
, *set_ptr
;
9208 if (arg4
!= sizeof(target_sigset_t
)) {
9209 return -TARGET_EINVAL
;
9214 case TARGET_SIG_BLOCK
:
9217 case TARGET_SIG_UNBLOCK
:
9220 case TARGET_SIG_SETMASK
:
9224 return -TARGET_EINVAL
;
9226 if (!(p
= lock_user(VERIFY_READ
, arg2
, sizeof(target_sigset_t
), 1)))
9227 return -TARGET_EFAULT
;
9228 target_to_host_sigset(&set
, p
);
9229 unlock_user(p
, arg2
, 0);
9235 ret
= do_sigprocmask(how
, set_ptr
, &oldset
);
9236 if (!is_error(ret
) && arg3
) {
9237 if (!(p
= lock_user(VERIFY_WRITE
, arg3
, sizeof(target_sigset_t
), 0)))
9238 return -TARGET_EFAULT
;
9239 host_to_target_sigset(p
, &oldset
);
9240 unlock_user(p
, arg3
, sizeof(target_sigset_t
));
9244 #ifdef TARGET_NR_sigpending
9245 case TARGET_NR_sigpending
:
9248 ret
= get_errno(sigpending(&set
));
9249 if (!is_error(ret
)) {
9250 if (!(p
= lock_user(VERIFY_WRITE
, arg1
, sizeof(target_sigset_t
), 0)))
9251 return -TARGET_EFAULT
;
9252 host_to_target_old_sigset(p
, &set
);
9253 unlock_user(p
, arg1
, sizeof(target_sigset_t
));
9258 case TARGET_NR_rt_sigpending
:
9262 /* Yes, this check is >, not != like most. We follow the kernel's
9263 * logic and it does it like this because it implements
9264 * NR_sigpending through the same code path, and in that case
9265 * the old_sigset_t is smaller in size.
9267 if (arg2
> sizeof(target_sigset_t
)) {
9268 return -TARGET_EINVAL
;
9271 ret
= get_errno(sigpending(&set
));
9272 if (!is_error(ret
)) {
9273 if (!(p
= lock_user(VERIFY_WRITE
, arg1
, sizeof(target_sigset_t
), 0)))
9274 return -TARGET_EFAULT
;
9275 host_to_target_sigset(p
, &set
);
9276 unlock_user(p
, arg1
, sizeof(target_sigset_t
));
9280 #ifdef TARGET_NR_sigsuspend
9281 case TARGET_NR_sigsuspend
:
9283 TaskState
*ts
= cpu
->opaque
;
9284 #if defined(TARGET_ALPHA)
9285 abi_ulong mask
= arg1
;
9286 target_to_host_old_sigset(&ts
->sigsuspend_mask
, &mask
);
9288 if (!(p
= lock_user(VERIFY_READ
, arg1
, sizeof(target_sigset_t
), 1)))
9289 return -TARGET_EFAULT
;
9290 target_to_host_old_sigset(&ts
->sigsuspend_mask
, p
);
9291 unlock_user(p
, arg1
, 0);
9293 ret
= get_errno(safe_rt_sigsuspend(&ts
->sigsuspend_mask
,
9295 if (ret
!= -TARGET_ERESTARTSYS
) {
9296 ts
->in_sigsuspend
= 1;
9301 case TARGET_NR_rt_sigsuspend
:
9303 TaskState
*ts
= cpu
->opaque
;
9305 if (arg2
!= sizeof(target_sigset_t
)) {
9306 return -TARGET_EINVAL
;
9308 if (!(p
= lock_user(VERIFY_READ
, arg1
, sizeof(target_sigset_t
), 1)))
9309 return -TARGET_EFAULT
;
9310 target_to_host_sigset(&ts
->sigsuspend_mask
, p
);
9311 unlock_user(p
, arg1
, 0);
9312 ret
= get_errno(safe_rt_sigsuspend(&ts
->sigsuspend_mask
,
9314 if (ret
!= -TARGET_ERESTARTSYS
) {
9315 ts
->in_sigsuspend
= 1;
9319 #ifdef TARGET_NR_rt_sigtimedwait
9320 case TARGET_NR_rt_sigtimedwait
:
9323 struct timespec uts
, *puts
;
9326 if (arg4
!= sizeof(target_sigset_t
)) {
9327 return -TARGET_EINVAL
;
9330 if (!(p
= lock_user(VERIFY_READ
, arg1
, sizeof(target_sigset_t
), 1)))
9331 return -TARGET_EFAULT
;
9332 target_to_host_sigset(&set
, p
);
9333 unlock_user(p
, arg1
, 0);
9336 if (target_to_host_timespec(puts
, arg3
)) {
9337 return -TARGET_EFAULT
;
9342 ret
= get_errno(safe_rt_sigtimedwait(&set
, &uinfo
, puts
,
9344 if (!is_error(ret
)) {
9346 p
= lock_user(VERIFY_WRITE
, arg2
, sizeof(target_siginfo_t
),
9349 return -TARGET_EFAULT
;
9351 host_to_target_siginfo(p
, &uinfo
);
9352 unlock_user(p
, arg2
, sizeof(target_siginfo_t
));
9354 ret
= host_to_target_signal(ret
);
9359 #ifdef TARGET_NR_rt_sigtimedwait_time64
9360 case TARGET_NR_rt_sigtimedwait_time64
:
9363 struct timespec uts
, *puts
;
9366 if (arg4
!= sizeof(target_sigset_t
)) {
9367 return -TARGET_EINVAL
;
9370 p
= lock_user(VERIFY_READ
, arg1
, sizeof(target_sigset_t
), 1);
9372 return -TARGET_EFAULT
;
9374 target_to_host_sigset(&set
, p
);
9375 unlock_user(p
, arg1
, 0);
9378 if (target_to_host_timespec64(puts
, arg3
)) {
9379 return -TARGET_EFAULT
;
9384 ret
= get_errno(safe_rt_sigtimedwait(&set
, &uinfo
, puts
,
9386 if (!is_error(ret
)) {
9388 p
= lock_user(VERIFY_WRITE
, arg2
,
9389 sizeof(target_siginfo_t
), 0);
9391 return -TARGET_EFAULT
;
9393 host_to_target_siginfo(p
, &uinfo
);
9394 unlock_user(p
, arg2
, sizeof(target_siginfo_t
));
9396 ret
= host_to_target_signal(ret
);
9401 case TARGET_NR_rt_sigqueueinfo
:
9405 p
= lock_user(VERIFY_READ
, arg3
, sizeof(target_siginfo_t
), 1);
9407 return -TARGET_EFAULT
;
9409 target_to_host_siginfo(&uinfo
, p
);
9410 unlock_user(p
, arg3
, 0);
9411 ret
= get_errno(sys_rt_sigqueueinfo(arg1
, arg2
, &uinfo
));
9414 case TARGET_NR_rt_tgsigqueueinfo
:
9418 p
= lock_user(VERIFY_READ
, arg4
, sizeof(target_siginfo_t
), 1);
9420 return -TARGET_EFAULT
;
9422 target_to_host_siginfo(&uinfo
, p
);
9423 unlock_user(p
, arg4
, 0);
9424 ret
= get_errno(sys_rt_tgsigqueueinfo(arg1
, arg2
, arg3
, &uinfo
));
9427 #ifdef TARGET_NR_sigreturn
9428 case TARGET_NR_sigreturn
:
9429 if (block_signals()) {
9430 return -TARGET_ERESTARTSYS
;
9432 return do_sigreturn(cpu_env
);
9434 case TARGET_NR_rt_sigreturn
:
9435 if (block_signals()) {
9436 return -TARGET_ERESTARTSYS
;
9438 return do_rt_sigreturn(cpu_env
);
9439 case TARGET_NR_sethostname
:
9440 if (!(p
= lock_user_string(arg1
)))
9441 return -TARGET_EFAULT
;
9442 ret
= get_errno(sethostname(p
, arg2
));
9443 unlock_user(p
, arg1
, 0);
9445 #ifdef TARGET_NR_setrlimit
9446 case TARGET_NR_setrlimit
:
9448 int resource
= target_to_host_resource(arg1
);
9449 struct target_rlimit
*target_rlim
;
9451 if (!lock_user_struct(VERIFY_READ
, target_rlim
, arg2
, 1))
9452 return -TARGET_EFAULT
;
9453 rlim
.rlim_cur
= target_to_host_rlim(target_rlim
->rlim_cur
);
9454 rlim
.rlim_max
= target_to_host_rlim(target_rlim
->rlim_max
);
9455 unlock_user_struct(target_rlim
, arg2
, 0);
9457 * If we just passed through resource limit settings for memory then
9458 * they would also apply to QEMU's own allocations, and QEMU will
9459 * crash or hang or die if its allocations fail. Ideally we would
9460 * track the guest allocations in QEMU and apply the limits ourselves.
9461 * For now, just tell the guest the call succeeded but don't actually
9464 if (resource
!= RLIMIT_AS
&&
9465 resource
!= RLIMIT_DATA
&&
9466 resource
!= RLIMIT_STACK
) {
9467 return get_errno(setrlimit(resource
, &rlim
));
9473 #ifdef TARGET_NR_getrlimit
9474 case TARGET_NR_getrlimit
:
9476 int resource
= target_to_host_resource(arg1
);
9477 struct target_rlimit
*target_rlim
;
9480 ret
= get_errno(getrlimit(resource
, &rlim
));
9481 if (!is_error(ret
)) {
9482 if (!lock_user_struct(VERIFY_WRITE
, target_rlim
, arg2
, 0))
9483 return -TARGET_EFAULT
;
9484 target_rlim
->rlim_cur
= host_to_target_rlim(rlim
.rlim_cur
);
9485 target_rlim
->rlim_max
= host_to_target_rlim(rlim
.rlim_max
);
9486 unlock_user_struct(target_rlim
, arg2
, 1);
9491 case TARGET_NR_getrusage
:
9493 struct rusage rusage
;
9494 ret
= get_errno(getrusage(arg1
, &rusage
));
9495 if (!is_error(ret
)) {
9496 ret
= host_to_target_rusage(arg2
, &rusage
);
9500 #if defined(TARGET_NR_gettimeofday)
9501 case TARGET_NR_gettimeofday
:
9506 ret
= get_errno(gettimeofday(&tv
, &tz
));
9507 if (!is_error(ret
)) {
9508 if (arg1
&& copy_to_user_timeval(arg1
, &tv
)) {
9509 return -TARGET_EFAULT
;
9511 if (arg2
&& copy_to_user_timezone(arg2
, &tz
)) {
9512 return -TARGET_EFAULT
;
9518 #if defined(TARGET_NR_settimeofday)
9519 case TARGET_NR_settimeofday
:
9521 struct timeval tv
, *ptv
= NULL
;
9522 struct timezone tz
, *ptz
= NULL
;
9525 if (copy_from_user_timeval(&tv
, arg1
)) {
9526 return -TARGET_EFAULT
;
9532 if (copy_from_user_timezone(&tz
, arg2
)) {
9533 return -TARGET_EFAULT
;
9538 return get_errno(settimeofday(ptv
, ptz
));
9541 #if defined(TARGET_NR_select)
9542 case TARGET_NR_select
:
9543 #if defined(TARGET_WANT_NI_OLD_SELECT)
9544 /* some architectures used to have old_select here
9545 * but now ENOSYS it.
9547 ret
= -TARGET_ENOSYS
;
9548 #elif defined(TARGET_WANT_OLD_SYS_SELECT)
9549 ret
= do_old_select(arg1
);
9551 ret
= do_select(arg1
, arg2
, arg3
, arg4
, arg5
);
9555 #ifdef TARGET_NR_pselect6
9556 case TARGET_NR_pselect6
:
9557 return do_pselect6(arg1
, arg2
, arg3
, arg4
, arg5
, arg6
, false);
9559 #ifdef TARGET_NR_pselect6_time64
9560 case TARGET_NR_pselect6_time64
:
9561 return do_pselect6(arg1
, arg2
, arg3
, arg4
, arg5
, arg6
, true);
9563 #ifdef TARGET_NR_symlink
9564 case TARGET_NR_symlink
:
9567 p
= lock_user_string(arg1
);
9568 p2
= lock_user_string(arg2
);
9570 ret
= -TARGET_EFAULT
;
9572 ret
= get_errno(symlink(p
, p2
));
9573 unlock_user(p2
, arg2
, 0);
9574 unlock_user(p
, arg1
, 0);
9578 #if defined(TARGET_NR_symlinkat)
9579 case TARGET_NR_symlinkat
:
9582 p
= lock_user_string(arg1
);
9583 p2
= lock_user_string(arg3
);
9585 ret
= -TARGET_EFAULT
;
9587 ret
= get_errno(symlinkat(p
, arg2
, p2
));
9588 unlock_user(p2
, arg3
, 0);
9589 unlock_user(p
, arg1
, 0);
9593 #ifdef TARGET_NR_readlink
9594 case TARGET_NR_readlink
:
9597 p
= lock_user_string(arg1
);
9598 p2
= lock_user(VERIFY_WRITE
, arg2
, arg3
, 0);
9600 ret
= -TARGET_EFAULT
;
9602 /* Short circuit this for the magic exe check. */
9603 ret
= -TARGET_EINVAL
;
9604 } else if (is_proc_myself((const char *)p
, "exe")) {
9605 char real
[PATH_MAX
], *temp
;
9606 temp
= realpath(exec_path
, real
);
9607 /* Return value is # of bytes that we wrote to the buffer. */
9609 ret
= get_errno(-1);
9611 /* Don't worry about sign mismatch as earlier mapping
9612 * logic would have thrown a bad address error. */
9613 ret
= MIN(strlen(real
), arg3
);
9614 /* We cannot NUL terminate the string. */
9615 memcpy(p2
, real
, ret
);
9618 ret
= get_errno(readlink(path(p
), p2
, arg3
));
9620 unlock_user(p2
, arg2
, ret
);
9621 unlock_user(p
, arg1
, 0);
9625 #if defined(TARGET_NR_readlinkat)
9626 case TARGET_NR_readlinkat
:
9629 p
= lock_user_string(arg2
);
9630 p2
= lock_user(VERIFY_WRITE
, arg3
, arg4
, 0);
9632 ret
= -TARGET_EFAULT
;
9633 } else if (is_proc_myself((const char *)p
, "exe")) {
9634 char real
[PATH_MAX
], *temp
;
9635 temp
= realpath(exec_path
, real
);
9636 ret
= temp
== NULL
? get_errno(-1) : strlen(real
) ;
9637 snprintf((char *)p2
, arg4
, "%s", real
);
9639 ret
= get_errno(readlinkat(arg1
, path(p
), p2
, arg4
));
9641 unlock_user(p2
, arg3
, ret
);
9642 unlock_user(p
, arg2
, 0);
9646 #ifdef TARGET_NR_swapon
9647 case TARGET_NR_swapon
:
9648 if (!(p
= lock_user_string(arg1
)))
9649 return -TARGET_EFAULT
;
9650 ret
= get_errno(swapon(p
, arg2
));
9651 unlock_user(p
, arg1
, 0);
9654 case TARGET_NR_reboot
:
9655 if (arg3
== LINUX_REBOOT_CMD_RESTART2
) {
9656 /* arg4 must be ignored in all other cases */
9657 p
= lock_user_string(arg4
);
9659 return -TARGET_EFAULT
;
9661 ret
= get_errno(reboot(arg1
, arg2
, arg3
, p
));
9662 unlock_user(p
, arg4
, 0);
9664 ret
= get_errno(reboot(arg1
, arg2
, arg3
, NULL
));
9667 #ifdef TARGET_NR_mmap
9668 case TARGET_NR_mmap
:
9669 #if (defined(TARGET_I386) && defined(TARGET_ABI32)) || \
9670 (defined(TARGET_ARM) && defined(TARGET_ABI32)) || \
9671 defined(TARGET_M68K) || defined(TARGET_CRIS) || defined(TARGET_MICROBLAZE) \
9672 || defined(TARGET_S390X)
9675 abi_ulong v1
, v2
, v3
, v4
, v5
, v6
;
9676 if (!(v
= lock_user(VERIFY_READ
, arg1
, 6 * sizeof(abi_ulong
), 1)))
9677 return -TARGET_EFAULT
;
9684 unlock_user(v
, arg1
, 0);
9685 ret
= get_errno(target_mmap(v1
, v2
, v3
,
9686 target_to_host_bitmask(v4
, mmap_flags_tbl
),
9690 /* mmap pointers are always untagged */
9691 ret
= get_errno(target_mmap(arg1
, arg2
, arg3
,
9692 target_to_host_bitmask(arg4
, mmap_flags_tbl
),
9698 #ifdef TARGET_NR_mmap2
9699 case TARGET_NR_mmap2
:
9701 #define MMAP_SHIFT 12
9703 ret
= target_mmap(arg1
, arg2
, arg3
,
9704 target_to_host_bitmask(arg4
, mmap_flags_tbl
),
9705 arg5
, arg6
<< MMAP_SHIFT
);
9706 return get_errno(ret
);
9708 case TARGET_NR_munmap
:
9709 arg1
= cpu_untagged_addr(cpu
, arg1
);
9710 return get_errno(target_munmap(arg1
, arg2
));
9711 case TARGET_NR_mprotect
:
9712 arg1
= cpu_untagged_addr(cpu
, arg1
);
9714 TaskState
*ts
= cpu
->opaque
;
9715 /* Special hack to detect libc making the stack executable. */
9716 if ((arg3
& PROT_GROWSDOWN
)
9717 && arg1
>= ts
->info
->stack_limit
9718 && arg1
<= ts
->info
->start_stack
) {
9719 arg3
&= ~PROT_GROWSDOWN
;
9720 arg2
= arg2
+ arg1
- ts
->info
->stack_limit
;
9721 arg1
= ts
->info
->stack_limit
;
9724 return get_errno(target_mprotect(arg1
, arg2
, arg3
));
9725 #ifdef TARGET_NR_mremap
9726 case TARGET_NR_mremap
:
9727 arg1
= cpu_untagged_addr(cpu
, arg1
);
9728 /* mremap new_addr (arg5) is always untagged */
9729 return get_errno(target_mremap(arg1
, arg2
, arg3
, arg4
, arg5
));
9731 /* ??? msync/mlock/munlock are broken for softmmu. */
9732 #ifdef TARGET_NR_msync
9733 case TARGET_NR_msync
:
9734 return get_errno(msync(g2h(cpu
, arg1
), arg2
, arg3
));
9736 #ifdef TARGET_NR_mlock
9737 case TARGET_NR_mlock
:
9738 return get_errno(mlock(g2h(cpu
, arg1
), arg2
));
9740 #ifdef TARGET_NR_munlock
9741 case TARGET_NR_munlock
:
9742 return get_errno(munlock(g2h(cpu
, arg1
), arg2
));
9744 #ifdef TARGET_NR_mlockall
9745 case TARGET_NR_mlockall
:
9746 return get_errno(mlockall(target_to_host_mlockall_arg(arg1
)));
9748 #ifdef TARGET_NR_munlockall
9749 case TARGET_NR_munlockall
:
9750 return get_errno(munlockall());
9752 #ifdef TARGET_NR_truncate
9753 case TARGET_NR_truncate
:
9754 if (!(p
= lock_user_string(arg1
)))
9755 return -TARGET_EFAULT
;
9756 ret
= get_errno(truncate(p
, arg2
));
9757 unlock_user(p
, arg1
, 0);
9760 #ifdef TARGET_NR_ftruncate
9761 case TARGET_NR_ftruncate
:
9762 return get_errno(ftruncate(arg1
, arg2
));
9764 case TARGET_NR_fchmod
:
9765 return get_errno(fchmod(arg1
, arg2
));
9766 #if defined(TARGET_NR_fchmodat)
9767 case TARGET_NR_fchmodat
:
9768 if (!(p
= lock_user_string(arg2
)))
9769 return -TARGET_EFAULT
;
9770 ret
= get_errno(fchmodat(arg1
, p
, arg3
, 0));
9771 unlock_user(p
, arg2
, 0);
9774 case TARGET_NR_getpriority
:
9775 /* Note that negative values are valid for getpriority, so we must
9776 differentiate based on errno settings. */
9778 ret
= getpriority(arg1
, arg2
);
9779 if (ret
== -1 && errno
!= 0) {
9780 return -host_to_target_errno(errno
);
9783 /* Return value is the unbiased priority. Signal no error. */
9784 ((CPUAlphaState
*)cpu_env
)->ir
[IR_V0
] = 0;
9786 /* Return value is a biased priority to avoid negative numbers. */
9790 case TARGET_NR_setpriority
:
9791 return get_errno(setpriority(arg1
, arg2
, arg3
));
9792 #ifdef TARGET_NR_statfs
9793 case TARGET_NR_statfs
:
9794 if (!(p
= lock_user_string(arg1
))) {
9795 return -TARGET_EFAULT
;
9797 ret
= get_errno(statfs(path(p
), &stfs
));
9798 unlock_user(p
, arg1
, 0);
9800 if (!is_error(ret
)) {
9801 struct target_statfs
*target_stfs
;
9803 if (!lock_user_struct(VERIFY_WRITE
, target_stfs
, arg2
, 0))
9804 return -TARGET_EFAULT
;
9805 __put_user(stfs
.f_type
, &target_stfs
->f_type
);
9806 __put_user(stfs
.f_bsize
, &target_stfs
->f_bsize
);
9807 __put_user(stfs
.f_blocks
, &target_stfs
->f_blocks
);
9808 __put_user(stfs
.f_bfree
, &target_stfs
->f_bfree
);
9809 __put_user(stfs
.f_bavail
, &target_stfs
->f_bavail
);
9810 __put_user(stfs
.f_files
, &target_stfs
->f_files
);
9811 __put_user(stfs
.f_ffree
, &target_stfs
->f_ffree
);
9812 __put_user(stfs
.f_fsid
.__val
[0], &target_stfs
->f_fsid
.val
[0]);
9813 __put_user(stfs
.f_fsid
.__val
[1], &target_stfs
->f_fsid
.val
[1]);
9814 __put_user(stfs
.f_namelen
, &target_stfs
->f_namelen
);
9815 __put_user(stfs
.f_frsize
, &target_stfs
->f_frsize
);
9816 #ifdef _STATFS_F_FLAGS
9817 __put_user(stfs
.f_flags
, &target_stfs
->f_flags
);
9819 __put_user(0, &target_stfs
->f_flags
);
9821 memset(target_stfs
->f_spare
, 0, sizeof(target_stfs
->f_spare
));
9822 unlock_user_struct(target_stfs
, arg2
, 1);
9826 #ifdef TARGET_NR_fstatfs
9827 case TARGET_NR_fstatfs
:
9828 ret
= get_errno(fstatfs(arg1
, &stfs
));
9829 goto convert_statfs
;
9831 #ifdef TARGET_NR_statfs64
9832 case TARGET_NR_statfs64
:
9833 if (!(p
= lock_user_string(arg1
))) {
9834 return -TARGET_EFAULT
;
9836 ret
= get_errno(statfs(path(p
), &stfs
));
9837 unlock_user(p
, arg1
, 0);
9839 if (!is_error(ret
)) {
9840 struct target_statfs64
*target_stfs
;
9842 if (!lock_user_struct(VERIFY_WRITE
, target_stfs
, arg3
, 0))
9843 return -TARGET_EFAULT
;
9844 __put_user(stfs
.f_type
, &target_stfs
->f_type
);
9845 __put_user(stfs
.f_bsize
, &target_stfs
->f_bsize
);
9846 __put_user(stfs
.f_blocks
, &target_stfs
->f_blocks
);
9847 __put_user(stfs
.f_bfree
, &target_stfs
->f_bfree
);
9848 __put_user(stfs
.f_bavail
, &target_stfs
->f_bavail
);
9849 __put_user(stfs
.f_files
, &target_stfs
->f_files
);
9850 __put_user(stfs
.f_ffree
, &target_stfs
->f_ffree
);
9851 __put_user(stfs
.f_fsid
.__val
[0], &target_stfs
->f_fsid
.val
[0]);
9852 __put_user(stfs
.f_fsid
.__val
[1], &target_stfs
->f_fsid
.val
[1]);
9853 __put_user(stfs
.f_namelen
, &target_stfs
->f_namelen
);
9854 __put_user(stfs
.f_frsize
, &target_stfs
->f_frsize
);
9855 #ifdef _STATFS_F_FLAGS
9856 __put_user(stfs
.f_flags
, &target_stfs
->f_flags
);
9858 __put_user(0, &target_stfs
->f_flags
);
9860 memset(target_stfs
->f_spare
, 0, sizeof(target_stfs
->f_spare
));
9861 unlock_user_struct(target_stfs
, arg3
, 1);
9864 case TARGET_NR_fstatfs64
:
9865 ret
= get_errno(fstatfs(arg1
, &stfs
));
9866 goto convert_statfs64
;
9868 #ifdef TARGET_NR_socketcall
9869 case TARGET_NR_socketcall
:
9870 return do_socketcall(arg1
, arg2
);
9872 #ifdef TARGET_NR_accept
9873 case TARGET_NR_accept
:
9874 return do_accept4(arg1
, arg2
, arg3
, 0);
9876 #ifdef TARGET_NR_accept4
9877 case TARGET_NR_accept4
:
9878 return do_accept4(arg1
, arg2
, arg3
, arg4
);
9880 #ifdef TARGET_NR_bind
9881 case TARGET_NR_bind
:
9882 return do_bind(arg1
, arg2
, arg3
);
9884 #ifdef TARGET_NR_connect
9885 case TARGET_NR_connect
:
9886 return do_connect(arg1
, arg2
, arg3
);
9888 #ifdef TARGET_NR_getpeername
9889 case TARGET_NR_getpeername
:
9890 return do_getpeername(arg1
, arg2
, arg3
);
9892 #ifdef TARGET_NR_getsockname
9893 case TARGET_NR_getsockname
:
9894 return do_getsockname(arg1
, arg2
, arg3
);
9896 #ifdef TARGET_NR_getsockopt
9897 case TARGET_NR_getsockopt
:
9898 return do_getsockopt(arg1
, arg2
, arg3
, arg4
, arg5
);
9900 #ifdef TARGET_NR_listen
9901 case TARGET_NR_listen
:
9902 return get_errno(listen(arg1
, arg2
));
9904 #ifdef TARGET_NR_recv
9905 case TARGET_NR_recv
:
9906 return do_recvfrom(arg1
, arg2
, arg3
, arg4
, 0, 0);
9908 #ifdef TARGET_NR_recvfrom
9909 case TARGET_NR_recvfrom
:
9910 return do_recvfrom(arg1
, arg2
, arg3
, arg4
, arg5
, arg6
);
9912 #ifdef TARGET_NR_recvmsg
9913 case TARGET_NR_recvmsg
:
9914 return do_sendrecvmsg(arg1
, arg2
, arg3
, 0);
9916 #ifdef TARGET_NR_send
9917 case TARGET_NR_send
:
9918 return do_sendto(arg1
, arg2
, arg3
, arg4
, 0, 0);
9920 #ifdef TARGET_NR_sendmsg
9921 case TARGET_NR_sendmsg
:
9922 return do_sendrecvmsg(arg1
, arg2
, arg3
, 1);
9924 #ifdef TARGET_NR_sendmmsg
9925 case TARGET_NR_sendmmsg
:
9926 return do_sendrecvmmsg(arg1
, arg2
, arg3
, arg4
, 1);
9928 #ifdef TARGET_NR_recvmmsg
9929 case TARGET_NR_recvmmsg
:
9930 return do_sendrecvmmsg(arg1
, arg2
, arg3
, arg4
, 0);
9932 #ifdef TARGET_NR_sendto
9933 case TARGET_NR_sendto
:
9934 return do_sendto(arg1
, arg2
, arg3
, arg4
, arg5
, arg6
);
9936 #ifdef TARGET_NR_shutdown
9937 case TARGET_NR_shutdown
:
9938 return get_errno(shutdown(arg1
, arg2
));
9940 #if defined(TARGET_NR_getrandom) && defined(__NR_getrandom)
9941 case TARGET_NR_getrandom
:
9942 p
= lock_user(VERIFY_WRITE
, arg1
, arg2
, 0);
9944 return -TARGET_EFAULT
;
9946 ret
= get_errno(getrandom(p
, arg2
, arg3
));
9947 unlock_user(p
, arg1
, ret
);
9950 #ifdef TARGET_NR_socket
9951 case TARGET_NR_socket
:
9952 return do_socket(arg1
, arg2
, arg3
);
9954 #ifdef TARGET_NR_socketpair
9955 case TARGET_NR_socketpair
:
9956 return do_socketpair(arg1
, arg2
, arg3
, arg4
);
9958 #ifdef TARGET_NR_setsockopt
9959 case TARGET_NR_setsockopt
:
9960 return do_setsockopt(arg1
, arg2
, arg3
, arg4
, (socklen_t
) arg5
);
9962 #if defined(TARGET_NR_syslog)
9963 case TARGET_NR_syslog
:
9968 case TARGET_SYSLOG_ACTION_CLOSE
: /* Close log */
9969 case TARGET_SYSLOG_ACTION_OPEN
: /* Open log */
9970 case TARGET_SYSLOG_ACTION_CLEAR
: /* Clear ring buffer */
9971 case TARGET_SYSLOG_ACTION_CONSOLE_OFF
: /* Disable logging */
9972 case TARGET_SYSLOG_ACTION_CONSOLE_ON
: /* Enable logging */
9973 case TARGET_SYSLOG_ACTION_CONSOLE_LEVEL
: /* Set messages level */
9974 case TARGET_SYSLOG_ACTION_SIZE_UNREAD
: /* Number of chars */
9975 case TARGET_SYSLOG_ACTION_SIZE_BUFFER
: /* Size of the buffer */
9976 return get_errno(sys_syslog((int)arg1
, NULL
, (int)arg3
));
9977 case TARGET_SYSLOG_ACTION_READ
: /* Read from log */
9978 case TARGET_SYSLOG_ACTION_READ_CLEAR
: /* Read/clear msgs */
9979 case TARGET_SYSLOG_ACTION_READ_ALL
: /* Read last messages */
9982 return -TARGET_EINVAL
;
9987 p
= lock_user(VERIFY_WRITE
, arg2
, arg3
, 0);
9989 return -TARGET_EFAULT
;
9991 ret
= get_errno(sys_syslog((int)arg1
, p
, (int)arg3
));
9992 unlock_user(p
, arg2
, arg3
);
9996 return -TARGET_EINVAL
;
10001 case TARGET_NR_setitimer
:
10003 struct itimerval value
, ovalue
, *pvalue
;
10007 if (copy_from_user_timeval(&pvalue
->it_interval
, arg2
)
10008 || copy_from_user_timeval(&pvalue
->it_value
,
10009 arg2
+ sizeof(struct target_timeval
)))
10010 return -TARGET_EFAULT
;
10014 ret
= get_errno(setitimer(arg1
, pvalue
, &ovalue
));
10015 if (!is_error(ret
) && arg3
) {
10016 if (copy_to_user_timeval(arg3
,
10017 &ovalue
.it_interval
)
10018 || copy_to_user_timeval(arg3
+ sizeof(struct target_timeval
),
10020 return -TARGET_EFAULT
;
10024 case TARGET_NR_getitimer
:
10026 struct itimerval value
;
10028 ret
= get_errno(getitimer(arg1
, &value
));
10029 if (!is_error(ret
) && arg2
) {
10030 if (copy_to_user_timeval(arg2
,
10031 &value
.it_interval
)
10032 || copy_to_user_timeval(arg2
+ sizeof(struct target_timeval
),
10034 return -TARGET_EFAULT
;
10038 #ifdef TARGET_NR_stat
10039 case TARGET_NR_stat
:
10040 if (!(p
= lock_user_string(arg1
))) {
10041 return -TARGET_EFAULT
;
10043 ret
= get_errno(stat(path(p
), &st
));
10044 unlock_user(p
, arg1
, 0);
10047 #ifdef TARGET_NR_lstat
10048 case TARGET_NR_lstat
:
10049 if (!(p
= lock_user_string(arg1
))) {
10050 return -TARGET_EFAULT
;
10052 ret
= get_errno(lstat(path(p
), &st
));
10053 unlock_user(p
, arg1
, 0);
10056 #ifdef TARGET_NR_fstat
10057 case TARGET_NR_fstat
:
10059 ret
= get_errno(fstat(arg1
, &st
));
10060 #if defined(TARGET_NR_stat) || defined(TARGET_NR_lstat)
10063 if (!is_error(ret
)) {
10064 struct target_stat
*target_st
;
10066 if (!lock_user_struct(VERIFY_WRITE
, target_st
, arg2
, 0))
10067 return -TARGET_EFAULT
;
10068 memset(target_st
, 0, sizeof(*target_st
));
10069 __put_user(st
.st_dev
, &target_st
->st_dev
);
10070 __put_user(st
.st_ino
, &target_st
->st_ino
);
10071 __put_user(st
.st_mode
, &target_st
->st_mode
);
10072 __put_user(st
.st_uid
, &target_st
->st_uid
);
10073 __put_user(st
.st_gid
, &target_st
->st_gid
);
10074 __put_user(st
.st_nlink
, &target_st
->st_nlink
);
10075 __put_user(st
.st_rdev
, &target_st
->st_rdev
);
10076 __put_user(st
.st_size
, &target_st
->st_size
);
10077 __put_user(st
.st_blksize
, &target_st
->st_blksize
);
10078 __put_user(st
.st_blocks
, &target_st
->st_blocks
);
10079 __put_user(st
.st_atime
, &target_st
->target_st_atime
);
10080 __put_user(st
.st_mtime
, &target_st
->target_st_mtime
);
10081 __put_user(st
.st_ctime
, &target_st
->target_st_ctime
);
10082 #if defined(HAVE_STRUCT_STAT_ST_ATIM) && defined(TARGET_STAT_HAVE_NSEC)
10083 __put_user(st
.st_atim
.tv_nsec
,
10084 &target_st
->target_st_atime_nsec
);
10085 __put_user(st
.st_mtim
.tv_nsec
,
10086 &target_st
->target_st_mtime_nsec
);
10087 __put_user(st
.st_ctim
.tv_nsec
,
10088 &target_st
->target_st_ctime_nsec
);
10090 unlock_user_struct(target_st
, arg2
, 1);
10095 case TARGET_NR_vhangup
:
10096 return get_errno(vhangup());
10097 #ifdef TARGET_NR_syscall
10098 case TARGET_NR_syscall
:
10099 return do_syscall(cpu_env
, arg1
& 0xffff, arg2
, arg3
, arg4
, arg5
,
10100 arg6
, arg7
, arg8
, 0);
10102 #if defined(TARGET_NR_wait4)
10103 case TARGET_NR_wait4
:
10106 abi_long status_ptr
= arg2
;
10107 struct rusage rusage
, *rusage_ptr
;
10108 abi_ulong target_rusage
= arg4
;
10109 abi_long rusage_err
;
10111 rusage_ptr
= &rusage
;
10114 ret
= get_errno(safe_wait4(arg1
, &status
, arg3
, rusage_ptr
));
10115 if (!is_error(ret
)) {
10116 if (status_ptr
&& ret
) {
10117 status
= host_to_target_waitstatus(status
);
10118 if (put_user_s32(status
, status_ptr
))
10119 return -TARGET_EFAULT
;
10121 if (target_rusage
) {
10122 rusage_err
= host_to_target_rusage(target_rusage
, &rusage
);
10131 #ifdef TARGET_NR_swapoff
10132 case TARGET_NR_swapoff
:
10133 if (!(p
= lock_user_string(arg1
)))
10134 return -TARGET_EFAULT
;
10135 ret
= get_errno(swapoff(p
));
10136 unlock_user(p
, arg1
, 0);
10139 case TARGET_NR_sysinfo
:
10141 struct target_sysinfo
*target_value
;
10142 struct sysinfo value
;
10143 ret
= get_errno(sysinfo(&value
));
10144 if (!is_error(ret
) && arg1
)
10146 if (!lock_user_struct(VERIFY_WRITE
, target_value
, arg1
, 0))
10147 return -TARGET_EFAULT
;
10148 __put_user(value
.uptime
, &target_value
->uptime
);
10149 __put_user(value
.loads
[0], &target_value
->loads
[0]);
10150 __put_user(value
.loads
[1], &target_value
->loads
[1]);
10151 __put_user(value
.loads
[2], &target_value
->loads
[2]);
10152 __put_user(value
.totalram
, &target_value
->totalram
);
10153 __put_user(value
.freeram
, &target_value
->freeram
);
10154 __put_user(value
.sharedram
, &target_value
->sharedram
);
10155 __put_user(value
.bufferram
, &target_value
->bufferram
);
10156 __put_user(value
.totalswap
, &target_value
->totalswap
);
10157 __put_user(value
.freeswap
, &target_value
->freeswap
);
10158 __put_user(value
.procs
, &target_value
->procs
);
10159 __put_user(value
.totalhigh
, &target_value
->totalhigh
);
10160 __put_user(value
.freehigh
, &target_value
->freehigh
);
10161 __put_user(value
.mem_unit
, &target_value
->mem_unit
);
10162 unlock_user_struct(target_value
, arg1
, 1);
10166 #ifdef TARGET_NR_ipc
10167 case TARGET_NR_ipc
:
10168 return do_ipc(cpu_env
, arg1
, arg2
, arg3
, arg4
, arg5
, arg6
);
10170 #ifdef TARGET_NR_semget
10171 case TARGET_NR_semget
:
10172 return get_errno(semget(arg1
, arg2
, arg3
));
10174 #ifdef TARGET_NR_semop
10175 case TARGET_NR_semop
:
10176 return do_semtimedop(arg1
, arg2
, arg3
, 0, false);
10178 #ifdef TARGET_NR_semtimedop
10179 case TARGET_NR_semtimedop
:
10180 return do_semtimedop(arg1
, arg2
, arg3
, arg4
, false);
10182 #ifdef TARGET_NR_semtimedop_time64
10183 case TARGET_NR_semtimedop_time64
:
10184 return do_semtimedop(arg1
, arg2
, arg3
, arg4
, true);
10186 #ifdef TARGET_NR_semctl
10187 case TARGET_NR_semctl
:
10188 return do_semctl(arg1
, arg2
, arg3
, arg4
);
10190 #ifdef TARGET_NR_msgctl
10191 case TARGET_NR_msgctl
:
10192 return do_msgctl(arg1
, arg2
, arg3
);
10194 #ifdef TARGET_NR_msgget
10195 case TARGET_NR_msgget
:
10196 return get_errno(msgget(arg1
, arg2
));
10198 #ifdef TARGET_NR_msgrcv
10199 case TARGET_NR_msgrcv
:
10200 return do_msgrcv(arg1
, arg2
, arg3
, arg4
, arg5
);
10202 #ifdef TARGET_NR_msgsnd
10203 case TARGET_NR_msgsnd
:
10204 return do_msgsnd(arg1
, arg2
, arg3
, arg4
);
10206 #ifdef TARGET_NR_shmget
10207 case TARGET_NR_shmget
:
10208 return get_errno(shmget(arg1
, arg2
, arg3
));
10210 #ifdef TARGET_NR_shmctl
10211 case TARGET_NR_shmctl
:
10212 return do_shmctl(arg1
, arg2
, arg3
);
10214 #ifdef TARGET_NR_shmat
10215 case TARGET_NR_shmat
:
10216 return do_shmat(cpu_env
, arg1
, arg2
, arg3
);
10218 #ifdef TARGET_NR_shmdt
10219 case TARGET_NR_shmdt
:
10220 return do_shmdt(arg1
);
10222 case TARGET_NR_fsync
:
10223 return get_errno(fsync(arg1
));
10224 case TARGET_NR_clone
:
10225 /* Linux manages to have three different orderings for its
10226 * arguments to clone(); the BACKWARDS and BACKWARDS2 defines
10227 * match the kernel's CONFIG_CLONE_* settings.
10228 * Microblaze is further special in that it uses a sixth
10229 * implicit argument to clone for the TLS pointer.
10231 #if defined(TARGET_MICROBLAZE)
10232 ret
= get_errno(do_fork(cpu_env
, arg1
, arg2
, arg4
, arg6
, arg5
));
10233 #elif defined(TARGET_CLONE_BACKWARDS)
10234 ret
= get_errno(do_fork(cpu_env
, arg1
, arg2
, arg3
, arg4
, arg5
));
10235 #elif defined(TARGET_CLONE_BACKWARDS2)
10236 ret
= get_errno(do_fork(cpu_env
, arg2
, arg1
, arg3
, arg5
, arg4
));
10238 ret
= get_errno(do_fork(cpu_env
, arg1
, arg2
, arg3
, arg5
, arg4
));
10241 #ifdef __NR_exit_group
10242 /* new thread calls */
10243 case TARGET_NR_exit_group
:
10244 preexit_cleanup(cpu_env
, arg1
);
10245 return get_errno(exit_group(arg1
));
10247 case TARGET_NR_setdomainname
:
10248 if (!(p
= lock_user_string(arg1
)))
10249 return -TARGET_EFAULT
;
10250 ret
= get_errno(setdomainname(p
, arg2
));
10251 unlock_user(p
, arg1
, 0);
10253 case TARGET_NR_uname
:
10254 /* no need to transcode because we use the linux syscall */
10256 struct new_utsname
* buf
;
10258 if (!lock_user_struct(VERIFY_WRITE
, buf
, arg1
, 0))
10259 return -TARGET_EFAULT
;
10260 ret
= get_errno(sys_uname(buf
));
10261 if (!is_error(ret
)) {
10262 /* Overwrite the native machine name with whatever is being
10264 g_strlcpy(buf
->machine
, cpu_to_uname_machine(cpu_env
),
10265 sizeof(buf
->machine
));
10266 /* Allow the user to override the reported release. */
10267 if (qemu_uname_release
&& *qemu_uname_release
) {
10268 g_strlcpy(buf
->release
, qemu_uname_release
,
10269 sizeof(buf
->release
));
10272 unlock_user_struct(buf
, arg1
, 1);
10276 case TARGET_NR_modify_ldt
:
10277 return do_modify_ldt(cpu_env
, arg1
, arg2
, arg3
);
10278 #if !defined(TARGET_X86_64)
10279 case TARGET_NR_vm86
:
10280 return do_vm86(cpu_env
, arg1
, arg2
);
10283 #if defined(TARGET_NR_adjtimex)
10284 case TARGET_NR_adjtimex
:
10286 struct timex host_buf
;
10288 if (target_to_host_timex(&host_buf
, arg1
) != 0) {
10289 return -TARGET_EFAULT
;
10291 ret
= get_errno(adjtimex(&host_buf
));
10292 if (!is_error(ret
)) {
10293 if (host_to_target_timex(arg1
, &host_buf
) != 0) {
10294 return -TARGET_EFAULT
;
10300 #if defined(TARGET_NR_clock_adjtime) && defined(CONFIG_CLOCK_ADJTIME)
10301 case TARGET_NR_clock_adjtime
:
10303 struct timex htx
, *phtx
= &htx
;
10305 if (target_to_host_timex(phtx
, arg2
) != 0) {
10306 return -TARGET_EFAULT
;
10308 ret
= get_errno(clock_adjtime(arg1
, phtx
));
10309 if (!is_error(ret
) && phtx
) {
10310 if (host_to_target_timex(arg2
, phtx
) != 0) {
10311 return -TARGET_EFAULT
;
10317 #if defined(TARGET_NR_clock_adjtime64) && defined(CONFIG_CLOCK_ADJTIME)
10318 case TARGET_NR_clock_adjtime64
:
10322 if (target_to_host_timex64(&htx
, arg2
) != 0) {
10323 return -TARGET_EFAULT
;
10325 ret
= get_errno(clock_adjtime(arg1
, &htx
));
10326 if (!is_error(ret
) && host_to_target_timex64(arg2
, &htx
)) {
10327 return -TARGET_EFAULT
;
10332 case TARGET_NR_getpgid
:
10333 return get_errno(getpgid(arg1
));
10334 case TARGET_NR_fchdir
:
10335 return get_errno(fchdir(arg1
));
10336 case TARGET_NR_personality
:
10337 return get_errno(personality(arg1
));
10338 #ifdef TARGET_NR__llseek /* Not on alpha */
10339 case TARGET_NR__llseek
:
10342 #if !defined(__NR_llseek)
10343 res
= lseek(arg1
, ((uint64_t)arg2
<< 32) | (abi_ulong
)arg3
, arg5
);
10345 ret
= get_errno(res
);
10350 ret
= get_errno(_llseek(arg1
, arg2
, arg3
, &res
, arg5
));
10352 if ((ret
== 0) && put_user_s64(res
, arg4
)) {
10353 return -TARGET_EFAULT
;
10358 #ifdef TARGET_NR_getdents
10359 case TARGET_NR_getdents
:
10360 #ifdef EMULATE_GETDENTS_WITH_GETDENTS
10361 #if TARGET_ABI_BITS == 32 && HOST_LONG_BITS == 64
10363 struct target_dirent
*target_dirp
;
10364 struct linux_dirent
*dirp
;
10365 abi_long count
= arg3
;
10367 dirp
= g_try_malloc(count
);
10369 return -TARGET_ENOMEM
;
10372 ret
= get_errno(sys_getdents(arg1
, dirp
, count
));
10373 if (!is_error(ret
)) {
10374 struct linux_dirent
*de
;
10375 struct target_dirent
*tde
;
10377 int reclen
, treclen
;
10378 int count1
, tnamelen
;
10382 if (!(target_dirp
= lock_user(VERIFY_WRITE
, arg2
, count
, 0)))
10383 return -TARGET_EFAULT
;
10386 reclen
= de
->d_reclen
;
10387 tnamelen
= reclen
- offsetof(struct linux_dirent
, d_name
);
10388 assert(tnamelen
>= 0);
10389 treclen
= tnamelen
+ offsetof(struct target_dirent
, d_name
);
10390 assert(count1
+ treclen
<= count
);
10391 tde
->d_reclen
= tswap16(treclen
);
10392 tde
->d_ino
= tswapal(de
->d_ino
);
10393 tde
->d_off
= tswapal(de
->d_off
);
10394 memcpy(tde
->d_name
, de
->d_name
, tnamelen
);
10395 de
= (struct linux_dirent
*)((char *)de
+ reclen
);
10397 tde
= (struct target_dirent
*)((char *)tde
+ treclen
);
10401 unlock_user(target_dirp
, arg2
, ret
);
10407 struct linux_dirent
*dirp
;
10408 abi_long count
= arg3
;
10410 if (!(dirp
= lock_user(VERIFY_WRITE
, arg2
, count
, 0)))
10411 return -TARGET_EFAULT
;
10412 ret
= get_errno(sys_getdents(arg1
, dirp
, count
));
10413 if (!is_error(ret
)) {
10414 struct linux_dirent
*de
;
10419 reclen
= de
->d_reclen
;
10422 de
->d_reclen
= tswap16(reclen
);
10423 tswapls(&de
->d_ino
);
10424 tswapls(&de
->d_off
);
10425 de
= (struct linux_dirent
*)((char *)de
+ reclen
);
10429 unlock_user(dirp
, arg2
, ret
);
10433 /* Implement getdents in terms of getdents64 */
10435 struct linux_dirent64
*dirp
;
10436 abi_long count
= arg3
;
10438 dirp
= lock_user(VERIFY_WRITE
, arg2
, count
, 0);
10440 return -TARGET_EFAULT
;
10442 ret
= get_errno(sys_getdents64(arg1
, dirp
, count
));
10443 if (!is_error(ret
)) {
10444 /* Convert the dirent64 structs to target dirent. We do this
10445 * in-place, since we can guarantee that a target_dirent is no
10446 * larger than a dirent64; however this means we have to be
10447 * careful to read everything before writing in the new format.
10449 struct linux_dirent64
*de
;
10450 struct target_dirent
*tde
;
10455 tde
= (struct target_dirent
*)dirp
;
10457 int namelen
, treclen
;
10458 int reclen
= de
->d_reclen
;
10459 uint64_t ino
= de
->d_ino
;
10460 int64_t off
= de
->d_off
;
10461 uint8_t type
= de
->d_type
;
10463 namelen
= strlen(de
->d_name
);
10464 treclen
= offsetof(struct target_dirent
, d_name
)
10466 treclen
= QEMU_ALIGN_UP(treclen
, sizeof(abi_long
));
10468 memmove(tde
->d_name
, de
->d_name
, namelen
+ 1);
10469 tde
->d_ino
= tswapal(ino
);
10470 tde
->d_off
= tswapal(off
);
10471 tde
->d_reclen
= tswap16(treclen
);
10472 /* The target_dirent type is in what was formerly a padding
10473 * byte at the end of the structure:
10475 *(((char *)tde
) + treclen
- 1) = type
;
10477 de
= (struct linux_dirent64
*)((char *)de
+ reclen
);
10478 tde
= (struct target_dirent
*)((char *)tde
+ treclen
);
10484 unlock_user(dirp
, arg2
, ret
);
10488 #endif /* TARGET_NR_getdents */
10489 #if defined(TARGET_NR_getdents64) && defined(__NR_getdents64)
10490 case TARGET_NR_getdents64
:
10492 struct linux_dirent64
*dirp
;
10493 abi_long count
= arg3
;
10494 if (!(dirp
= lock_user(VERIFY_WRITE
, arg2
, count
, 0)))
10495 return -TARGET_EFAULT
;
10496 ret
= get_errno(sys_getdents64(arg1
, dirp
, count
));
10497 if (!is_error(ret
)) {
10498 struct linux_dirent64
*de
;
10503 reclen
= de
->d_reclen
;
10506 de
->d_reclen
= tswap16(reclen
);
10507 tswap64s((uint64_t *)&de
->d_ino
);
10508 tswap64s((uint64_t *)&de
->d_off
);
10509 de
= (struct linux_dirent64
*)((char *)de
+ reclen
);
10513 unlock_user(dirp
, arg2
, ret
);
10516 #endif /* TARGET_NR_getdents64 */
10517 #if defined(TARGET_NR__newselect)
10518 case TARGET_NR__newselect
:
10519 return do_select(arg1
, arg2
, arg3
, arg4
, arg5
);
10521 #ifdef TARGET_NR_poll
10522 case TARGET_NR_poll
:
10523 return do_ppoll(arg1
, arg2
, arg3
, arg4
, arg5
, false, false);
10525 #ifdef TARGET_NR_ppoll
10526 case TARGET_NR_ppoll
:
10527 return do_ppoll(arg1
, arg2
, arg3
, arg4
, arg5
, true, false);
10529 #ifdef TARGET_NR_ppoll_time64
10530 case TARGET_NR_ppoll_time64
:
10531 return do_ppoll(arg1
, arg2
, arg3
, arg4
, arg5
, true, true);
10533 case TARGET_NR_flock
:
10534 /* NOTE: the flock constant seems to be the same for every
10536 return get_errno(safe_flock(arg1
, arg2
));
10537 case TARGET_NR_readv
:
10539 struct iovec
*vec
= lock_iovec(VERIFY_WRITE
, arg2
, arg3
, 0);
10541 ret
= get_errno(safe_readv(arg1
, vec
, arg3
));
10542 unlock_iovec(vec
, arg2
, arg3
, 1);
10544 ret
= -host_to_target_errno(errno
);
10548 case TARGET_NR_writev
:
10550 struct iovec
*vec
= lock_iovec(VERIFY_READ
, arg2
, arg3
, 1);
10552 ret
= get_errno(safe_writev(arg1
, vec
, arg3
));
10553 unlock_iovec(vec
, arg2
, arg3
, 0);
10555 ret
= -host_to_target_errno(errno
);
10559 #if defined(TARGET_NR_preadv)
10560 case TARGET_NR_preadv
:
10562 struct iovec
*vec
= lock_iovec(VERIFY_WRITE
, arg2
, arg3
, 0);
10564 unsigned long low
, high
;
10566 target_to_host_low_high(arg4
, arg5
, &low
, &high
);
10567 ret
= get_errno(safe_preadv(arg1
, vec
, arg3
, low
, high
));
10568 unlock_iovec(vec
, arg2
, arg3
, 1);
10570 ret
= -host_to_target_errno(errno
);
10575 #if defined(TARGET_NR_pwritev)
10576 case TARGET_NR_pwritev
:
10578 struct iovec
*vec
= lock_iovec(VERIFY_READ
, arg2
, arg3
, 1);
10580 unsigned long low
, high
;
10582 target_to_host_low_high(arg4
, arg5
, &low
, &high
);
10583 ret
= get_errno(safe_pwritev(arg1
, vec
, arg3
, low
, high
));
10584 unlock_iovec(vec
, arg2
, arg3
, 0);
10586 ret
= -host_to_target_errno(errno
);
10591 case TARGET_NR_getsid
:
10592 return get_errno(getsid(arg1
));
10593 #if defined(TARGET_NR_fdatasync) /* Not on alpha (osf_datasync ?) */
10594 case TARGET_NR_fdatasync
:
10595 return get_errno(fdatasync(arg1
));
10597 case TARGET_NR_sched_getaffinity
:
10599 unsigned int mask_size
;
10600 unsigned long *mask
;
10603 * sched_getaffinity needs multiples of ulong, so need to take
10604 * care of mismatches between target ulong and host ulong sizes.
10606 if (arg2
& (sizeof(abi_ulong
) - 1)) {
10607 return -TARGET_EINVAL
;
10609 mask_size
= (arg2
+ (sizeof(*mask
) - 1)) & ~(sizeof(*mask
) - 1);
10611 mask
= alloca(mask_size
);
10612 memset(mask
, 0, mask_size
);
10613 ret
= get_errno(sys_sched_getaffinity(arg1
, mask_size
, mask
));
10615 if (!is_error(ret
)) {
10617 /* More data returned than the caller's buffer will fit.
10618 * This only happens if sizeof(abi_long) < sizeof(long)
10619 * and the caller passed us a buffer holding an odd number
10620 * of abi_longs. If the host kernel is actually using the
10621 * extra 4 bytes then fail EINVAL; otherwise we can just
10622 * ignore them and only copy the interesting part.
10624 int numcpus
= sysconf(_SC_NPROCESSORS_CONF
);
10625 if (numcpus
> arg2
* 8) {
10626 return -TARGET_EINVAL
;
10631 if (host_to_target_cpu_mask(mask
, mask_size
, arg3
, ret
)) {
10632 return -TARGET_EFAULT
;
10637 case TARGET_NR_sched_setaffinity
:
10639 unsigned int mask_size
;
10640 unsigned long *mask
;
10643 * sched_setaffinity needs multiples of ulong, so need to take
10644 * care of mismatches between target ulong and host ulong sizes.
10646 if (arg2
& (sizeof(abi_ulong
) - 1)) {
10647 return -TARGET_EINVAL
;
10649 mask_size
= (arg2
+ (sizeof(*mask
) - 1)) & ~(sizeof(*mask
) - 1);
10650 mask
= alloca(mask_size
);
10652 ret
= target_to_host_cpu_mask(mask
, mask_size
, arg3
, arg2
);
10657 return get_errno(sys_sched_setaffinity(arg1
, mask_size
, mask
));
10659 case TARGET_NR_getcpu
:
10661 unsigned cpu
, node
;
10662 ret
= get_errno(sys_getcpu(arg1
? &cpu
: NULL
,
10663 arg2
? &node
: NULL
,
10665 if (is_error(ret
)) {
10668 if (arg1
&& put_user_u32(cpu
, arg1
)) {
10669 return -TARGET_EFAULT
;
10671 if (arg2
&& put_user_u32(node
, arg2
)) {
10672 return -TARGET_EFAULT
;
10676 case TARGET_NR_sched_setparam
:
10678 struct sched_param
*target_schp
;
10679 struct sched_param schp
;
10682 return -TARGET_EINVAL
;
10684 if (!lock_user_struct(VERIFY_READ
, target_schp
, arg2
, 1))
10685 return -TARGET_EFAULT
;
10686 schp
.sched_priority
= tswap32(target_schp
->sched_priority
);
10687 unlock_user_struct(target_schp
, arg2
, 0);
10688 return get_errno(sched_setparam(arg1
, &schp
));
10690 case TARGET_NR_sched_getparam
:
10692 struct sched_param
*target_schp
;
10693 struct sched_param schp
;
10696 return -TARGET_EINVAL
;
10698 ret
= get_errno(sched_getparam(arg1
, &schp
));
10699 if (!is_error(ret
)) {
10700 if (!lock_user_struct(VERIFY_WRITE
, target_schp
, arg2
, 0))
10701 return -TARGET_EFAULT
;
10702 target_schp
->sched_priority
= tswap32(schp
.sched_priority
);
10703 unlock_user_struct(target_schp
, arg2
, 1);
10707 case TARGET_NR_sched_setscheduler
:
10709 struct sched_param
*target_schp
;
10710 struct sched_param schp
;
10712 return -TARGET_EINVAL
;
10714 if (!lock_user_struct(VERIFY_READ
, target_schp
, arg3
, 1))
10715 return -TARGET_EFAULT
;
10716 schp
.sched_priority
= tswap32(target_schp
->sched_priority
);
10717 unlock_user_struct(target_schp
, arg3
, 0);
10718 return get_errno(sched_setscheduler(arg1
, arg2
, &schp
));
10720 case TARGET_NR_sched_getscheduler
:
10721 return get_errno(sched_getscheduler(arg1
));
10722 case TARGET_NR_sched_yield
:
10723 return get_errno(sched_yield());
10724 case TARGET_NR_sched_get_priority_max
:
10725 return get_errno(sched_get_priority_max(arg1
));
10726 case TARGET_NR_sched_get_priority_min
:
10727 return get_errno(sched_get_priority_min(arg1
));
10728 #ifdef TARGET_NR_sched_rr_get_interval
10729 case TARGET_NR_sched_rr_get_interval
:
10731 struct timespec ts
;
10732 ret
= get_errno(sched_rr_get_interval(arg1
, &ts
));
10733 if (!is_error(ret
)) {
10734 ret
= host_to_target_timespec(arg2
, &ts
);
10739 #ifdef TARGET_NR_sched_rr_get_interval_time64
10740 case TARGET_NR_sched_rr_get_interval_time64
:
10742 struct timespec ts
;
10743 ret
= get_errno(sched_rr_get_interval(arg1
, &ts
));
10744 if (!is_error(ret
)) {
10745 ret
= host_to_target_timespec64(arg2
, &ts
);
10750 #if defined(TARGET_NR_nanosleep)
10751 case TARGET_NR_nanosleep
:
10753 struct timespec req
, rem
;
10754 target_to_host_timespec(&req
, arg1
);
10755 ret
= get_errno(safe_nanosleep(&req
, &rem
));
10756 if (is_error(ret
) && arg2
) {
10757 host_to_target_timespec(arg2
, &rem
);
10762 case TARGET_NR_prctl
:
10764 case PR_GET_PDEATHSIG
:
10767 ret
= get_errno(prctl(arg1
, &deathsig
, arg3
, arg4
, arg5
));
10768 if (!is_error(ret
) && arg2
10769 && put_user_s32(deathsig
, arg2
)) {
10770 return -TARGET_EFAULT
;
10777 void *name
= lock_user(VERIFY_WRITE
, arg2
, 16, 1);
10779 return -TARGET_EFAULT
;
10781 ret
= get_errno(prctl(arg1
, (unsigned long)name
,
10782 arg3
, arg4
, arg5
));
10783 unlock_user(name
, arg2
, 16);
10788 void *name
= lock_user(VERIFY_READ
, arg2
, 16, 1);
10790 return -TARGET_EFAULT
;
10792 ret
= get_errno(prctl(arg1
, (unsigned long)name
,
10793 arg3
, arg4
, arg5
));
10794 unlock_user(name
, arg2
, 0);
10799 case TARGET_PR_GET_FP_MODE
:
10801 CPUMIPSState
*env
= ((CPUMIPSState
*)cpu_env
);
10803 if (env
->CP0_Status
& (1 << CP0St_FR
)) {
10804 ret
|= TARGET_PR_FP_MODE_FR
;
10806 if (env
->CP0_Config5
& (1 << CP0C5_FRE
)) {
10807 ret
|= TARGET_PR_FP_MODE_FRE
;
10811 case TARGET_PR_SET_FP_MODE
:
10813 CPUMIPSState
*env
= ((CPUMIPSState
*)cpu_env
);
10814 bool old_fr
= env
->CP0_Status
& (1 << CP0St_FR
);
10815 bool old_fre
= env
->CP0_Config5
& (1 << CP0C5_FRE
);
10816 bool new_fr
= arg2
& TARGET_PR_FP_MODE_FR
;
10817 bool new_fre
= arg2
& TARGET_PR_FP_MODE_FRE
;
10819 const unsigned int known_bits
= TARGET_PR_FP_MODE_FR
|
10820 TARGET_PR_FP_MODE_FRE
;
10822 /* If nothing to change, return right away, successfully. */
10823 if (old_fr
== new_fr
&& old_fre
== new_fre
) {
10826 /* Check the value is valid */
10827 if (arg2
& ~known_bits
) {
10828 return -TARGET_EOPNOTSUPP
;
10830 /* Setting FRE without FR is not supported. */
10831 if (new_fre
&& !new_fr
) {
10832 return -TARGET_EOPNOTSUPP
;
10834 if (new_fr
&& !(env
->active_fpu
.fcr0
& (1 << FCR0_F64
))) {
10835 /* FR1 is not supported */
10836 return -TARGET_EOPNOTSUPP
;
10838 if (!new_fr
&& (env
->active_fpu
.fcr0
& (1 << FCR0_F64
))
10839 && !(env
->CP0_Status_rw_bitmask
& (1 << CP0St_FR
))) {
10840 /* cannot set FR=0 */
10841 return -TARGET_EOPNOTSUPP
;
10843 if (new_fre
&& !(env
->active_fpu
.fcr0
& (1 << FCR0_FREP
))) {
10844 /* Cannot set FRE=1 */
10845 return -TARGET_EOPNOTSUPP
;
10849 fpr_t
*fpr
= env
->active_fpu
.fpr
;
10850 for (i
= 0; i
< 32 ; i
+= 2) {
10851 if (!old_fr
&& new_fr
) {
10852 fpr
[i
].w
[!FP_ENDIAN_IDX
] = fpr
[i
+ 1].w
[FP_ENDIAN_IDX
];
10853 } else if (old_fr
&& !new_fr
) {
10854 fpr
[i
+ 1].w
[FP_ENDIAN_IDX
] = fpr
[i
].w
[!FP_ENDIAN_IDX
];
10859 env
->CP0_Status
|= (1 << CP0St_FR
);
10860 env
->hflags
|= MIPS_HFLAG_F64
;
10862 env
->CP0_Status
&= ~(1 << CP0St_FR
);
10863 env
->hflags
&= ~MIPS_HFLAG_F64
;
10866 env
->CP0_Config5
|= (1 << CP0C5_FRE
);
10867 if (env
->active_fpu
.fcr0
& (1 << FCR0_FREP
)) {
10868 env
->hflags
|= MIPS_HFLAG_FRE
;
10871 env
->CP0_Config5
&= ~(1 << CP0C5_FRE
);
10872 env
->hflags
&= ~MIPS_HFLAG_FRE
;
10878 #ifdef TARGET_AARCH64
10879 case TARGET_PR_SVE_SET_VL
:
10881 * We cannot support either PR_SVE_SET_VL_ONEXEC or
10882 * PR_SVE_VL_INHERIT. Note the kernel definition
10883 * of sve_vl_valid allows for VQ=512, i.e. VL=8192,
10884 * even though the current architectural maximum is VQ=16.
10886 ret
= -TARGET_EINVAL
;
10887 if (cpu_isar_feature(aa64_sve
, env_archcpu(cpu_env
))
10888 && arg2
>= 0 && arg2
<= 512 * 16 && !(arg2
& 15)) {
10889 CPUARMState
*env
= cpu_env
;
10890 ARMCPU
*cpu
= env_archcpu(env
);
10891 uint32_t vq
, old_vq
;
10893 old_vq
= (env
->vfp
.zcr_el
[1] & 0xf) + 1;
10894 vq
= MAX(arg2
/ 16, 1);
10895 vq
= MIN(vq
, cpu
->sve_max_vq
);
10898 aarch64_sve_narrow_vq(env
, vq
);
10900 env
->vfp
.zcr_el
[1] = vq
- 1;
10901 arm_rebuild_hflags(env
);
10905 case TARGET_PR_SVE_GET_VL
:
10906 ret
= -TARGET_EINVAL
;
10908 ARMCPU
*cpu
= env_archcpu(cpu_env
);
10909 if (cpu_isar_feature(aa64_sve
, cpu
)) {
10910 ret
= ((cpu
->env
.vfp
.zcr_el
[1] & 0xf) + 1) * 16;
10914 case TARGET_PR_PAC_RESET_KEYS
:
10916 CPUARMState
*env
= cpu_env
;
10917 ARMCPU
*cpu
= env_archcpu(env
);
10919 if (arg3
|| arg4
|| arg5
) {
10920 return -TARGET_EINVAL
;
10922 if (cpu_isar_feature(aa64_pauth
, cpu
)) {
10923 int all
= (TARGET_PR_PAC_APIAKEY
| TARGET_PR_PAC_APIBKEY
|
10924 TARGET_PR_PAC_APDAKEY
| TARGET_PR_PAC_APDBKEY
|
10925 TARGET_PR_PAC_APGAKEY
);
10931 } else if (arg2
& ~all
) {
10932 return -TARGET_EINVAL
;
10934 if (arg2
& TARGET_PR_PAC_APIAKEY
) {
10935 ret
|= qemu_guest_getrandom(&env
->keys
.apia
,
10936 sizeof(ARMPACKey
), &err
);
10938 if (arg2
& TARGET_PR_PAC_APIBKEY
) {
10939 ret
|= qemu_guest_getrandom(&env
->keys
.apib
,
10940 sizeof(ARMPACKey
), &err
);
10942 if (arg2
& TARGET_PR_PAC_APDAKEY
) {
10943 ret
|= qemu_guest_getrandom(&env
->keys
.apda
,
10944 sizeof(ARMPACKey
), &err
);
10946 if (arg2
& TARGET_PR_PAC_APDBKEY
) {
10947 ret
|= qemu_guest_getrandom(&env
->keys
.apdb
,
10948 sizeof(ARMPACKey
), &err
);
10950 if (arg2
& TARGET_PR_PAC_APGAKEY
) {
10951 ret
|= qemu_guest_getrandom(&env
->keys
.apga
,
10952 sizeof(ARMPACKey
), &err
);
10956 * Some unknown failure in the crypto. The best
10957 * we can do is log it and fail the syscall.
10958 * The real syscall cannot fail this way.
10960 qemu_log_mask(LOG_UNIMP
,
10961 "PR_PAC_RESET_KEYS: Crypto failure: %s",
10962 error_get_pretty(err
));
10964 return -TARGET_EIO
;
10969 return -TARGET_EINVAL
;
10970 case TARGET_PR_SET_TAGGED_ADDR_CTRL
:
10972 abi_ulong valid_mask
= TARGET_PR_TAGGED_ADDR_ENABLE
;
10973 CPUARMState
*env
= cpu_env
;
10974 ARMCPU
*cpu
= env_archcpu(env
);
10976 if (cpu_isar_feature(aa64_mte
, cpu
)) {
10977 valid_mask
|= TARGET_PR_MTE_TCF_MASK
;
10978 valid_mask
|= TARGET_PR_MTE_TAG_MASK
;
10981 if ((arg2
& ~valid_mask
) || arg3
|| arg4
|| arg5
) {
10982 return -TARGET_EINVAL
;
10984 env
->tagged_addr_enable
= arg2
& TARGET_PR_TAGGED_ADDR_ENABLE
;
10986 if (cpu_isar_feature(aa64_mte
, cpu
)) {
10987 switch (arg2
& TARGET_PR_MTE_TCF_MASK
) {
10988 case TARGET_PR_MTE_TCF_NONE
:
10989 case TARGET_PR_MTE_TCF_SYNC
:
10990 case TARGET_PR_MTE_TCF_ASYNC
:
10997 * Write PR_MTE_TCF to SCTLR_EL1[TCF0].
10998 * Note that the syscall values are consistent with hw.
11000 env
->cp15
.sctlr_el
[1] =
11001 deposit64(env
->cp15
.sctlr_el
[1], 38, 2,
11002 arg2
>> TARGET_PR_MTE_TCF_SHIFT
);
11005 * Write PR_MTE_TAG to GCR_EL1[Exclude].
11006 * Note that the syscall uses an include mask,
11007 * and hardware uses an exclude mask -- invert.
11009 env
->cp15
.gcr_el1
=
11010 deposit64(env
->cp15
.gcr_el1
, 0, 16,
11011 ~arg2
>> TARGET_PR_MTE_TAG_SHIFT
);
11012 arm_rebuild_hflags(env
);
11016 case TARGET_PR_GET_TAGGED_ADDR_CTRL
:
11019 CPUARMState
*env
= cpu_env
;
11020 ARMCPU
*cpu
= env_archcpu(env
);
11022 if (arg2
|| arg3
|| arg4
|| arg5
) {
11023 return -TARGET_EINVAL
;
11025 if (env
->tagged_addr_enable
) {
11026 ret
|= TARGET_PR_TAGGED_ADDR_ENABLE
;
11028 if (cpu_isar_feature(aa64_mte
, cpu
)) {
11030 ret
|= (extract64(env
->cp15
.sctlr_el
[1], 38, 2)
11031 << TARGET_PR_MTE_TCF_SHIFT
);
11032 ret
= deposit64(ret
, TARGET_PR_MTE_TAG_SHIFT
, 16,
11033 ~env
->cp15
.gcr_el1
);
11037 #endif /* AARCH64 */
11038 case PR_GET_SECCOMP
:
11039 case PR_SET_SECCOMP
:
11040 /* Disable seccomp to prevent the target disabling syscalls we
11042 return -TARGET_EINVAL
;
11044 /* Most prctl options have no pointer arguments */
11045 return get_errno(prctl(arg1
, arg2
, arg3
, arg4
, arg5
));
11048 #ifdef TARGET_NR_arch_prctl
11049 case TARGET_NR_arch_prctl
:
11050 return do_arch_prctl(cpu_env
, arg1
, arg2
);
11052 #ifdef TARGET_NR_pread64
11053 case TARGET_NR_pread64
:
11054 if (regpairs_aligned(cpu_env
, num
)) {
11058 if (arg2
== 0 && arg3
== 0) {
11059 /* Special-case NULL buffer and zero length, which should succeed */
11062 p
= lock_user(VERIFY_WRITE
, arg2
, arg3
, 0);
11064 return -TARGET_EFAULT
;
11067 ret
= get_errno(pread64(arg1
, p
, arg3
, target_offset64(arg4
, arg5
)));
11068 unlock_user(p
, arg2
, ret
);
11070 case TARGET_NR_pwrite64
:
11071 if (regpairs_aligned(cpu_env
, num
)) {
11075 if (arg2
== 0 && arg3
== 0) {
11076 /* Special-case NULL buffer and zero length, which should succeed */
11079 p
= lock_user(VERIFY_READ
, arg2
, arg3
, 1);
11081 return -TARGET_EFAULT
;
11084 ret
= get_errno(pwrite64(arg1
, p
, arg3
, target_offset64(arg4
, arg5
)));
11085 unlock_user(p
, arg2
, 0);
11088 case TARGET_NR_getcwd
:
11089 if (!(p
= lock_user(VERIFY_WRITE
, arg1
, arg2
, 0)))
11090 return -TARGET_EFAULT
;
11091 ret
= get_errno(sys_getcwd1(p
, arg2
));
11092 unlock_user(p
, arg1
, ret
);
11094 case TARGET_NR_capget
:
11095 case TARGET_NR_capset
:
11097 struct target_user_cap_header
*target_header
;
11098 struct target_user_cap_data
*target_data
= NULL
;
11099 struct __user_cap_header_struct header
;
11100 struct __user_cap_data_struct data
[2];
11101 struct __user_cap_data_struct
*dataptr
= NULL
;
11102 int i
, target_datalen
;
11103 int data_items
= 1;
11105 if (!lock_user_struct(VERIFY_WRITE
, target_header
, arg1
, 1)) {
11106 return -TARGET_EFAULT
;
11108 header
.version
= tswap32(target_header
->version
);
11109 header
.pid
= tswap32(target_header
->pid
);
11111 if (header
.version
!= _LINUX_CAPABILITY_VERSION
) {
11112 /* Version 2 and up takes pointer to two user_data structs */
11116 target_datalen
= sizeof(*target_data
) * data_items
;
11119 if (num
== TARGET_NR_capget
) {
11120 target_data
= lock_user(VERIFY_WRITE
, arg2
, target_datalen
, 0);
11122 target_data
= lock_user(VERIFY_READ
, arg2
, target_datalen
, 1);
11124 if (!target_data
) {
11125 unlock_user_struct(target_header
, arg1
, 0);
11126 return -TARGET_EFAULT
;
11129 if (num
== TARGET_NR_capset
) {
11130 for (i
= 0; i
< data_items
; i
++) {
11131 data
[i
].effective
= tswap32(target_data
[i
].effective
);
11132 data
[i
].permitted
= tswap32(target_data
[i
].permitted
);
11133 data
[i
].inheritable
= tswap32(target_data
[i
].inheritable
);
11140 if (num
== TARGET_NR_capget
) {
11141 ret
= get_errno(capget(&header
, dataptr
));
11143 ret
= get_errno(capset(&header
, dataptr
));
11146 /* The kernel always updates version for both capget and capset */
11147 target_header
->version
= tswap32(header
.version
);
11148 unlock_user_struct(target_header
, arg1
, 1);
11151 if (num
== TARGET_NR_capget
) {
11152 for (i
= 0; i
< data_items
; i
++) {
11153 target_data
[i
].effective
= tswap32(data
[i
].effective
);
11154 target_data
[i
].permitted
= tswap32(data
[i
].permitted
);
11155 target_data
[i
].inheritable
= tswap32(data
[i
].inheritable
);
11157 unlock_user(target_data
, arg2
, target_datalen
);
11159 unlock_user(target_data
, arg2
, 0);
11164 case TARGET_NR_sigaltstack
:
11165 return do_sigaltstack(arg1
, arg2
, cpu_env
);
11167 #ifdef CONFIG_SENDFILE
11168 #ifdef TARGET_NR_sendfile
11169 case TARGET_NR_sendfile
:
11171 off_t
*offp
= NULL
;
11174 ret
= get_user_sal(off
, arg3
);
11175 if (is_error(ret
)) {
11180 ret
= get_errno(sendfile(arg1
, arg2
, offp
, arg4
));
11181 if (!is_error(ret
) && arg3
) {
11182 abi_long ret2
= put_user_sal(off
, arg3
);
11183 if (is_error(ret2
)) {
11190 #ifdef TARGET_NR_sendfile64
11191 case TARGET_NR_sendfile64
:
11193 off_t
*offp
= NULL
;
11196 ret
= get_user_s64(off
, arg3
);
11197 if (is_error(ret
)) {
11202 ret
= get_errno(sendfile(arg1
, arg2
, offp
, arg4
));
11203 if (!is_error(ret
) && arg3
) {
11204 abi_long ret2
= put_user_s64(off
, arg3
);
11205 if (is_error(ret2
)) {
11213 #ifdef TARGET_NR_vfork
11214 case TARGET_NR_vfork
:
11215 return get_errno(do_fork(cpu_env
,
11216 CLONE_VFORK
| CLONE_VM
| TARGET_SIGCHLD
,
11219 #ifdef TARGET_NR_ugetrlimit
11220 case TARGET_NR_ugetrlimit
:
11222 struct rlimit rlim
;
11223 int resource
= target_to_host_resource(arg1
);
11224 ret
= get_errno(getrlimit(resource
, &rlim
));
11225 if (!is_error(ret
)) {
11226 struct target_rlimit
*target_rlim
;
11227 if (!lock_user_struct(VERIFY_WRITE
, target_rlim
, arg2
, 0))
11228 return -TARGET_EFAULT
;
11229 target_rlim
->rlim_cur
= host_to_target_rlim(rlim
.rlim_cur
);
11230 target_rlim
->rlim_max
= host_to_target_rlim(rlim
.rlim_max
);
11231 unlock_user_struct(target_rlim
, arg2
, 1);
11236 #ifdef TARGET_NR_truncate64
11237 case TARGET_NR_truncate64
:
11238 if (!(p
= lock_user_string(arg1
)))
11239 return -TARGET_EFAULT
;
11240 ret
= target_truncate64(cpu_env
, p
, arg2
, arg3
, arg4
);
11241 unlock_user(p
, arg1
, 0);
11244 #ifdef TARGET_NR_ftruncate64
11245 case TARGET_NR_ftruncate64
:
11246 return target_ftruncate64(cpu_env
, arg1
, arg2
, arg3
, arg4
);
11248 #ifdef TARGET_NR_stat64
11249 case TARGET_NR_stat64
:
11250 if (!(p
= lock_user_string(arg1
))) {
11251 return -TARGET_EFAULT
;
11253 ret
= get_errno(stat(path(p
), &st
));
11254 unlock_user(p
, arg1
, 0);
11255 if (!is_error(ret
))
11256 ret
= host_to_target_stat64(cpu_env
, arg2
, &st
);
11259 #ifdef TARGET_NR_lstat64
11260 case TARGET_NR_lstat64
:
11261 if (!(p
= lock_user_string(arg1
))) {
11262 return -TARGET_EFAULT
;
11264 ret
= get_errno(lstat(path(p
), &st
));
11265 unlock_user(p
, arg1
, 0);
11266 if (!is_error(ret
))
11267 ret
= host_to_target_stat64(cpu_env
, arg2
, &st
);
11270 #ifdef TARGET_NR_fstat64
11271 case TARGET_NR_fstat64
:
11272 ret
= get_errno(fstat(arg1
, &st
));
11273 if (!is_error(ret
))
11274 ret
= host_to_target_stat64(cpu_env
, arg2
, &st
);
11277 #if (defined(TARGET_NR_fstatat64) || defined(TARGET_NR_newfstatat))
11278 #ifdef TARGET_NR_fstatat64
11279 case TARGET_NR_fstatat64
:
11281 #ifdef TARGET_NR_newfstatat
11282 case TARGET_NR_newfstatat
:
11284 if (!(p
= lock_user_string(arg2
))) {
11285 return -TARGET_EFAULT
;
11287 ret
= get_errno(fstatat(arg1
, path(p
), &st
, arg4
));
11288 unlock_user(p
, arg2
, 0);
11289 if (!is_error(ret
))
11290 ret
= host_to_target_stat64(cpu_env
, arg3
, &st
);
11293 #if defined(TARGET_NR_statx)
11294 case TARGET_NR_statx
:
11296 struct target_statx
*target_stx
;
11300 p
= lock_user_string(arg2
);
11302 return -TARGET_EFAULT
;
11304 #if defined(__NR_statx)
11307 * It is assumed that struct statx is architecture independent.
11309 struct target_statx host_stx
;
11312 ret
= get_errno(sys_statx(dirfd
, p
, flags
, mask
, &host_stx
));
11313 if (!is_error(ret
)) {
11314 if (host_to_target_statx(&host_stx
, arg5
) != 0) {
11315 unlock_user(p
, arg2
, 0);
11316 return -TARGET_EFAULT
;
11320 if (ret
!= -TARGET_ENOSYS
) {
11321 unlock_user(p
, arg2
, 0);
11326 ret
= get_errno(fstatat(dirfd
, path(p
), &st
, flags
));
11327 unlock_user(p
, arg2
, 0);
11329 if (!is_error(ret
)) {
11330 if (!lock_user_struct(VERIFY_WRITE
, target_stx
, arg5
, 0)) {
11331 return -TARGET_EFAULT
;
11333 memset(target_stx
, 0, sizeof(*target_stx
));
11334 __put_user(major(st
.st_dev
), &target_stx
->stx_dev_major
);
11335 __put_user(minor(st
.st_dev
), &target_stx
->stx_dev_minor
);
11336 __put_user(st
.st_ino
, &target_stx
->stx_ino
);
11337 __put_user(st
.st_mode
, &target_stx
->stx_mode
);
11338 __put_user(st
.st_uid
, &target_stx
->stx_uid
);
11339 __put_user(st
.st_gid
, &target_stx
->stx_gid
);
11340 __put_user(st
.st_nlink
, &target_stx
->stx_nlink
);
11341 __put_user(major(st
.st_rdev
), &target_stx
->stx_rdev_major
);
11342 __put_user(minor(st
.st_rdev
), &target_stx
->stx_rdev_minor
);
11343 __put_user(st
.st_size
, &target_stx
->stx_size
);
11344 __put_user(st
.st_blksize
, &target_stx
->stx_blksize
);
11345 __put_user(st
.st_blocks
, &target_stx
->stx_blocks
);
11346 __put_user(st
.st_atime
, &target_stx
->stx_atime
.tv_sec
);
11347 __put_user(st
.st_mtime
, &target_stx
->stx_mtime
.tv_sec
);
11348 __put_user(st
.st_ctime
, &target_stx
->stx_ctime
.tv_sec
);
11349 unlock_user_struct(target_stx
, arg5
, 1);
11354 #ifdef TARGET_NR_lchown
11355 case TARGET_NR_lchown
:
11356 if (!(p
= lock_user_string(arg1
)))
11357 return -TARGET_EFAULT
;
11358 ret
= get_errno(lchown(p
, low2highuid(arg2
), low2highgid(arg3
)));
11359 unlock_user(p
, arg1
, 0);
11362 #ifdef TARGET_NR_getuid
11363 case TARGET_NR_getuid
:
11364 return get_errno(high2lowuid(getuid()));
11366 #ifdef TARGET_NR_getgid
11367 case TARGET_NR_getgid
:
11368 return get_errno(high2lowgid(getgid()));
11370 #ifdef TARGET_NR_geteuid
11371 case TARGET_NR_geteuid
:
11372 return get_errno(high2lowuid(geteuid()));
11374 #ifdef TARGET_NR_getegid
11375 case TARGET_NR_getegid
:
11376 return get_errno(high2lowgid(getegid()));
11378 case TARGET_NR_setreuid
:
11379 return get_errno(setreuid(low2highuid(arg1
), low2highuid(arg2
)));
11380 case TARGET_NR_setregid
:
11381 return get_errno(setregid(low2highgid(arg1
), low2highgid(arg2
)));
11382 case TARGET_NR_getgroups
:
11384 int gidsetsize
= arg1
;
11385 target_id
*target_grouplist
;
11389 grouplist
= alloca(gidsetsize
* sizeof(gid_t
));
11390 ret
= get_errno(getgroups(gidsetsize
, grouplist
));
11391 if (gidsetsize
== 0)
11393 if (!is_error(ret
)) {
11394 target_grouplist
= lock_user(VERIFY_WRITE
, arg2
, gidsetsize
* sizeof(target_id
), 0);
11395 if (!target_grouplist
)
11396 return -TARGET_EFAULT
;
11397 for(i
= 0;i
< ret
; i
++)
11398 target_grouplist
[i
] = tswapid(high2lowgid(grouplist
[i
]));
11399 unlock_user(target_grouplist
, arg2
, gidsetsize
* sizeof(target_id
));
11403 case TARGET_NR_setgroups
:
11405 int gidsetsize
= arg1
;
11406 target_id
*target_grouplist
;
11407 gid_t
*grouplist
= NULL
;
11410 grouplist
= alloca(gidsetsize
* sizeof(gid_t
));
11411 target_grouplist
= lock_user(VERIFY_READ
, arg2
, gidsetsize
* sizeof(target_id
), 1);
11412 if (!target_grouplist
) {
11413 return -TARGET_EFAULT
;
11415 for (i
= 0; i
< gidsetsize
; i
++) {
11416 grouplist
[i
] = low2highgid(tswapid(target_grouplist
[i
]));
11418 unlock_user(target_grouplist
, arg2
, 0);
11420 return get_errno(setgroups(gidsetsize
, grouplist
));
11422 case TARGET_NR_fchown
:
11423 return get_errno(fchown(arg1
, low2highuid(arg2
), low2highgid(arg3
)));
11424 #if defined(TARGET_NR_fchownat)
11425 case TARGET_NR_fchownat
:
11426 if (!(p
= lock_user_string(arg2
)))
11427 return -TARGET_EFAULT
;
11428 ret
= get_errno(fchownat(arg1
, p
, low2highuid(arg3
),
11429 low2highgid(arg4
), arg5
));
11430 unlock_user(p
, arg2
, 0);
11433 #ifdef TARGET_NR_setresuid
11434 case TARGET_NR_setresuid
:
11435 return get_errno(sys_setresuid(low2highuid(arg1
),
11437 low2highuid(arg3
)));
11439 #ifdef TARGET_NR_getresuid
11440 case TARGET_NR_getresuid
:
11442 uid_t ruid
, euid
, suid
;
11443 ret
= get_errno(getresuid(&ruid
, &euid
, &suid
));
11444 if (!is_error(ret
)) {
11445 if (put_user_id(high2lowuid(ruid
), arg1
)
11446 || put_user_id(high2lowuid(euid
), arg2
)
11447 || put_user_id(high2lowuid(suid
), arg3
))
11448 return -TARGET_EFAULT
;
11453 #ifdef TARGET_NR_getresgid
11454 case TARGET_NR_setresgid
:
11455 return get_errno(sys_setresgid(low2highgid(arg1
),
11457 low2highgid(arg3
)));
11459 #ifdef TARGET_NR_getresgid
11460 case TARGET_NR_getresgid
:
11462 gid_t rgid
, egid
, sgid
;
11463 ret
= get_errno(getresgid(&rgid
, &egid
, &sgid
));
11464 if (!is_error(ret
)) {
11465 if (put_user_id(high2lowgid(rgid
), arg1
)
11466 || put_user_id(high2lowgid(egid
), arg2
)
11467 || put_user_id(high2lowgid(sgid
), arg3
))
11468 return -TARGET_EFAULT
;
11473 #ifdef TARGET_NR_chown
11474 case TARGET_NR_chown
:
11475 if (!(p
= lock_user_string(arg1
)))
11476 return -TARGET_EFAULT
;
11477 ret
= get_errno(chown(p
, low2highuid(arg2
), low2highgid(arg3
)));
11478 unlock_user(p
, arg1
, 0);
11481 case TARGET_NR_setuid
:
11482 return get_errno(sys_setuid(low2highuid(arg1
)));
11483 case TARGET_NR_setgid
:
11484 return get_errno(sys_setgid(low2highgid(arg1
)));
11485 case TARGET_NR_setfsuid
:
11486 return get_errno(setfsuid(arg1
));
11487 case TARGET_NR_setfsgid
:
11488 return get_errno(setfsgid(arg1
));
11490 #ifdef TARGET_NR_lchown32
11491 case TARGET_NR_lchown32
:
11492 if (!(p
= lock_user_string(arg1
)))
11493 return -TARGET_EFAULT
;
11494 ret
= get_errno(lchown(p
, arg2
, arg3
));
11495 unlock_user(p
, arg1
, 0);
11498 #ifdef TARGET_NR_getuid32
11499 case TARGET_NR_getuid32
:
11500 return get_errno(getuid());
11503 #if defined(TARGET_NR_getxuid) && defined(TARGET_ALPHA)
11504 /* Alpha specific */
11505 case TARGET_NR_getxuid
:
11509 ((CPUAlphaState
*)cpu_env
)->ir
[IR_A4
]=euid
;
11511 return get_errno(getuid());
11513 #if defined(TARGET_NR_getxgid) && defined(TARGET_ALPHA)
11514 /* Alpha specific */
11515 case TARGET_NR_getxgid
:
11519 ((CPUAlphaState
*)cpu_env
)->ir
[IR_A4
]=egid
;
11521 return get_errno(getgid());
11523 #if defined(TARGET_NR_osf_getsysinfo) && defined(TARGET_ALPHA)
11524 /* Alpha specific */
11525 case TARGET_NR_osf_getsysinfo
:
11526 ret
= -TARGET_EOPNOTSUPP
;
11528 case TARGET_GSI_IEEE_FP_CONTROL
:
11530 uint64_t fpcr
= cpu_alpha_load_fpcr(cpu_env
);
11531 uint64_t swcr
= ((CPUAlphaState
*)cpu_env
)->swcr
;
11533 swcr
&= ~SWCR_STATUS_MASK
;
11534 swcr
|= (fpcr
>> 35) & SWCR_STATUS_MASK
;
11536 if (put_user_u64 (swcr
, arg2
))
11537 return -TARGET_EFAULT
;
11542 /* case GSI_IEEE_STATE_AT_SIGNAL:
11543 -- Not implemented in linux kernel.
11545 -- Retrieves current unaligned access state; not much used.
11546 case GSI_PROC_TYPE:
11547 -- Retrieves implver information; surely not used.
11548 case GSI_GET_HWRPB:
11549 -- Grabs a copy of the HWRPB; surely not used.
11554 #if defined(TARGET_NR_osf_setsysinfo) && defined(TARGET_ALPHA)
11555 /* Alpha specific */
11556 case TARGET_NR_osf_setsysinfo
:
11557 ret
= -TARGET_EOPNOTSUPP
;
11559 case TARGET_SSI_IEEE_FP_CONTROL
:
11561 uint64_t swcr
, fpcr
;
11563 if (get_user_u64 (swcr
, arg2
)) {
11564 return -TARGET_EFAULT
;
11568 * The kernel calls swcr_update_status to update the
11569 * status bits from the fpcr at every point that it
11570 * could be queried. Therefore, we store the status
11571 * bits only in FPCR.
11573 ((CPUAlphaState
*)cpu_env
)->swcr
11574 = swcr
& (SWCR_TRAP_ENABLE_MASK
| SWCR_MAP_MASK
);
11576 fpcr
= cpu_alpha_load_fpcr(cpu_env
);
11577 fpcr
&= ((uint64_t)FPCR_DYN_MASK
<< 32);
11578 fpcr
|= alpha_ieee_swcr_to_fpcr(swcr
);
11579 cpu_alpha_store_fpcr(cpu_env
, fpcr
);
11584 case TARGET_SSI_IEEE_RAISE_EXCEPTION
:
11586 uint64_t exc
, fpcr
, fex
;
11588 if (get_user_u64(exc
, arg2
)) {
11589 return -TARGET_EFAULT
;
11591 exc
&= SWCR_STATUS_MASK
;
11592 fpcr
= cpu_alpha_load_fpcr(cpu_env
);
11594 /* Old exceptions are not signaled. */
11595 fex
= alpha_ieee_fpcr_to_swcr(fpcr
);
11597 fex
>>= SWCR_STATUS_TO_EXCSUM_SHIFT
;
11598 fex
&= ((CPUArchState
*)cpu_env
)->swcr
;
11600 /* Update the hardware fpcr. */
11601 fpcr
|= alpha_ieee_swcr_to_fpcr(exc
);
11602 cpu_alpha_store_fpcr(cpu_env
, fpcr
);
11605 int si_code
= TARGET_FPE_FLTUNK
;
11606 target_siginfo_t info
;
11608 if (fex
& SWCR_TRAP_ENABLE_DNO
) {
11609 si_code
= TARGET_FPE_FLTUND
;
11611 if (fex
& SWCR_TRAP_ENABLE_INE
) {
11612 si_code
= TARGET_FPE_FLTRES
;
11614 if (fex
& SWCR_TRAP_ENABLE_UNF
) {
11615 si_code
= TARGET_FPE_FLTUND
;
11617 if (fex
& SWCR_TRAP_ENABLE_OVF
) {
11618 si_code
= TARGET_FPE_FLTOVF
;
11620 if (fex
& SWCR_TRAP_ENABLE_DZE
) {
11621 si_code
= TARGET_FPE_FLTDIV
;
11623 if (fex
& SWCR_TRAP_ENABLE_INV
) {
11624 si_code
= TARGET_FPE_FLTINV
;
11627 info
.si_signo
= SIGFPE
;
11629 info
.si_code
= si_code
;
11630 info
._sifields
._sigfault
._addr
11631 = ((CPUArchState
*)cpu_env
)->pc
;
11632 queue_signal((CPUArchState
*)cpu_env
, info
.si_signo
,
11633 QEMU_SI_FAULT
, &info
);
11639 /* case SSI_NVPAIRS:
11640 -- Used with SSIN_UACPROC to enable unaligned accesses.
11641 case SSI_IEEE_STATE_AT_SIGNAL:
11642 case SSI_IEEE_IGNORE_STATE_AT_SIGNAL:
11643 -- Not implemented in linux kernel
11648 #ifdef TARGET_NR_osf_sigprocmask
11649 /* Alpha specific. */
11650 case TARGET_NR_osf_sigprocmask
:
11654 sigset_t set
, oldset
;
11657 case TARGET_SIG_BLOCK
:
11660 case TARGET_SIG_UNBLOCK
:
11663 case TARGET_SIG_SETMASK
:
11667 return -TARGET_EINVAL
;
11670 target_to_host_old_sigset(&set
, &mask
);
11671 ret
= do_sigprocmask(how
, &set
, &oldset
);
11673 host_to_target_old_sigset(&mask
, &oldset
);
11680 #ifdef TARGET_NR_getgid32
11681 case TARGET_NR_getgid32
:
11682 return get_errno(getgid());
11684 #ifdef TARGET_NR_geteuid32
11685 case TARGET_NR_geteuid32
:
11686 return get_errno(geteuid());
11688 #ifdef TARGET_NR_getegid32
11689 case TARGET_NR_getegid32
:
11690 return get_errno(getegid());
11692 #ifdef TARGET_NR_setreuid32
11693 case TARGET_NR_setreuid32
:
11694 return get_errno(setreuid(arg1
, arg2
));
11696 #ifdef TARGET_NR_setregid32
11697 case TARGET_NR_setregid32
:
11698 return get_errno(setregid(arg1
, arg2
));
11700 #ifdef TARGET_NR_getgroups32
11701 case TARGET_NR_getgroups32
:
11703 int gidsetsize
= arg1
;
11704 uint32_t *target_grouplist
;
11708 grouplist
= alloca(gidsetsize
* sizeof(gid_t
));
11709 ret
= get_errno(getgroups(gidsetsize
, grouplist
));
11710 if (gidsetsize
== 0)
11712 if (!is_error(ret
)) {
11713 target_grouplist
= lock_user(VERIFY_WRITE
, arg2
, gidsetsize
* 4, 0);
11714 if (!target_grouplist
) {
11715 return -TARGET_EFAULT
;
11717 for(i
= 0;i
< ret
; i
++)
11718 target_grouplist
[i
] = tswap32(grouplist
[i
]);
11719 unlock_user(target_grouplist
, arg2
, gidsetsize
* 4);
11724 #ifdef TARGET_NR_setgroups32
11725 case TARGET_NR_setgroups32
:
11727 int gidsetsize
= arg1
;
11728 uint32_t *target_grouplist
;
11732 grouplist
= alloca(gidsetsize
* sizeof(gid_t
));
11733 target_grouplist
= lock_user(VERIFY_READ
, arg2
, gidsetsize
* 4, 1);
11734 if (!target_grouplist
) {
11735 return -TARGET_EFAULT
;
11737 for(i
= 0;i
< gidsetsize
; i
++)
11738 grouplist
[i
] = tswap32(target_grouplist
[i
]);
11739 unlock_user(target_grouplist
, arg2
, 0);
11740 return get_errno(setgroups(gidsetsize
, grouplist
));
11743 #ifdef TARGET_NR_fchown32
11744 case TARGET_NR_fchown32
:
11745 return get_errno(fchown(arg1
, arg2
, arg3
));
11747 #ifdef TARGET_NR_setresuid32
11748 case TARGET_NR_setresuid32
:
11749 return get_errno(sys_setresuid(arg1
, arg2
, arg3
));
11751 #ifdef TARGET_NR_getresuid32
11752 case TARGET_NR_getresuid32
:
11754 uid_t ruid
, euid
, suid
;
11755 ret
= get_errno(getresuid(&ruid
, &euid
, &suid
));
11756 if (!is_error(ret
)) {
11757 if (put_user_u32(ruid
, arg1
)
11758 || put_user_u32(euid
, arg2
)
11759 || put_user_u32(suid
, arg3
))
11760 return -TARGET_EFAULT
;
11765 #ifdef TARGET_NR_setresgid32
11766 case TARGET_NR_setresgid32
:
11767 return get_errno(sys_setresgid(arg1
, arg2
, arg3
));
11769 #ifdef TARGET_NR_getresgid32
11770 case TARGET_NR_getresgid32
:
11772 gid_t rgid
, egid
, sgid
;
11773 ret
= get_errno(getresgid(&rgid
, &egid
, &sgid
));
11774 if (!is_error(ret
)) {
11775 if (put_user_u32(rgid
, arg1
)
11776 || put_user_u32(egid
, arg2
)
11777 || put_user_u32(sgid
, arg3
))
11778 return -TARGET_EFAULT
;
11783 #ifdef TARGET_NR_chown32
11784 case TARGET_NR_chown32
:
11785 if (!(p
= lock_user_string(arg1
)))
11786 return -TARGET_EFAULT
;
11787 ret
= get_errno(chown(p
, arg2
, arg3
));
11788 unlock_user(p
, arg1
, 0);
11791 #ifdef TARGET_NR_setuid32
11792 case TARGET_NR_setuid32
:
11793 return get_errno(sys_setuid(arg1
));
11795 #ifdef TARGET_NR_setgid32
11796 case TARGET_NR_setgid32
:
11797 return get_errno(sys_setgid(arg1
));
11799 #ifdef TARGET_NR_setfsuid32
11800 case TARGET_NR_setfsuid32
:
11801 return get_errno(setfsuid(arg1
));
11803 #ifdef TARGET_NR_setfsgid32
11804 case TARGET_NR_setfsgid32
:
11805 return get_errno(setfsgid(arg1
));
11807 #ifdef TARGET_NR_mincore
11808 case TARGET_NR_mincore
:
11810 void *a
= lock_user(VERIFY_READ
, arg1
, arg2
, 0);
11812 return -TARGET_ENOMEM
;
11814 p
= lock_user_string(arg3
);
11816 ret
= -TARGET_EFAULT
;
11818 ret
= get_errno(mincore(a
, arg2
, p
));
11819 unlock_user(p
, arg3
, ret
);
11821 unlock_user(a
, arg1
, 0);
11825 #ifdef TARGET_NR_arm_fadvise64_64
11826 case TARGET_NR_arm_fadvise64_64
:
11827 /* arm_fadvise64_64 looks like fadvise64_64 but
11828 * with different argument order: fd, advice, offset, len
11829 * rather than the usual fd, offset, len, advice.
11830 * Note that offset and len are both 64-bit so appear as
11831 * pairs of 32-bit registers.
11833 ret
= posix_fadvise(arg1
, target_offset64(arg3
, arg4
),
11834 target_offset64(arg5
, arg6
), arg2
);
11835 return -host_to_target_errno(ret
);
11838 #if TARGET_ABI_BITS == 32
11840 #ifdef TARGET_NR_fadvise64_64
11841 case TARGET_NR_fadvise64_64
:
11842 #if defined(TARGET_PPC) || defined(TARGET_XTENSA)
11843 /* 6 args: fd, advice, offset (high, low), len (high, low) */
11851 /* 6 args: fd, offset (high, low), len (high, low), advice */
11852 if (regpairs_aligned(cpu_env
, num
)) {
11853 /* offset is in (3,4), len in (5,6) and advice in 7 */
11861 ret
= posix_fadvise(arg1
, target_offset64(arg2
, arg3
),
11862 target_offset64(arg4
, arg5
), arg6
);
11863 return -host_to_target_errno(ret
);
11866 #ifdef TARGET_NR_fadvise64
11867 case TARGET_NR_fadvise64
:
11868 /* 5 args: fd, offset (high, low), len, advice */
11869 if (regpairs_aligned(cpu_env
, num
)) {
11870 /* offset is in (3,4), len in 5 and advice in 6 */
11876 ret
= posix_fadvise(arg1
, target_offset64(arg2
, arg3
), arg4
, arg5
);
11877 return -host_to_target_errno(ret
);
11880 #else /* not a 32-bit ABI */
11881 #if defined(TARGET_NR_fadvise64_64) || defined(TARGET_NR_fadvise64)
11882 #ifdef TARGET_NR_fadvise64_64
11883 case TARGET_NR_fadvise64_64
:
11885 #ifdef TARGET_NR_fadvise64
11886 case TARGET_NR_fadvise64
:
11888 #ifdef TARGET_S390X
11890 case 4: arg4
= POSIX_FADV_NOREUSE
+ 1; break; /* make sure it's an invalid value */
11891 case 5: arg4
= POSIX_FADV_NOREUSE
+ 2; break; /* ditto */
11892 case 6: arg4
= POSIX_FADV_DONTNEED
; break;
11893 case 7: arg4
= POSIX_FADV_NOREUSE
; break;
11897 return -host_to_target_errno(posix_fadvise(arg1
, arg2
, arg3
, arg4
));
11899 #endif /* end of 64-bit ABI fadvise handling */
11901 #ifdef TARGET_NR_madvise
11902 case TARGET_NR_madvise
:
11903 /* A straight passthrough may not be safe because qemu sometimes
11904 turns private file-backed mappings into anonymous mappings.
11905 This will break MADV_DONTNEED.
11906 This is a hint, so ignoring and returning success is ok. */
11909 #ifdef TARGET_NR_fcntl64
11910 case TARGET_NR_fcntl64
:
11914 from_flock64_fn
*copyfrom
= copy_from_user_flock64
;
11915 to_flock64_fn
*copyto
= copy_to_user_flock64
;
11918 if (!((CPUARMState
*)cpu_env
)->eabi
) {
11919 copyfrom
= copy_from_user_oabi_flock64
;
11920 copyto
= copy_to_user_oabi_flock64
;
11924 cmd
= target_to_host_fcntl_cmd(arg2
);
11925 if (cmd
== -TARGET_EINVAL
) {
11930 case TARGET_F_GETLK64
:
11931 ret
= copyfrom(&fl
, arg3
);
11935 ret
= get_errno(safe_fcntl(arg1
, cmd
, &fl
));
11937 ret
= copyto(arg3
, &fl
);
11941 case TARGET_F_SETLK64
:
11942 case TARGET_F_SETLKW64
:
11943 ret
= copyfrom(&fl
, arg3
);
11947 ret
= get_errno(safe_fcntl(arg1
, cmd
, &fl
));
11950 ret
= do_fcntl(arg1
, arg2
, arg3
);
11956 #ifdef TARGET_NR_cacheflush
11957 case TARGET_NR_cacheflush
:
11958 /* self-modifying code is handled automatically, so nothing needed */
11961 #ifdef TARGET_NR_getpagesize
11962 case TARGET_NR_getpagesize
:
11963 return TARGET_PAGE_SIZE
;
11965 case TARGET_NR_gettid
:
11966 return get_errno(sys_gettid());
11967 #ifdef TARGET_NR_readahead
11968 case TARGET_NR_readahead
:
11969 #if TARGET_ABI_BITS == 32
11970 if (regpairs_aligned(cpu_env
, num
)) {
11975 ret
= get_errno(readahead(arg1
, target_offset64(arg2
, arg3
) , arg4
));
11977 ret
= get_errno(readahead(arg1
, arg2
, arg3
));
11982 #ifdef TARGET_NR_setxattr
11983 case TARGET_NR_listxattr
:
11984 case TARGET_NR_llistxattr
:
11988 b
= lock_user(VERIFY_WRITE
, arg2
, arg3
, 0);
11990 return -TARGET_EFAULT
;
11993 p
= lock_user_string(arg1
);
11995 if (num
== TARGET_NR_listxattr
) {
11996 ret
= get_errno(listxattr(p
, b
, arg3
));
11998 ret
= get_errno(llistxattr(p
, b
, arg3
));
12001 ret
= -TARGET_EFAULT
;
12003 unlock_user(p
, arg1
, 0);
12004 unlock_user(b
, arg2
, arg3
);
12007 case TARGET_NR_flistxattr
:
12011 b
= lock_user(VERIFY_WRITE
, arg2
, arg3
, 0);
12013 return -TARGET_EFAULT
;
12016 ret
= get_errno(flistxattr(arg1
, b
, arg3
));
12017 unlock_user(b
, arg2
, arg3
);
12020 case TARGET_NR_setxattr
:
12021 case TARGET_NR_lsetxattr
:
12023 void *p
, *n
, *v
= 0;
12025 v
= lock_user(VERIFY_READ
, arg3
, arg4
, 1);
12027 return -TARGET_EFAULT
;
12030 p
= lock_user_string(arg1
);
12031 n
= lock_user_string(arg2
);
12033 if (num
== TARGET_NR_setxattr
) {
12034 ret
= get_errno(setxattr(p
, n
, v
, arg4
, arg5
));
12036 ret
= get_errno(lsetxattr(p
, n
, v
, arg4
, arg5
));
12039 ret
= -TARGET_EFAULT
;
12041 unlock_user(p
, arg1
, 0);
12042 unlock_user(n
, arg2
, 0);
12043 unlock_user(v
, arg3
, 0);
12046 case TARGET_NR_fsetxattr
:
12050 v
= lock_user(VERIFY_READ
, arg3
, arg4
, 1);
12052 return -TARGET_EFAULT
;
12055 n
= lock_user_string(arg2
);
12057 ret
= get_errno(fsetxattr(arg1
, n
, v
, arg4
, arg5
));
12059 ret
= -TARGET_EFAULT
;
12061 unlock_user(n
, arg2
, 0);
12062 unlock_user(v
, arg3
, 0);
12065 case TARGET_NR_getxattr
:
12066 case TARGET_NR_lgetxattr
:
12068 void *p
, *n
, *v
= 0;
12070 v
= lock_user(VERIFY_WRITE
, arg3
, arg4
, 0);
12072 return -TARGET_EFAULT
;
12075 p
= lock_user_string(arg1
);
12076 n
= lock_user_string(arg2
);
12078 if (num
== TARGET_NR_getxattr
) {
12079 ret
= get_errno(getxattr(p
, n
, v
, arg4
));
12081 ret
= get_errno(lgetxattr(p
, n
, v
, arg4
));
12084 ret
= -TARGET_EFAULT
;
12086 unlock_user(p
, arg1
, 0);
12087 unlock_user(n
, arg2
, 0);
12088 unlock_user(v
, arg3
, arg4
);
12091 case TARGET_NR_fgetxattr
:
12095 v
= lock_user(VERIFY_WRITE
, arg3
, arg4
, 0);
12097 return -TARGET_EFAULT
;
12100 n
= lock_user_string(arg2
);
12102 ret
= get_errno(fgetxattr(arg1
, n
, v
, arg4
));
12104 ret
= -TARGET_EFAULT
;
12106 unlock_user(n
, arg2
, 0);
12107 unlock_user(v
, arg3
, arg4
);
12110 case TARGET_NR_removexattr
:
12111 case TARGET_NR_lremovexattr
:
12114 p
= lock_user_string(arg1
);
12115 n
= lock_user_string(arg2
);
12117 if (num
== TARGET_NR_removexattr
) {
12118 ret
= get_errno(removexattr(p
, n
));
12120 ret
= get_errno(lremovexattr(p
, n
));
12123 ret
= -TARGET_EFAULT
;
12125 unlock_user(p
, arg1
, 0);
12126 unlock_user(n
, arg2
, 0);
12129 case TARGET_NR_fremovexattr
:
12132 n
= lock_user_string(arg2
);
12134 ret
= get_errno(fremovexattr(arg1
, n
));
12136 ret
= -TARGET_EFAULT
;
12138 unlock_user(n
, arg2
, 0);
12142 #endif /* CONFIG_ATTR */
12143 #ifdef TARGET_NR_set_thread_area
12144 case TARGET_NR_set_thread_area
:
12145 #if defined(TARGET_MIPS)
12146 ((CPUMIPSState
*) cpu_env
)->active_tc
.CP0_UserLocal
= arg1
;
12148 #elif defined(TARGET_CRIS)
12150 ret
= -TARGET_EINVAL
;
12152 ((CPUCRISState
*) cpu_env
)->pregs
[PR_PID
] = arg1
;
12156 #elif defined(TARGET_I386) && defined(TARGET_ABI32)
12157 return do_set_thread_area(cpu_env
, arg1
);
12158 #elif defined(TARGET_M68K)
12160 TaskState
*ts
= cpu
->opaque
;
12161 ts
->tp_value
= arg1
;
12165 return -TARGET_ENOSYS
;
12168 #ifdef TARGET_NR_get_thread_area
12169 case TARGET_NR_get_thread_area
:
12170 #if defined(TARGET_I386) && defined(TARGET_ABI32)
12171 return do_get_thread_area(cpu_env
, arg1
);
12172 #elif defined(TARGET_M68K)
12174 TaskState
*ts
= cpu
->opaque
;
12175 return ts
->tp_value
;
12178 return -TARGET_ENOSYS
;
12181 #ifdef TARGET_NR_getdomainname
12182 case TARGET_NR_getdomainname
:
12183 return -TARGET_ENOSYS
;
12186 #ifdef TARGET_NR_clock_settime
12187 case TARGET_NR_clock_settime
:
12189 struct timespec ts
;
12191 ret
= target_to_host_timespec(&ts
, arg2
);
12192 if (!is_error(ret
)) {
12193 ret
= get_errno(clock_settime(arg1
, &ts
));
12198 #ifdef TARGET_NR_clock_settime64
12199 case TARGET_NR_clock_settime64
:
12201 struct timespec ts
;
12203 ret
= target_to_host_timespec64(&ts
, arg2
);
12204 if (!is_error(ret
)) {
12205 ret
= get_errno(clock_settime(arg1
, &ts
));
12210 #ifdef TARGET_NR_clock_gettime
12211 case TARGET_NR_clock_gettime
:
12213 struct timespec ts
;
12214 ret
= get_errno(clock_gettime(arg1
, &ts
));
12215 if (!is_error(ret
)) {
12216 ret
= host_to_target_timespec(arg2
, &ts
);
12221 #ifdef TARGET_NR_clock_gettime64
12222 case TARGET_NR_clock_gettime64
:
12224 struct timespec ts
;
12225 ret
= get_errno(clock_gettime(arg1
, &ts
));
12226 if (!is_error(ret
)) {
12227 ret
= host_to_target_timespec64(arg2
, &ts
);
12232 #ifdef TARGET_NR_clock_getres
12233 case TARGET_NR_clock_getres
:
12235 struct timespec ts
;
12236 ret
= get_errno(clock_getres(arg1
, &ts
));
12237 if (!is_error(ret
)) {
12238 host_to_target_timespec(arg2
, &ts
);
12243 #ifdef TARGET_NR_clock_getres_time64
12244 case TARGET_NR_clock_getres_time64
:
12246 struct timespec ts
;
12247 ret
= get_errno(clock_getres(arg1
, &ts
));
12248 if (!is_error(ret
)) {
12249 host_to_target_timespec64(arg2
, &ts
);
12254 #ifdef TARGET_NR_clock_nanosleep
12255 case TARGET_NR_clock_nanosleep
:
12257 struct timespec ts
;
12258 if (target_to_host_timespec(&ts
, arg3
)) {
12259 return -TARGET_EFAULT
;
12261 ret
= get_errno(safe_clock_nanosleep(arg1
, arg2
,
12262 &ts
, arg4
? &ts
: NULL
));
12264 * if the call is interrupted by a signal handler, it fails
12265 * with error -TARGET_EINTR and if arg4 is not NULL and arg2 is not
12266 * TIMER_ABSTIME, it returns the remaining unslept time in arg4.
12268 if (ret
== -TARGET_EINTR
&& arg4
&& arg2
!= TIMER_ABSTIME
&&
12269 host_to_target_timespec(arg4
, &ts
)) {
12270 return -TARGET_EFAULT
;
12276 #ifdef TARGET_NR_clock_nanosleep_time64
12277 case TARGET_NR_clock_nanosleep_time64
:
12279 struct timespec ts
;
12281 if (target_to_host_timespec64(&ts
, arg3
)) {
12282 return -TARGET_EFAULT
;
12285 ret
= get_errno(safe_clock_nanosleep(arg1
, arg2
,
12286 &ts
, arg4
? &ts
: NULL
));
12288 if (ret
== -TARGET_EINTR
&& arg4
&& arg2
!= TIMER_ABSTIME
&&
12289 host_to_target_timespec64(arg4
, &ts
)) {
12290 return -TARGET_EFAULT
;
12296 #if defined(TARGET_NR_set_tid_address) && defined(__NR_set_tid_address)
12297 case TARGET_NR_set_tid_address
:
12298 return get_errno(set_tid_address((int *)g2h(cpu
, arg1
)));
12301 case TARGET_NR_tkill
:
12302 return get_errno(safe_tkill((int)arg1
, target_to_host_signal(arg2
)));
12304 case TARGET_NR_tgkill
:
12305 return get_errno(safe_tgkill((int)arg1
, (int)arg2
,
12306 target_to_host_signal(arg3
)));
12308 #ifdef TARGET_NR_set_robust_list
12309 case TARGET_NR_set_robust_list
:
12310 case TARGET_NR_get_robust_list
:
12311 /* The ABI for supporting robust futexes has userspace pass
12312 * the kernel a pointer to a linked list which is updated by
12313 * userspace after the syscall; the list is walked by the kernel
12314 * when the thread exits. Since the linked list in QEMU guest
12315 * memory isn't a valid linked list for the host and we have
12316 * no way to reliably intercept the thread-death event, we can't
12317 * support these. Silently return ENOSYS so that guest userspace
12318 * falls back to a non-robust futex implementation (which should
12319 * be OK except in the corner case of the guest crashing while
12320 * holding a mutex that is shared with another process via
12323 return -TARGET_ENOSYS
;
12326 #if defined(TARGET_NR_utimensat)
12327 case TARGET_NR_utimensat
:
12329 struct timespec
*tsp
, ts
[2];
12333 if (target_to_host_timespec(ts
, arg3
)) {
12334 return -TARGET_EFAULT
;
12336 if (target_to_host_timespec(ts
+ 1, arg3
+
12337 sizeof(struct target_timespec
))) {
12338 return -TARGET_EFAULT
;
12343 ret
= get_errno(sys_utimensat(arg1
, NULL
, tsp
, arg4
));
12345 if (!(p
= lock_user_string(arg2
))) {
12346 return -TARGET_EFAULT
;
12348 ret
= get_errno(sys_utimensat(arg1
, path(p
), tsp
, arg4
));
12349 unlock_user(p
, arg2
, 0);
12354 #ifdef TARGET_NR_utimensat_time64
12355 case TARGET_NR_utimensat_time64
:
12357 struct timespec
*tsp
, ts
[2];
12361 if (target_to_host_timespec64(ts
, arg3
)) {
12362 return -TARGET_EFAULT
;
12364 if (target_to_host_timespec64(ts
+ 1, arg3
+
12365 sizeof(struct target__kernel_timespec
))) {
12366 return -TARGET_EFAULT
;
12371 ret
= get_errno(sys_utimensat(arg1
, NULL
, tsp
, arg4
));
12373 p
= lock_user_string(arg2
);
12375 return -TARGET_EFAULT
;
12377 ret
= get_errno(sys_utimensat(arg1
, path(p
), tsp
, arg4
));
12378 unlock_user(p
, arg2
, 0);
12383 #ifdef TARGET_NR_futex
12384 case TARGET_NR_futex
:
12385 return do_futex(cpu
, arg1
, arg2
, arg3
, arg4
, arg5
, arg6
);
12387 #ifdef TARGET_NR_futex_time64
12388 case TARGET_NR_futex_time64
:
12389 return do_futex_time64(cpu
, arg1
, arg2
, arg3
, arg4
, arg5
, arg6
);
12391 #if defined(TARGET_NR_inotify_init) && defined(__NR_inotify_init)
12392 case TARGET_NR_inotify_init
:
12393 ret
= get_errno(sys_inotify_init());
12395 fd_trans_register(ret
, &target_inotify_trans
);
12399 #ifdef CONFIG_INOTIFY1
12400 #if defined(TARGET_NR_inotify_init1) && defined(__NR_inotify_init1)
12401 case TARGET_NR_inotify_init1
:
12402 ret
= get_errno(sys_inotify_init1(target_to_host_bitmask(arg1
,
12403 fcntl_flags_tbl
)));
12405 fd_trans_register(ret
, &target_inotify_trans
);
12410 #if defined(TARGET_NR_inotify_add_watch) && defined(__NR_inotify_add_watch)
12411 case TARGET_NR_inotify_add_watch
:
12412 p
= lock_user_string(arg2
);
12413 ret
= get_errno(sys_inotify_add_watch(arg1
, path(p
), arg3
));
12414 unlock_user(p
, arg2
, 0);
12417 #if defined(TARGET_NR_inotify_rm_watch) && defined(__NR_inotify_rm_watch)
12418 case TARGET_NR_inotify_rm_watch
:
12419 return get_errno(sys_inotify_rm_watch(arg1
, arg2
));
12422 #if defined(TARGET_NR_mq_open) && defined(__NR_mq_open)
12423 case TARGET_NR_mq_open
:
12425 struct mq_attr posix_mq_attr
;
12426 struct mq_attr
*pposix_mq_attr
;
12429 host_flags
= target_to_host_bitmask(arg2
, fcntl_flags_tbl
);
12430 pposix_mq_attr
= NULL
;
12432 if (copy_from_user_mq_attr(&posix_mq_attr
, arg4
) != 0) {
12433 return -TARGET_EFAULT
;
12435 pposix_mq_attr
= &posix_mq_attr
;
12437 p
= lock_user_string(arg1
- 1);
12439 return -TARGET_EFAULT
;
12441 ret
= get_errno(mq_open(p
, host_flags
, arg3
, pposix_mq_attr
));
12442 unlock_user (p
, arg1
, 0);
12446 case TARGET_NR_mq_unlink
:
12447 p
= lock_user_string(arg1
- 1);
12449 return -TARGET_EFAULT
;
12451 ret
= get_errno(mq_unlink(p
));
12452 unlock_user (p
, arg1
, 0);
12455 #ifdef TARGET_NR_mq_timedsend
12456 case TARGET_NR_mq_timedsend
:
12458 struct timespec ts
;
12460 p
= lock_user (VERIFY_READ
, arg2
, arg3
, 1);
12462 if (target_to_host_timespec(&ts
, arg5
)) {
12463 return -TARGET_EFAULT
;
12465 ret
= get_errno(safe_mq_timedsend(arg1
, p
, arg3
, arg4
, &ts
));
12466 if (!is_error(ret
) && host_to_target_timespec(arg5
, &ts
)) {
12467 return -TARGET_EFAULT
;
12470 ret
= get_errno(safe_mq_timedsend(arg1
, p
, arg3
, arg4
, NULL
));
12472 unlock_user (p
, arg2
, arg3
);
12476 #ifdef TARGET_NR_mq_timedsend_time64
12477 case TARGET_NR_mq_timedsend_time64
:
12479 struct timespec ts
;
12481 p
= lock_user(VERIFY_READ
, arg2
, arg3
, 1);
12483 if (target_to_host_timespec64(&ts
, arg5
)) {
12484 return -TARGET_EFAULT
;
12486 ret
= get_errno(safe_mq_timedsend(arg1
, p
, arg3
, arg4
, &ts
));
12487 if (!is_error(ret
) && host_to_target_timespec64(arg5
, &ts
)) {
12488 return -TARGET_EFAULT
;
12491 ret
= get_errno(safe_mq_timedsend(arg1
, p
, arg3
, arg4
, NULL
));
12493 unlock_user(p
, arg2
, arg3
);
12498 #ifdef TARGET_NR_mq_timedreceive
12499 case TARGET_NR_mq_timedreceive
:
12501 struct timespec ts
;
12504 p
= lock_user (VERIFY_READ
, arg2
, arg3
, 1);
12506 if (target_to_host_timespec(&ts
, arg5
)) {
12507 return -TARGET_EFAULT
;
12509 ret
= get_errno(safe_mq_timedreceive(arg1
, p
, arg3
,
12511 if (!is_error(ret
) && host_to_target_timespec(arg5
, &ts
)) {
12512 return -TARGET_EFAULT
;
12515 ret
= get_errno(safe_mq_timedreceive(arg1
, p
, arg3
,
12518 unlock_user (p
, arg2
, arg3
);
12520 put_user_u32(prio
, arg4
);
12524 #ifdef TARGET_NR_mq_timedreceive_time64
12525 case TARGET_NR_mq_timedreceive_time64
:
12527 struct timespec ts
;
12530 p
= lock_user(VERIFY_READ
, arg2
, arg3
, 1);
12532 if (target_to_host_timespec64(&ts
, arg5
)) {
12533 return -TARGET_EFAULT
;
12535 ret
= get_errno(safe_mq_timedreceive(arg1
, p
, arg3
,
12537 if (!is_error(ret
) && host_to_target_timespec64(arg5
, &ts
)) {
12538 return -TARGET_EFAULT
;
12541 ret
= get_errno(safe_mq_timedreceive(arg1
, p
, arg3
,
12544 unlock_user(p
, arg2
, arg3
);
12546 put_user_u32(prio
, arg4
);
12552 /* Not implemented for now... */
12553 /* case TARGET_NR_mq_notify: */
12556 case TARGET_NR_mq_getsetattr
:
12558 struct mq_attr posix_mq_attr_in
, posix_mq_attr_out
;
12561 copy_from_user_mq_attr(&posix_mq_attr_in
, arg2
);
12562 ret
= get_errno(mq_setattr(arg1
, &posix_mq_attr_in
,
12563 &posix_mq_attr_out
));
12564 } else if (arg3
!= 0) {
12565 ret
= get_errno(mq_getattr(arg1
, &posix_mq_attr_out
));
12567 if (ret
== 0 && arg3
!= 0) {
12568 copy_to_user_mq_attr(arg3
, &posix_mq_attr_out
);
12574 #ifdef CONFIG_SPLICE
12575 #ifdef TARGET_NR_tee
12576 case TARGET_NR_tee
:
12578 ret
= get_errno(tee(arg1
,arg2
,arg3
,arg4
));
12582 #ifdef TARGET_NR_splice
12583 case TARGET_NR_splice
:
12585 loff_t loff_in
, loff_out
;
12586 loff_t
*ploff_in
= NULL
, *ploff_out
= NULL
;
12588 if (get_user_u64(loff_in
, arg2
)) {
12589 return -TARGET_EFAULT
;
12591 ploff_in
= &loff_in
;
12594 if (get_user_u64(loff_out
, arg4
)) {
12595 return -TARGET_EFAULT
;
12597 ploff_out
= &loff_out
;
12599 ret
= get_errno(splice(arg1
, ploff_in
, arg3
, ploff_out
, arg5
, arg6
));
12601 if (put_user_u64(loff_in
, arg2
)) {
12602 return -TARGET_EFAULT
;
12606 if (put_user_u64(loff_out
, arg4
)) {
12607 return -TARGET_EFAULT
;
12613 #ifdef TARGET_NR_vmsplice
12614 case TARGET_NR_vmsplice
:
12616 struct iovec
*vec
= lock_iovec(VERIFY_READ
, arg2
, arg3
, 1);
12618 ret
= get_errno(vmsplice(arg1
, vec
, arg3
, arg4
));
12619 unlock_iovec(vec
, arg2
, arg3
, 0);
12621 ret
= -host_to_target_errno(errno
);
12626 #endif /* CONFIG_SPLICE */
12627 #ifdef CONFIG_EVENTFD
12628 #if defined(TARGET_NR_eventfd)
12629 case TARGET_NR_eventfd
:
12630 ret
= get_errno(eventfd(arg1
, 0));
12632 fd_trans_register(ret
, &target_eventfd_trans
);
12636 #if defined(TARGET_NR_eventfd2)
12637 case TARGET_NR_eventfd2
:
12639 int host_flags
= arg2
& (~(TARGET_O_NONBLOCK_MASK
| TARGET_O_CLOEXEC
));
12640 if (arg2
& TARGET_O_NONBLOCK
) {
12641 host_flags
|= O_NONBLOCK
;
12643 if (arg2
& TARGET_O_CLOEXEC
) {
12644 host_flags
|= O_CLOEXEC
;
12646 ret
= get_errno(eventfd(arg1
, host_flags
));
12648 fd_trans_register(ret
, &target_eventfd_trans
);
12653 #endif /* CONFIG_EVENTFD */
12654 #if defined(CONFIG_FALLOCATE) && defined(TARGET_NR_fallocate)
12655 case TARGET_NR_fallocate
:
12656 #if TARGET_ABI_BITS == 32
12657 ret
= get_errno(fallocate(arg1
, arg2
, target_offset64(arg3
, arg4
),
12658 target_offset64(arg5
, arg6
)));
12660 ret
= get_errno(fallocate(arg1
, arg2
, arg3
, arg4
));
12664 #if defined(CONFIG_SYNC_FILE_RANGE)
12665 #if defined(TARGET_NR_sync_file_range)
12666 case TARGET_NR_sync_file_range
:
12667 #if TARGET_ABI_BITS == 32
12668 #if defined(TARGET_MIPS)
12669 ret
= get_errno(sync_file_range(arg1
, target_offset64(arg3
, arg4
),
12670 target_offset64(arg5
, arg6
), arg7
));
12672 ret
= get_errno(sync_file_range(arg1
, target_offset64(arg2
, arg3
),
12673 target_offset64(arg4
, arg5
), arg6
));
12674 #endif /* !TARGET_MIPS */
12676 ret
= get_errno(sync_file_range(arg1
, arg2
, arg3
, arg4
));
12680 #if defined(TARGET_NR_sync_file_range2) || \
12681 defined(TARGET_NR_arm_sync_file_range)
12682 #if defined(TARGET_NR_sync_file_range2)
12683 case TARGET_NR_sync_file_range2
:
12685 #if defined(TARGET_NR_arm_sync_file_range)
12686 case TARGET_NR_arm_sync_file_range
:
12688 /* This is like sync_file_range but the arguments are reordered */
12689 #if TARGET_ABI_BITS == 32
12690 ret
= get_errno(sync_file_range(arg1
, target_offset64(arg3
, arg4
),
12691 target_offset64(arg5
, arg6
), arg2
));
12693 ret
= get_errno(sync_file_range(arg1
, arg3
, arg4
, arg2
));
12698 #if defined(TARGET_NR_signalfd4)
12699 case TARGET_NR_signalfd4
:
12700 return do_signalfd4(arg1
, arg2
, arg4
);
12702 #if defined(TARGET_NR_signalfd)
12703 case TARGET_NR_signalfd
:
12704 return do_signalfd4(arg1
, arg2
, 0);
12706 #if defined(CONFIG_EPOLL)
12707 #if defined(TARGET_NR_epoll_create)
12708 case TARGET_NR_epoll_create
:
12709 return get_errno(epoll_create(arg1
));
12711 #if defined(TARGET_NR_epoll_create1) && defined(CONFIG_EPOLL_CREATE1)
12712 case TARGET_NR_epoll_create1
:
12713 return get_errno(epoll_create1(target_to_host_bitmask(arg1
, fcntl_flags_tbl
)));
12715 #if defined(TARGET_NR_epoll_ctl)
12716 case TARGET_NR_epoll_ctl
:
12718 struct epoll_event ep
;
12719 struct epoll_event
*epp
= 0;
12721 if (arg2
!= EPOLL_CTL_DEL
) {
12722 struct target_epoll_event
*target_ep
;
12723 if (!lock_user_struct(VERIFY_READ
, target_ep
, arg4
, 1)) {
12724 return -TARGET_EFAULT
;
12726 ep
.events
= tswap32(target_ep
->events
);
12728 * The epoll_data_t union is just opaque data to the kernel,
12729 * so we transfer all 64 bits across and need not worry what
12730 * actual data type it is.
12732 ep
.data
.u64
= tswap64(target_ep
->data
.u64
);
12733 unlock_user_struct(target_ep
, arg4
, 0);
12736 * before kernel 2.6.9, EPOLL_CTL_DEL operation required a
12737 * non-null pointer, even though this argument is ignored.
12742 return get_errno(epoll_ctl(arg1
, arg2
, arg3
, epp
));
12746 #if defined(TARGET_NR_epoll_wait) || defined(TARGET_NR_epoll_pwait)
12747 #if defined(TARGET_NR_epoll_wait)
12748 case TARGET_NR_epoll_wait
:
12750 #if defined(TARGET_NR_epoll_pwait)
12751 case TARGET_NR_epoll_pwait
:
12754 struct target_epoll_event
*target_ep
;
12755 struct epoll_event
*ep
;
12757 int maxevents
= arg3
;
12758 int timeout
= arg4
;
12760 if (maxevents
<= 0 || maxevents
> TARGET_EP_MAX_EVENTS
) {
12761 return -TARGET_EINVAL
;
12764 target_ep
= lock_user(VERIFY_WRITE
, arg2
,
12765 maxevents
* sizeof(struct target_epoll_event
), 1);
12767 return -TARGET_EFAULT
;
12770 ep
= g_try_new(struct epoll_event
, maxevents
);
12772 unlock_user(target_ep
, arg2
, 0);
12773 return -TARGET_ENOMEM
;
12777 #if defined(TARGET_NR_epoll_pwait)
12778 case TARGET_NR_epoll_pwait
:
12780 target_sigset_t
*target_set
;
12781 sigset_t _set
, *set
= &_set
;
12784 if (arg6
!= sizeof(target_sigset_t
)) {
12785 ret
= -TARGET_EINVAL
;
12789 target_set
= lock_user(VERIFY_READ
, arg5
,
12790 sizeof(target_sigset_t
), 1);
12792 ret
= -TARGET_EFAULT
;
12795 target_to_host_sigset(set
, target_set
);
12796 unlock_user(target_set
, arg5
, 0);
12801 ret
= get_errno(safe_epoll_pwait(epfd
, ep
, maxevents
, timeout
,
12802 set
, SIGSET_T_SIZE
));
12806 #if defined(TARGET_NR_epoll_wait)
12807 case TARGET_NR_epoll_wait
:
12808 ret
= get_errno(safe_epoll_pwait(epfd
, ep
, maxevents
, timeout
,
12813 ret
= -TARGET_ENOSYS
;
12815 if (!is_error(ret
)) {
12817 for (i
= 0; i
< ret
; i
++) {
12818 target_ep
[i
].events
= tswap32(ep
[i
].events
);
12819 target_ep
[i
].data
.u64
= tswap64(ep
[i
].data
.u64
);
12821 unlock_user(target_ep
, arg2
,
12822 ret
* sizeof(struct target_epoll_event
));
12824 unlock_user(target_ep
, arg2
, 0);
12831 #ifdef TARGET_NR_prlimit64
12832 case TARGET_NR_prlimit64
:
12834 /* args: pid, resource number, ptr to new rlimit, ptr to old rlimit */
12835 struct target_rlimit64
*target_rnew
, *target_rold
;
12836 struct host_rlimit64 rnew
, rold
, *rnewp
= 0;
12837 int resource
= target_to_host_resource(arg2
);
12839 if (arg3
&& (resource
!= RLIMIT_AS
&&
12840 resource
!= RLIMIT_DATA
&&
12841 resource
!= RLIMIT_STACK
)) {
12842 if (!lock_user_struct(VERIFY_READ
, target_rnew
, arg3
, 1)) {
12843 return -TARGET_EFAULT
;
12845 rnew
.rlim_cur
= tswap64(target_rnew
->rlim_cur
);
12846 rnew
.rlim_max
= tswap64(target_rnew
->rlim_max
);
12847 unlock_user_struct(target_rnew
, arg3
, 0);
12851 ret
= get_errno(sys_prlimit64(arg1
, resource
, rnewp
, arg4
? &rold
: 0));
12852 if (!is_error(ret
) && arg4
) {
12853 if (!lock_user_struct(VERIFY_WRITE
, target_rold
, arg4
, 1)) {
12854 return -TARGET_EFAULT
;
12856 target_rold
->rlim_cur
= tswap64(rold
.rlim_cur
);
12857 target_rold
->rlim_max
= tswap64(rold
.rlim_max
);
12858 unlock_user_struct(target_rold
, arg4
, 1);
12863 #ifdef TARGET_NR_gethostname
12864 case TARGET_NR_gethostname
:
12866 char *name
= lock_user(VERIFY_WRITE
, arg1
, arg2
, 0);
12868 ret
= get_errno(gethostname(name
, arg2
));
12869 unlock_user(name
, arg1
, arg2
);
12871 ret
= -TARGET_EFAULT
;
12876 #ifdef TARGET_NR_atomic_cmpxchg_32
12877 case TARGET_NR_atomic_cmpxchg_32
:
12879 /* should use start_exclusive from main.c */
12880 abi_ulong mem_value
;
12881 if (get_user_u32(mem_value
, arg6
)) {
12882 target_siginfo_t info
;
12883 info
.si_signo
= SIGSEGV
;
12885 info
.si_code
= TARGET_SEGV_MAPERR
;
12886 info
._sifields
._sigfault
._addr
= arg6
;
12887 queue_signal((CPUArchState
*)cpu_env
, info
.si_signo
,
12888 QEMU_SI_FAULT
, &info
);
12892 if (mem_value
== arg2
)
12893 put_user_u32(arg1
, arg6
);
12897 #ifdef TARGET_NR_atomic_barrier
12898 case TARGET_NR_atomic_barrier
:
12899 /* Like the kernel implementation and the
12900 qemu arm barrier, no-op this? */
12904 #ifdef TARGET_NR_timer_create
12905 case TARGET_NR_timer_create
:
12907 /* args: clockid_t clockid, struct sigevent *sevp, timer_t *timerid */
12909 struct sigevent host_sevp
= { {0}, }, *phost_sevp
= NULL
;
12912 int timer_index
= next_free_host_timer();
12914 if (timer_index
< 0) {
12915 ret
= -TARGET_EAGAIN
;
12917 timer_t
*phtimer
= g_posix_timers
+ timer_index
;
12920 phost_sevp
= &host_sevp
;
12921 ret
= target_to_host_sigevent(phost_sevp
, arg2
);
12927 ret
= get_errno(timer_create(clkid
, phost_sevp
, phtimer
));
12931 if (put_user(TIMER_MAGIC
| timer_index
, arg3
, target_timer_t
)) {
12932 return -TARGET_EFAULT
;
12940 #ifdef TARGET_NR_timer_settime
12941 case TARGET_NR_timer_settime
:
12943 /* args: timer_t timerid, int flags, const struct itimerspec *new_value,
12944 * struct itimerspec * old_value */
12945 target_timer_t timerid
= get_timer_id(arg1
);
12949 } else if (arg3
== 0) {
12950 ret
= -TARGET_EINVAL
;
12952 timer_t htimer
= g_posix_timers
[timerid
];
12953 struct itimerspec hspec_new
= {{0},}, hspec_old
= {{0},};
12955 if (target_to_host_itimerspec(&hspec_new
, arg3
)) {
12956 return -TARGET_EFAULT
;
12959 timer_settime(htimer
, arg2
, &hspec_new
, &hspec_old
));
12960 if (arg4
&& host_to_target_itimerspec(arg4
, &hspec_old
)) {
12961 return -TARGET_EFAULT
;
12968 #ifdef TARGET_NR_timer_settime64
12969 case TARGET_NR_timer_settime64
:
12971 target_timer_t timerid
= get_timer_id(arg1
);
12975 } else if (arg3
== 0) {
12976 ret
= -TARGET_EINVAL
;
12978 timer_t htimer
= g_posix_timers
[timerid
];
12979 struct itimerspec hspec_new
= {{0},}, hspec_old
= {{0},};
12981 if (target_to_host_itimerspec64(&hspec_new
, arg3
)) {
12982 return -TARGET_EFAULT
;
12985 timer_settime(htimer
, arg2
, &hspec_new
, &hspec_old
));
12986 if (arg4
&& host_to_target_itimerspec64(arg4
, &hspec_old
)) {
12987 return -TARGET_EFAULT
;
12994 #ifdef TARGET_NR_timer_gettime
12995 case TARGET_NR_timer_gettime
:
12997 /* args: timer_t timerid, struct itimerspec *curr_value */
12998 target_timer_t timerid
= get_timer_id(arg1
);
13002 } else if (!arg2
) {
13003 ret
= -TARGET_EFAULT
;
13005 timer_t htimer
= g_posix_timers
[timerid
];
13006 struct itimerspec hspec
;
13007 ret
= get_errno(timer_gettime(htimer
, &hspec
));
13009 if (host_to_target_itimerspec(arg2
, &hspec
)) {
13010 ret
= -TARGET_EFAULT
;
13017 #ifdef TARGET_NR_timer_gettime64
13018 case TARGET_NR_timer_gettime64
:
13020 /* args: timer_t timerid, struct itimerspec64 *curr_value */
13021 target_timer_t timerid
= get_timer_id(arg1
);
13025 } else if (!arg2
) {
13026 ret
= -TARGET_EFAULT
;
13028 timer_t htimer
= g_posix_timers
[timerid
];
13029 struct itimerspec hspec
;
13030 ret
= get_errno(timer_gettime(htimer
, &hspec
));
13032 if (host_to_target_itimerspec64(arg2
, &hspec
)) {
13033 ret
= -TARGET_EFAULT
;
13040 #ifdef TARGET_NR_timer_getoverrun
13041 case TARGET_NR_timer_getoverrun
:
13043 /* args: timer_t timerid */
13044 target_timer_t timerid
= get_timer_id(arg1
);
13049 timer_t htimer
= g_posix_timers
[timerid
];
13050 ret
= get_errno(timer_getoverrun(htimer
));
13056 #ifdef TARGET_NR_timer_delete
13057 case TARGET_NR_timer_delete
:
13059 /* args: timer_t timerid */
13060 target_timer_t timerid
= get_timer_id(arg1
);
13065 timer_t htimer
= g_posix_timers
[timerid
];
13066 ret
= get_errno(timer_delete(htimer
));
13067 g_posix_timers
[timerid
] = 0;
13073 #if defined(TARGET_NR_timerfd_create) && defined(CONFIG_TIMERFD)
13074 case TARGET_NR_timerfd_create
:
13075 return get_errno(timerfd_create(arg1
,
13076 target_to_host_bitmask(arg2
, fcntl_flags_tbl
)));
13079 #if defined(TARGET_NR_timerfd_gettime) && defined(CONFIG_TIMERFD)
13080 case TARGET_NR_timerfd_gettime
:
13082 struct itimerspec its_curr
;
13084 ret
= get_errno(timerfd_gettime(arg1
, &its_curr
));
13086 if (arg2
&& host_to_target_itimerspec(arg2
, &its_curr
)) {
13087 return -TARGET_EFAULT
;
13093 #if defined(TARGET_NR_timerfd_gettime64) && defined(CONFIG_TIMERFD)
13094 case TARGET_NR_timerfd_gettime64
:
13096 struct itimerspec its_curr
;
13098 ret
= get_errno(timerfd_gettime(arg1
, &its_curr
));
13100 if (arg2
&& host_to_target_itimerspec64(arg2
, &its_curr
)) {
13101 return -TARGET_EFAULT
;
13107 #if defined(TARGET_NR_timerfd_settime) && defined(CONFIG_TIMERFD)
13108 case TARGET_NR_timerfd_settime
:
13110 struct itimerspec its_new
, its_old
, *p_new
;
13113 if (target_to_host_itimerspec(&its_new
, arg3
)) {
13114 return -TARGET_EFAULT
;
13121 ret
= get_errno(timerfd_settime(arg1
, arg2
, p_new
, &its_old
));
13123 if (arg4
&& host_to_target_itimerspec(arg4
, &its_old
)) {
13124 return -TARGET_EFAULT
;
13130 #if defined(TARGET_NR_timerfd_settime64) && defined(CONFIG_TIMERFD)
13131 case TARGET_NR_timerfd_settime64
:
13133 struct itimerspec its_new
, its_old
, *p_new
;
13136 if (target_to_host_itimerspec64(&its_new
, arg3
)) {
13137 return -TARGET_EFAULT
;
13144 ret
= get_errno(timerfd_settime(arg1
, arg2
, p_new
, &its_old
));
13146 if (arg4
&& host_to_target_itimerspec64(arg4
, &its_old
)) {
13147 return -TARGET_EFAULT
;
13153 #if defined(TARGET_NR_ioprio_get) && defined(__NR_ioprio_get)
13154 case TARGET_NR_ioprio_get
:
13155 return get_errno(ioprio_get(arg1
, arg2
));
13158 #if defined(TARGET_NR_ioprio_set) && defined(__NR_ioprio_set)
13159 case TARGET_NR_ioprio_set
:
13160 return get_errno(ioprio_set(arg1
, arg2
, arg3
));
13163 #if defined(TARGET_NR_setns) && defined(CONFIG_SETNS)
13164 case TARGET_NR_setns
:
13165 return get_errno(setns(arg1
, arg2
));
13167 #if defined(TARGET_NR_unshare) && defined(CONFIG_SETNS)
13168 case TARGET_NR_unshare
:
13169 return get_errno(unshare(arg1
));
13171 #if defined(TARGET_NR_kcmp) && defined(__NR_kcmp)
13172 case TARGET_NR_kcmp
:
13173 return get_errno(kcmp(arg1
, arg2
, arg3
, arg4
, arg5
));
13175 #ifdef TARGET_NR_swapcontext
13176 case TARGET_NR_swapcontext
:
13177 /* PowerPC specific. */
13178 return do_swapcontext(cpu_env
, arg1
, arg2
, arg3
);
13180 #ifdef TARGET_NR_memfd_create
13181 case TARGET_NR_memfd_create
:
13182 p
= lock_user_string(arg1
);
13184 return -TARGET_EFAULT
;
13186 ret
= get_errno(memfd_create(p
, arg2
));
13187 fd_trans_unregister(ret
);
13188 unlock_user(p
, arg1
, 0);
13191 #if defined TARGET_NR_membarrier && defined __NR_membarrier
13192 case TARGET_NR_membarrier
:
13193 return get_errno(membarrier(arg1
, arg2
));
13196 #if defined(TARGET_NR_copy_file_range) && defined(__NR_copy_file_range)
13197 case TARGET_NR_copy_file_range
:
13199 loff_t inoff
, outoff
;
13200 loff_t
*pinoff
= NULL
, *poutoff
= NULL
;
13203 if (get_user_u64(inoff
, arg2
)) {
13204 return -TARGET_EFAULT
;
13209 if (get_user_u64(outoff
, arg4
)) {
13210 return -TARGET_EFAULT
;
13214 /* Do not sign-extend the count parameter. */
13215 ret
= get_errno(safe_copy_file_range(arg1
, pinoff
, arg3
, poutoff
,
13216 (abi_ulong
)arg5
, arg6
));
13217 if (!is_error(ret
) && ret
> 0) {
13219 if (put_user_u64(inoff
, arg2
)) {
13220 return -TARGET_EFAULT
;
13224 if (put_user_u64(outoff
, arg4
)) {
13225 return -TARGET_EFAULT
;
13233 #if defined(TARGET_NR_pivot_root)
13234 case TARGET_NR_pivot_root
:
13237 p
= lock_user_string(arg1
); /* new_root */
13238 p2
= lock_user_string(arg2
); /* put_old */
13240 ret
= -TARGET_EFAULT
;
13242 ret
= get_errno(pivot_root(p
, p2
));
13244 unlock_user(p2
, arg2
, 0);
13245 unlock_user(p
, arg1
, 0);
13251 qemu_log_mask(LOG_UNIMP
, "Unsupported syscall: %d\n", num
);
13252 return -TARGET_ENOSYS
;
13257 abi_long
do_syscall(void *cpu_env
, int num
, abi_long arg1
,
13258 abi_long arg2
, abi_long arg3
, abi_long arg4
,
13259 abi_long arg5
, abi_long arg6
, abi_long arg7
,
13262 CPUState
*cpu
= env_cpu(cpu_env
);
13265 #ifdef DEBUG_ERESTARTSYS
13266 /* Debug-only code for exercising the syscall-restart code paths
13267 * in the per-architecture cpu main loops: restart every syscall
13268 * the guest makes once before letting it through.
13274 return -TARGET_ERESTARTSYS
;
13279 record_syscall_start(cpu
, num
, arg1
,
13280 arg2
, arg3
, arg4
, arg5
, arg6
, arg7
, arg8
);
13282 if (unlikely(qemu_loglevel_mask(LOG_STRACE
))) {
13283 print_syscall(cpu_env
, num
, arg1
, arg2
, arg3
, arg4
, arg5
, arg6
);
13286 ret
= do_syscall1(cpu_env
, num
, arg1
, arg2
, arg3
, arg4
,
13287 arg5
, arg6
, arg7
, arg8
);
13289 if (unlikely(qemu_loglevel_mask(LOG_STRACE
))) {
13290 print_syscall_ret(cpu_env
, num
, ret
, arg1
, arg2
,
13291 arg3
, arg4
, arg5
, arg6
);
13294 record_syscall_return(cpu
, num
, ret
);