riscv: sifive_u: Remove the unnecessary include of prci header
[qemu/ar7.git] / linux-user / syscall.c
blobe2af3c1494fa24fd35d9d651f29cbee7a616a000
1 /*
2 * Linux syscalls
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"
25 #include <elf.h>
26 #include <endian.h>
27 #include <grp.h>
28 #include <sys/ipc.h>
29 #include <sys/msg.h>
30 #include <sys/wait.h>
31 #include <sys/mount.h>
32 #include <sys/file.h>
33 #include <sys/fsuid.h>
34 #include <sys/personality.h>
35 #include <sys/prctl.h>
36 #include <sys/resource.h>
37 #include <sys/swap.h>
38 #include <linux/capability.h>
39 #include <sched.h>
40 #include <sys/timex.h>
41 #include <sys/socket.h>
42 #include <linux/sockios.h>
43 #include <sys/un.h>
44 #include <sys/uio.h>
45 #include <poll.h>
46 #include <sys/times.h>
47 #include <sys/shm.h>
48 #include <sys/sem.h>
49 #include <sys/statfs.h>
50 #include <utime.h>
51 #include <sys/sysinfo.h>
52 #include <sys/signalfd.h>
53 //#include <sys/user.h>
54 #include <netinet/ip.h>
55 #include <netinet/tcp.h>
56 #include <linux/wireless.h>
57 #include <linux/icmp.h>
58 #include <linux/icmpv6.h>
59 #include <linux/errqueue.h>
60 #include <linux/random.h>
61 #ifdef CONFIG_TIMERFD
62 #include <sys/timerfd.h>
63 #endif
64 #ifdef CONFIG_EVENTFD
65 #include <sys/eventfd.h>
66 #endif
67 #ifdef CONFIG_EPOLL
68 #include <sys/epoll.h>
69 #endif
70 #ifdef CONFIG_ATTR
71 #include "qemu/xattr.h"
72 #endif
73 #ifdef CONFIG_SENDFILE
74 #include <sys/sendfile.h>
75 #endif
77 #define termios host_termios
78 #define winsize host_winsize
79 #define termio host_termio
80 #define sgttyb host_sgttyb /* same as target */
81 #define tchars host_tchars /* same as target */
82 #define ltchars host_ltchars /* same as target */
84 #include <linux/termios.h>
85 #include <linux/unistd.h>
86 #include <linux/cdrom.h>
87 #include <linux/hdreg.h>
88 #include <linux/soundcard.h>
89 #include <linux/kd.h>
90 #include <linux/mtio.h>
91 #include <linux/fs.h>
92 #include <linux/fd.h>
93 #if defined(CONFIG_FIEMAP)
94 #include <linux/fiemap.h>
95 #endif
96 #include <linux/fb.h>
97 #if defined(CONFIG_USBFS)
98 #include <linux/usbdevice_fs.h>
99 #include <linux/usb/ch9.h>
100 #endif
101 #include <linux/vt.h>
102 #include <linux/dm-ioctl.h>
103 #include <linux/reboot.h>
104 #include <linux/route.h>
105 #include <linux/filter.h>
106 #include <linux/blkpg.h>
107 #include <netpacket/packet.h>
108 #include <linux/netlink.h>
109 #include <linux/if_alg.h>
110 #include "linux_loop.h"
111 #include "uname.h"
113 #include "qemu.h"
114 #include "qemu/guest-random.h"
115 #include "qapi/error.h"
116 #include "fd-trans.h"
118 #ifndef CLONE_IO
119 #define CLONE_IO 0x80000000 /* Clone io context */
120 #endif
122 /* We can't directly call the host clone syscall, because this will
123 * badly confuse libc (breaking mutexes, for example). So we must
124 * divide clone flags into:
125 * * flag combinations that look like pthread_create()
126 * * flag combinations that look like fork()
127 * * flags we can implement within QEMU itself
128 * * flags we can't support and will return an error for
130 /* For thread creation, all these flags must be present; for
131 * fork, none must be present.
133 #define CLONE_THREAD_FLAGS \
134 (CLONE_VM | CLONE_FS | CLONE_FILES | \
135 CLONE_SIGHAND | CLONE_THREAD | CLONE_SYSVSEM)
137 /* These flags are ignored:
138 * CLONE_DETACHED is now ignored by the kernel;
139 * CLONE_IO is just an optimisation hint to the I/O scheduler
141 #define CLONE_IGNORED_FLAGS \
142 (CLONE_DETACHED | CLONE_IO)
144 /* Flags for fork which we can implement within QEMU itself */
145 #define CLONE_OPTIONAL_FORK_FLAGS \
146 (CLONE_SETTLS | CLONE_PARENT_SETTID | \
147 CLONE_CHILD_CLEARTID | CLONE_CHILD_SETTID)
149 /* Flags for thread creation which we can implement within QEMU itself */
150 #define CLONE_OPTIONAL_THREAD_FLAGS \
151 (CLONE_SETTLS | CLONE_PARENT_SETTID | \
152 CLONE_CHILD_CLEARTID | CLONE_CHILD_SETTID | CLONE_PARENT)
154 #define CLONE_INVALID_FORK_FLAGS \
155 (~(CSIGNAL | CLONE_OPTIONAL_FORK_FLAGS | CLONE_IGNORED_FLAGS))
157 #define CLONE_INVALID_THREAD_FLAGS \
158 (~(CSIGNAL | CLONE_THREAD_FLAGS | CLONE_OPTIONAL_THREAD_FLAGS | \
159 CLONE_IGNORED_FLAGS))
161 /* CLONE_VFORK is special cased early in do_fork(). The other flag bits
162 * have almost all been allocated. We cannot support any of
163 * CLONE_NEWNS, CLONE_NEWCGROUP, CLONE_NEWUTS, CLONE_NEWIPC,
164 * CLONE_NEWUSER, CLONE_NEWPID, CLONE_NEWNET, CLONE_PTRACE, CLONE_UNTRACED.
165 * The checks against the invalid thread masks above will catch these.
166 * (The one remaining unallocated bit is 0x1000 which used to be CLONE_PID.)
169 /* Define DEBUG_ERESTARTSYS to force every syscall to be restarted
170 * once. This exercises the codepaths for restart.
172 //#define DEBUG_ERESTARTSYS
174 //#include <linux/msdos_fs.h>
175 #define VFAT_IOCTL_READDIR_BOTH _IOR('r', 1, struct linux_dirent [2])
176 #define VFAT_IOCTL_READDIR_SHORT _IOR('r', 2, struct linux_dirent [2])
178 #undef _syscall0
179 #undef _syscall1
180 #undef _syscall2
181 #undef _syscall3
182 #undef _syscall4
183 #undef _syscall5
184 #undef _syscall6
186 #define _syscall0(type,name) \
187 static type name (void) \
189 return syscall(__NR_##name); \
192 #define _syscall1(type,name,type1,arg1) \
193 static type name (type1 arg1) \
195 return syscall(__NR_##name, arg1); \
198 #define _syscall2(type,name,type1,arg1,type2,arg2) \
199 static type name (type1 arg1,type2 arg2) \
201 return syscall(__NR_##name, arg1, arg2); \
204 #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
205 static type name (type1 arg1,type2 arg2,type3 arg3) \
207 return syscall(__NR_##name, arg1, arg2, arg3); \
210 #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
211 static type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4) \
213 return syscall(__NR_##name, arg1, arg2, arg3, arg4); \
216 #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
217 type5,arg5) \
218 static type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5) \
220 return syscall(__NR_##name, arg1, arg2, arg3, arg4, arg5); \
224 #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
225 type5,arg5,type6,arg6) \
226 static type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5, \
227 type6 arg6) \
229 return syscall(__NR_##name, arg1, arg2, arg3, arg4, arg5, arg6); \
233 #define __NR_sys_uname __NR_uname
234 #define __NR_sys_getcwd1 __NR_getcwd
235 #define __NR_sys_getdents __NR_getdents
236 #define __NR_sys_getdents64 __NR_getdents64
237 #define __NR_sys_getpriority __NR_getpriority
238 #define __NR_sys_rt_sigqueueinfo __NR_rt_sigqueueinfo
239 #define __NR_sys_rt_tgsigqueueinfo __NR_rt_tgsigqueueinfo
240 #define __NR_sys_syslog __NR_syslog
241 #define __NR_sys_futex __NR_futex
242 #define __NR_sys_inotify_init __NR_inotify_init
243 #define __NR_sys_inotify_add_watch __NR_inotify_add_watch
244 #define __NR_sys_inotify_rm_watch __NR_inotify_rm_watch
245 #define __NR_sys_statx __NR_statx
247 #if defined(__alpha__) || defined(__x86_64__) || defined(__s390x__)
248 #define __NR__llseek __NR_lseek
249 #endif
251 /* Newer kernel ports have llseek() instead of _llseek() */
252 #if defined(TARGET_NR_llseek) && !defined(TARGET_NR__llseek)
253 #define TARGET_NR__llseek TARGET_NR_llseek
254 #endif
256 #define __NR_sys_gettid __NR_gettid
257 _syscall0(int, sys_gettid)
259 /* For the 64-bit guest on 32-bit host case we must emulate
260 * getdents using getdents64, because otherwise the host
261 * might hand us back more dirent records than we can fit
262 * into the guest buffer after structure format conversion.
263 * Otherwise we emulate getdents with getdents if the host has it.
265 #if defined(__NR_getdents) && HOST_LONG_BITS >= TARGET_ABI_BITS
266 #define EMULATE_GETDENTS_WITH_GETDENTS
267 #endif
269 #if defined(TARGET_NR_getdents) && defined(EMULATE_GETDENTS_WITH_GETDENTS)
270 _syscall3(int, sys_getdents, uint, fd, struct linux_dirent *, dirp, uint, count);
271 #endif
272 #if (defined(TARGET_NR_getdents) && \
273 !defined(EMULATE_GETDENTS_WITH_GETDENTS)) || \
274 (defined(TARGET_NR_getdents64) && defined(__NR_getdents64))
275 _syscall3(int, sys_getdents64, uint, fd, struct linux_dirent64 *, dirp, uint, count);
276 #endif
277 #if defined(TARGET_NR__llseek) && defined(__NR_llseek)
278 _syscall5(int, _llseek, uint, fd, ulong, hi, ulong, lo,
279 loff_t *, res, uint, wh);
280 #endif
281 _syscall3(int, sys_rt_sigqueueinfo, pid_t, pid, int, sig, siginfo_t *, uinfo)
282 _syscall4(int, sys_rt_tgsigqueueinfo, pid_t, pid, pid_t, tid, int, sig,
283 siginfo_t *, uinfo)
284 _syscall3(int,sys_syslog,int,type,char*,bufp,int,len)
285 #ifdef __NR_exit_group
286 _syscall1(int,exit_group,int,error_code)
287 #endif
288 #if defined(TARGET_NR_set_tid_address) && defined(__NR_set_tid_address)
289 _syscall1(int,set_tid_address,int *,tidptr)
290 #endif
291 #if defined(TARGET_NR_futex) && defined(__NR_futex)
292 _syscall6(int,sys_futex,int *,uaddr,int,op,int,val,
293 const struct timespec *,timeout,int *,uaddr2,int,val3)
294 #endif
295 #define __NR_sys_sched_getaffinity __NR_sched_getaffinity
296 _syscall3(int, sys_sched_getaffinity, pid_t, pid, unsigned int, len,
297 unsigned long *, user_mask_ptr);
298 #define __NR_sys_sched_setaffinity __NR_sched_setaffinity
299 _syscall3(int, sys_sched_setaffinity, pid_t, pid, unsigned int, len,
300 unsigned long *, user_mask_ptr);
301 #define __NR_sys_getcpu __NR_getcpu
302 _syscall3(int, sys_getcpu, unsigned *, cpu, unsigned *, node, void *, tcache);
303 _syscall4(int, reboot, int, magic1, int, magic2, unsigned int, cmd,
304 void *, arg);
305 _syscall2(int, capget, struct __user_cap_header_struct *, header,
306 struct __user_cap_data_struct *, data);
307 _syscall2(int, capset, struct __user_cap_header_struct *, header,
308 struct __user_cap_data_struct *, data);
309 #if defined(TARGET_NR_ioprio_get) && defined(__NR_ioprio_get)
310 _syscall2(int, ioprio_get, int, which, int, who)
311 #endif
312 #if defined(TARGET_NR_ioprio_set) && defined(__NR_ioprio_set)
313 _syscall3(int, ioprio_set, int, which, int, who, int, ioprio)
314 #endif
315 #if defined(TARGET_NR_getrandom) && defined(__NR_getrandom)
316 _syscall3(int, getrandom, void *, buf, size_t, buflen, unsigned int, flags)
317 #endif
319 #if defined(TARGET_NR_kcmp) && defined(__NR_kcmp)
320 _syscall5(int, kcmp, pid_t, pid1, pid_t, pid2, int, type,
321 unsigned long, idx1, unsigned long, idx2)
322 #endif
325 * It is assumed that struct statx is architecture independent.
327 #if defined(TARGET_NR_statx) && defined(__NR_statx)
328 _syscall5(int, sys_statx, int, dirfd, const char *, pathname, int, flags,
329 unsigned int, mask, struct target_statx *, statxbuf)
330 #endif
332 static bitmask_transtbl fcntl_flags_tbl[] = {
333 { TARGET_O_ACCMODE, TARGET_O_WRONLY, O_ACCMODE, O_WRONLY, },
334 { TARGET_O_ACCMODE, TARGET_O_RDWR, O_ACCMODE, O_RDWR, },
335 { TARGET_O_CREAT, TARGET_O_CREAT, O_CREAT, O_CREAT, },
336 { TARGET_O_EXCL, TARGET_O_EXCL, O_EXCL, O_EXCL, },
337 { TARGET_O_NOCTTY, TARGET_O_NOCTTY, O_NOCTTY, O_NOCTTY, },
338 { TARGET_O_TRUNC, TARGET_O_TRUNC, O_TRUNC, O_TRUNC, },
339 { TARGET_O_APPEND, TARGET_O_APPEND, O_APPEND, O_APPEND, },
340 { TARGET_O_NONBLOCK, TARGET_O_NONBLOCK, O_NONBLOCK, O_NONBLOCK, },
341 { TARGET_O_SYNC, TARGET_O_DSYNC, O_SYNC, O_DSYNC, },
342 { TARGET_O_SYNC, TARGET_O_SYNC, O_SYNC, O_SYNC, },
343 { TARGET_FASYNC, TARGET_FASYNC, FASYNC, FASYNC, },
344 { TARGET_O_DIRECTORY, TARGET_O_DIRECTORY, O_DIRECTORY, O_DIRECTORY, },
345 { TARGET_O_NOFOLLOW, TARGET_O_NOFOLLOW, O_NOFOLLOW, O_NOFOLLOW, },
346 #if defined(O_DIRECT)
347 { TARGET_O_DIRECT, TARGET_O_DIRECT, O_DIRECT, O_DIRECT, },
348 #endif
349 #if defined(O_NOATIME)
350 { TARGET_O_NOATIME, TARGET_O_NOATIME, O_NOATIME, O_NOATIME },
351 #endif
352 #if defined(O_CLOEXEC)
353 { TARGET_O_CLOEXEC, TARGET_O_CLOEXEC, O_CLOEXEC, O_CLOEXEC },
354 #endif
355 #if defined(O_PATH)
356 { TARGET_O_PATH, TARGET_O_PATH, O_PATH, O_PATH },
357 #endif
358 #if defined(O_TMPFILE)
359 { TARGET_O_TMPFILE, TARGET_O_TMPFILE, O_TMPFILE, O_TMPFILE },
360 #endif
361 /* Don't terminate the list prematurely on 64-bit host+guest. */
362 #if TARGET_O_LARGEFILE != 0 || O_LARGEFILE != 0
363 { TARGET_O_LARGEFILE, TARGET_O_LARGEFILE, O_LARGEFILE, O_LARGEFILE, },
364 #endif
365 { 0, 0, 0, 0 }
368 static int sys_getcwd1(char *buf, size_t size)
370 if (getcwd(buf, size) == NULL) {
371 /* getcwd() sets errno */
372 return (-1);
374 return strlen(buf)+1;
377 #ifdef TARGET_NR_utimensat
378 #if defined(__NR_utimensat)
379 #define __NR_sys_utimensat __NR_utimensat
380 _syscall4(int,sys_utimensat,int,dirfd,const char *,pathname,
381 const struct timespec *,tsp,int,flags)
382 #else
383 static int sys_utimensat(int dirfd, const char *pathname,
384 const struct timespec times[2], int flags)
386 errno = ENOSYS;
387 return -1;
389 #endif
390 #endif /* TARGET_NR_utimensat */
392 #ifdef TARGET_NR_renameat2
393 #if defined(__NR_renameat2)
394 #define __NR_sys_renameat2 __NR_renameat2
395 _syscall5(int, sys_renameat2, int, oldfd, const char *, old, int, newfd,
396 const char *, new, unsigned int, flags)
397 #else
398 static int sys_renameat2(int oldfd, const char *old,
399 int newfd, const char *new, int flags)
401 if (flags == 0) {
402 return renameat(oldfd, old, newfd, new);
404 errno = ENOSYS;
405 return -1;
407 #endif
408 #endif /* TARGET_NR_renameat2 */
410 #ifdef CONFIG_INOTIFY
411 #include <sys/inotify.h>
413 #if defined(TARGET_NR_inotify_init) && defined(__NR_inotify_init)
414 static int sys_inotify_init(void)
416 return (inotify_init());
418 #endif
419 #if defined(TARGET_NR_inotify_add_watch) && defined(__NR_inotify_add_watch)
420 static int sys_inotify_add_watch(int fd,const char *pathname, int32_t mask)
422 return (inotify_add_watch(fd, pathname, mask));
424 #endif
425 #if defined(TARGET_NR_inotify_rm_watch) && defined(__NR_inotify_rm_watch)
426 static int sys_inotify_rm_watch(int fd, int32_t wd)
428 return (inotify_rm_watch(fd, wd));
430 #endif
431 #ifdef CONFIG_INOTIFY1
432 #if defined(TARGET_NR_inotify_init1) && defined(__NR_inotify_init1)
433 static int sys_inotify_init1(int flags)
435 return (inotify_init1(flags));
437 #endif
438 #endif
439 #else
440 /* Userspace can usually survive runtime without inotify */
441 #undef TARGET_NR_inotify_init
442 #undef TARGET_NR_inotify_init1
443 #undef TARGET_NR_inotify_add_watch
444 #undef TARGET_NR_inotify_rm_watch
445 #endif /* CONFIG_INOTIFY */
447 #if defined(TARGET_NR_prlimit64)
448 #ifndef __NR_prlimit64
449 # define __NR_prlimit64 -1
450 #endif
451 #define __NR_sys_prlimit64 __NR_prlimit64
452 /* The glibc rlimit structure may not be that used by the underlying syscall */
453 struct host_rlimit64 {
454 uint64_t rlim_cur;
455 uint64_t rlim_max;
457 _syscall4(int, sys_prlimit64, pid_t, pid, int, resource,
458 const struct host_rlimit64 *, new_limit,
459 struct host_rlimit64 *, old_limit)
460 #endif
463 #if defined(TARGET_NR_timer_create)
464 /* Maxiumum of 32 active POSIX timers allowed at any one time. */
465 static timer_t g_posix_timers[32] = { 0, } ;
467 static inline int next_free_host_timer(void)
469 int k ;
470 /* FIXME: Does finding the next free slot require a lock? */
471 for (k = 0; k < ARRAY_SIZE(g_posix_timers); k++) {
472 if (g_posix_timers[k] == 0) {
473 g_posix_timers[k] = (timer_t) 1;
474 return k;
477 return -1;
479 #endif
481 /* ARM EABI and MIPS expect 64bit types aligned even on pairs or registers */
482 #ifdef TARGET_ARM
483 static inline int regpairs_aligned(void *cpu_env, int num)
485 return ((((CPUARMState *)cpu_env)->eabi) == 1) ;
487 #elif defined(TARGET_MIPS) && (TARGET_ABI_BITS == 32)
488 static inline int regpairs_aligned(void *cpu_env, int num) { return 1; }
489 #elif defined(TARGET_PPC) && !defined(TARGET_PPC64)
490 /* SysV AVI for PPC32 expects 64bit parameters to be passed on odd/even pairs
491 * of registers which translates to the same as ARM/MIPS, because we start with
492 * r3 as arg1 */
493 static inline int regpairs_aligned(void *cpu_env, int num) { return 1; }
494 #elif defined(TARGET_SH4)
495 /* SH4 doesn't align register pairs, except for p{read,write}64 */
496 static inline int regpairs_aligned(void *cpu_env, int num)
498 switch (num) {
499 case TARGET_NR_pread64:
500 case TARGET_NR_pwrite64:
501 return 1;
503 default:
504 return 0;
507 #elif defined(TARGET_XTENSA)
508 static inline int regpairs_aligned(void *cpu_env, int num) { return 1; }
509 #else
510 static inline int regpairs_aligned(void *cpu_env, int num) { return 0; }
511 #endif
513 #define ERRNO_TABLE_SIZE 1200
515 /* target_to_host_errno_table[] is initialized from
516 * host_to_target_errno_table[] in syscall_init(). */
517 static uint16_t target_to_host_errno_table[ERRNO_TABLE_SIZE] = {
521 * This list is the union of errno values overridden in asm-<arch>/errno.h
522 * minus the errnos that are not actually generic to all archs.
524 static uint16_t host_to_target_errno_table[ERRNO_TABLE_SIZE] = {
525 [EAGAIN] = TARGET_EAGAIN,
526 [EIDRM] = TARGET_EIDRM,
527 [ECHRNG] = TARGET_ECHRNG,
528 [EL2NSYNC] = TARGET_EL2NSYNC,
529 [EL3HLT] = TARGET_EL3HLT,
530 [EL3RST] = TARGET_EL3RST,
531 [ELNRNG] = TARGET_ELNRNG,
532 [EUNATCH] = TARGET_EUNATCH,
533 [ENOCSI] = TARGET_ENOCSI,
534 [EL2HLT] = TARGET_EL2HLT,
535 [EDEADLK] = TARGET_EDEADLK,
536 [ENOLCK] = TARGET_ENOLCK,
537 [EBADE] = TARGET_EBADE,
538 [EBADR] = TARGET_EBADR,
539 [EXFULL] = TARGET_EXFULL,
540 [ENOANO] = TARGET_ENOANO,
541 [EBADRQC] = TARGET_EBADRQC,
542 [EBADSLT] = TARGET_EBADSLT,
543 [EBFONT] = TARGET_EBFONT,
544 [ENOSTR] = TARGET_ENOSTR,
545 [ENODATA] = TARGET_ENODATA,
546 [ETIME] = TARGET_ETIME,
547 [ENOSR] = TARGET_ENOSR,
548 [ENONET] = TARGET_ENONET,
549 [ENOPKG] = TARGET_ENOPKG,
550 [EREMOTE] = TARGET_EREMOTE,
551 [ENOLINK] = TARGET_ENOLINK,
552 [EADV] = TARGET_EADV,
553 [ESRMNT] = TARGET_ESRMNT,
554 [ECOMM] = TARGET_ECOMM,
555 [EPROTO] = TARGET_EPROTO,
556 [EDOTDOT] = TARGET_EDOTDOT,
557 [EMULTIHOP] = TARGET_EMULTIHOP,
558 [EBADMSG] = TARGET_EBADMSG,
559 [ENAMETOOLONG] = TARGET_ENAMETOOLONG,
560 [EOVERFLOW] = TARGET_EOVERFLOW,
561 [ENOTUNIQ] = TARGET_ENOTUNIQ,
562 [EBADFD] = TARGET_EBADFD,
563 [EREMCHG] = TARGET_EREMCHG,
564 [ELIBACC] = TARGET_ELIBACC,
565 [ELIBBAD] = TARGET_ELIBBAD,
566 [ELIBSCN] = TARGET_ELIBSCN,
567 [ELIBMAX] = TARGET_ELIBMAX,
568 [ELIBEXEC] = TARGET_ELIBEXEC,
569 [EILSEQ] = TARGET_EILSEQ,
570 [ENOSYS] = TARGET_ENOSYS,
571 [ELOOP] = TARGET_ELOOP,
572 [ERESTART] = TARGET_ERESTART,
573 [ESTRPIPE] = TARGET_ESTRPIPE,
574 [ENOTEMPTY] = TARGET_ENOTEMPTY,
575 [EUSERS] = TARGET_EUSERS,
576 [ENOTSOCK] = TARGET_ENOTSOCK,
577 [EDESTADDRREQ] = TARGET_EDESTADDRREQ,
578 [EMSGSIZE] = TARGET_EMSGSIZE,
579 [EPROTOTYPE] = TARGET_EPROTOTYPE,
580 [ENOPROTOOPT] = TARGET_ENOPROTOOPT,
581 [EPROTONOSUPPORT] = TARGET_EPROTONOSUPPORT,
582 [ESOCKTNOSUPPORT] = TARGET_ESOCKTNOSUPPORT,
583 [EOPNOTSUPP] = TARGET_EOPNOTSUPP,
584 [EPFNOSUPPORT] = TARGET_EPFNOSUPPORT,
585 [EAFNOSUPPORT] = TARGET_EAFNOSUPPORT,
586 [EADDRINUSE] = TARGET_EADDRINUSE,
587 [EADDRNOTAVAIL] = TARGET_EADDRNOTAVAIL,
588 [ENETDOWN] = TARGET_ENETDOWN,
589 [ENETUNREACH] = TARGET_ENETUNREACH,
590 [ENETRESET] = TARGET_ENETRESET,
591 [ECONNABORTED] = TARGET_ECONNABORTED,
592 [ECONNRESET] = TARGET_ECONNRESET,
593 [ENOBUFS] = TARGET_ENOBUFS,
594 [EISCONN] = TARGET_EISCONN,
595 [ENOTCONN] = TARGET_ENOTCONN,
596 [EUCLEAN] = TARGET_EUCLEAN,
597 [ENOTNAM] = TARGET_ENOTNAM,
598 [ENAVAIL] = TARGET_ENAVAIL,
599 [EISNAM] = TARGET_EISNAM,
600 [EREMOTEIO] = TARGET_EREMOTEIO,
601 [EDQUOT] = TARGET_EDQUOT,
602 [ESHUTDOWN] = TARGET_ESHUTDOWN,
603 [ETOOMANYREFS] = TARGET_ETOOMANYREFS,
604 [ETIMEDOUT] = TARGET_ETIMEDOUT,
605 [ECONNREFUSED] = TARGET_ECONNREFUSED,
606 [EHOSTDOWN] = TARGET_EHOSTDOWN,
607 [EHOSTUNREACH] = TARGET_EHOSTUNREACH,
608 [EALREADY] = TARGET_EALREADY,
609 [EINPROGRESS] = TARGET_EINPROGRESS,
610 [ESTALE] = TARGET_ESTALE,
611 [ECANCELED] = TARGET_ECANCELED,
612 [ENOMEDIUM] = TARGET_ENOMEDIUM,
613 [EMEDIUMTYPE] = TARGET_EMEDIUMTYPE,
614 #ifdef ENOKEY
615 [ENOKEY] = TARGET_ENOKEY,
616 #endif
617 #ifdef EKEYEXPIRED
618 [EKEYEXPIRED] = TARGET_EKEYEXPIRED,
619 #endif
620 #ifdef EKEYREVOKED
621 [EKEYREVOKED] = TARGET_EKEYREVOKED,
622 #endif
623 #ifdef EKEYREJECTED
624 [EKEYREJECTED] = TARGET_EKEYREJECTED,
625 #endif
626 #ifdef EOWNERDEAD
627 [EOWNERDEAD] = TARGET_EOWNERDEAD,
628 #endif
629 #ifdef ENOTRECOVERABLE
630 [ENOTRECOVERABLE] = TARGET_ENOTRECOVERABLE,
631 #endif
632 #ifdef ENOMSG
633 [ENOMSG] = TARGET_ENOMSG,
634 #endif
635 #ifdef ERKFILL
636 [ERFKILL] = TARGET_ERFKILL,
637 #endif
638 #ifdef EHWPOISON
639 [EHWPOISON] = TARGET_EHWPOISON,
640 #endif
643 static inline int host_to_target_errno(int err)
645 if (err >= 0 && err < ERRNO_TABLE_SIZE &&
646 host_to_target_errno_table[err]) {
647 return host_to_target_errno_table[err];
649 return err;
652 static inline int target_to_host_errno(int err)
654 if (err >= 0 && err < ERRNO_TABLE_SIZE &&
655 target_to_host_errno_table[err]) {
656 return target_to_host_errno_table[err];
658 return err;
661 static inline abi_long get_errno(abi_long ret)
663 if (ret == -1)
664 return -host_to_target_errno(errno);
665 else
666 return ret;
669 const char *target_strerror(int err)
671 if (err == TARGET_ERESTARTSYS) {
672 return "To be restarted";
674 if (err == TARGET_QEMU_ESIGRETURN) {
675 return "Successful exit from sigreturn";
678 if ((err >= ERRNO_TABLE_SIZE) || (err < 0)) {
679 return NULL;
681 return strerror(target_to_host_errno(err));
684 #define safe_syscall0(type, name) \
685 static type safe_##name(void) \
687 return safe_syscall(__NR_##name); \
690 #define safe_syscall1(type, name, type1, arg1) \
691 static type safe_##name(type1 arg1) \
693 return safe_syscall(__NR_##name, arg1); \
696 #define safe_syscall2(type, name, type1, arg1, type2, arg2) \
697 static type safe_##name(type1 arg1, type2 arg2) \
699 return safe_syscall(__NR_##name, arg1, arg2); \
702 #define safe_syscall3(type, name, type1, arg1, type2, arg2, type3, arg3) \
703 static type safe_##name(type1 arg1, type2 arg2, type3 arg3) \
705 return safe_syscall(__NR_##name, arg1, arg2, arg3); \
708 #define safe_syscall4(type, name, type1, arg1, type2, arg2, type3, arg3, \
709 type4, arg4) \
710 static type safe_##name(type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
712 return safe_syscall(__NR_##name, arg1, arg2, arg3, arg4); \
715 #define safe_syscall5(type, name, type1, arg1, type2, arg2, type3, arg3, \
716 type4, arg4, type5, arg5) \
717 static type safe_##name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \
718 type5 arg5) \
720 return safe_syscall(__NR_##name, arg1, arg2, arg3, arg4, arg5); \
723 #define safe_syscall6(type, name, type1, arg1, type2, arg2, type3, arg3, \
724 type4, arg4, type5, arg5, type6, arg6) \
725 static type safe_##name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \
726 type5 arg5, type6 arg6) \
728 return safe_syscall(__NR_##name, arg1, arg2, arg3, arg4, arg5, arg6); \
731 safe_syscall3(ssize_t, read, int, fd, void *, buff, size_t, count)
732 safe_syscall3(ssize_t, write, int, fd, const void *, buff, size_t, count)
733 safe_syscall4(int, openat, int, dirfd, const char *, pathname, \
734 int, flags, mode_t, mode)
735 safe_syscall4(pid_t, wait4, pid_t, pid, int *, status, int, options, \
736 struct rusage *, rusage)
737 safe_syscall5(int, waitid, idtype_t, idtype, id_t, id, siginfo_t *, infop, \
738 int, options, struct rusage *, rusage)
739 safe_syscall3(int, execve, const char *, filename, char **, argv, char **, envp)
740 safe_syscall6(int, pselect6, int, nfds, fd_set *, readfds, fd_set *, writefds, \
741 fd_set *, exceptfds, struct timespec *, timeout, void *, sig)
742 safe_syscall5(int, ppoll, struct pollfd *, ufds, unsigned int, nfds,
743 struct timespec *, tsp, const sigset_t *, sigmask,
744 size_t, sigsetsize)
745 safe_syscall6(int, epoll_pwait, int, epfd, struct epoll_event *, events,
746 int, maxevents, int, timeout, const sigset_t *, sigmask,
747 size_t, sigsetsize)
748 safe_syscall6(int,futex,int *,uaddr,int,op,int,val, \
749 const struct timespec *,timeout,int *,uaddr2,int,val3)
750 safe_syscall2(int, rt_sigsuspend, sigset_t *, newset, size_t, sigsetsize)
751 safe_syscall2(int, kill, pid_t, pid, int, sig)
752 safe_syscall2(int, tkill, int, tid, int, sig)
753 safe_syscall3(int, tgkill, int, tgid, int, pid, int, sig)
754 safe_syscall3(ssize_t, readv, int, fd, const struct iovec *, iov, int, iovcnt)
755 safe_syscall3(ssize_t, writev, int, fd, const struct iovec *, iov, int, iovcnt)
756 safe_syscall5(ssize_t, preadv, int, fd, const struct iovec *, iov, int, iovcnt,
757 unsigned long, pos_l, unsigned long, pos_h)
758 safe_syscall5(ssize_t, pwritev, int, fd, const struct iovec *, iov, int, iovcnt,
759 unsigned long, pos_l, unsigned long, pos_h)
760 safe_syscall3(int, connect, int, fd, const struct sockaddr *, addr,
761 socklen_t, addrlen)
762 safe_syscall6(ssize_t, sendto, int, fd, const void *, buf, size_t, len,
763 int, flags, const struct sockaddr *, addr, socklen_t, addrlen)
764 safe_syscall6(ssize_t, recvfrom, int, fd, void *, buf, size_t, len,
765 int, flags, struct sockaddr *, addr, socklen_t *, addrlen)
766 safe_syscall3(ssize_t, sendmsg, int, fd, const struct msghdr *, msg, int, flags)
767 safe_syscall3(ssize_t, recvmsg, int, fd, struct msghdr *, msg, int, flags)
768 safe_syscall2(int, flock, int, fd, int, operation)
769 safe_syscall4(int, rt_sigtimedwait, const sigset_t *, these, siginfo_t *, uinfo,
770 const struct timespec *, uts, size_t, sigsetsize)
771 safe_syscall4(int, accept4, int, fd, struct sockaddr *, addr, socklen_t *, len,
772 int, flags)
773 safe_syscall2(int, nanosleep, const struct timespec *, req,
774 struct timespec *, rem)
775 #ifdef TARGET_NR_clock_nanosleep
776 safe_syscall4(int, clock_nanosleep, const clockid_t, clock, int, flags,
777 const struct timespec *, req, struct timespec *, rem)
778 #endif
779 #ifdef __NR_ipc
780 safe_syscall6(int, ipc, int, call, long, first, long, second, long, third,
781 void *, ptr, long, fifth)
782 #endif
783 #ifdef __NR_msgsnd
784 safe_syscall4(int, msgsnd, int, msgid, const void *, msgp, size_t, sz,
785 int, flags)
786 #endif
787 #ifdef __NR_msgrcv
788 safe_syscall5(int, msgrcv, int, msgid, void *, msgp, size_t, sz,
789 long, msgtype, int, flags)
790 #endif
791 #ifdef __NR_semtimedop
792 safe_syscall4(int, semtimedop, int, semid, struct sembuf *, tsops,
793 unsigned, nsops, const struct timespec *, timeout)
794 #endif
795 #if defined(TARGET_NR_mq_open) && defined(__NR_mq_open)
796 safe_syscall5(int, mq_timedsend, int, mqdes, const char *, msg_ptr,
797 size_t, len, unsigned, prio, const struct timespec *, timeout)
798 safe_syscall5(int, mq_timedreceive, int, mqdes, char *, msg_ptr,
799 size_t, len, unsigned *, prio, const struct timespec *, timeout)
800 #endif
801 /* We do ioctl like this rather than via safe_syscall3 to preserve the
802 * "third argument might be integer or pointer or not present" behaviour of
803 * the libc function.
805 #define safe_ioctl(...) safe_syscall(__NR_ioctl, __VA_ARGS__)
806 /* Similarly for fcntl. Note that callers must always:
807 * pass the F_GETLK64 etc constants rather than the unsuffixed F_GETLK
808 * use the flock64 struct rather than unsuffixed flock
809 * This will then work and use a 64-bit offset for both 32-bit and 64-bit hosts.
811 #ifdef __NR_fcntl64
812 #define safe_fcntl(...) safe_syscall(__NR_fcntl64, __VA_ARGS__)
813 #else
814 #define safe_fcntl(...) safe_syscall(__NR_fcntl, __VA_ARGS__)
815 #endif
817 static inline int host_to_target_sock_type(int host_type)
819 int target_type;
821 switch (host_type & 0xf /* SOCK_TYPE_MASK */) {
822 case SOCK_DGRAM:
823 target_type = TARGET_SOCK_DGRAM;
824 break;
825 case SOCK_STREAM:
826 target_type = TARGET_SOCK_STREAM;
827 break;
828 default:
829 target_type = host_type & 0xf /* SOCK_TYPE_MASK */;
830 break;
833 #if defined(SOCK_CLOEXEC)
834 if (host_type & SOCK_CLOEXEC) {
835 target_type |= TARGET_SOCK_CLOEXEC;
837 #endif
839 #if defined(SOCK_NONBLOCK)
840 if (host_type & SOCK_NONBLOCK) {
841 target_type |= TARGET_SOCK_NONBLOCK;
843 #endif
845 return target_type;
848 static abi_ulong target_brk;
849 static abi_ulong target_original_brk;
850 static abi_ulong brk_page;
852 void target_set_brk(abi_ulong new_brk)
854 target_original_brk = target_brk = HOST_PAGE_ALIGN(new_brk);
855 brk_page = HOST_PAGE_ALIGN(target_brk);
858 //#define DEBUGF_BRK(message, args...) do { fprintf(stderr, (message), ## args); } while (0)
859 #define DEBUGF_BRK(message, args...)
861 /* do_brk() must return target values and target errnos. */
862 abi_long do_brk(abi_ulong new_brk)
864 abi_long mapped_addr;
865 abi_ulong new_alloc_size;
867 DEBUGF_BRK("do_brk(" TARGET_ABI_FMT_lx ") -> ", new_brk);
869 if (!new_brk) {
870 DEBUGF_BRK(TARGET_ABI_FMT_lx " (!new_brk)\n", target_brk);
871 return target_brk;
873 if (new_brk < target_original_brk) {
874 DEBUGF_BRK(TARGET_ABI_FMT_lx " (new_brk < target_original_brk)\n",
875 target_brk);
876 return target_brk;
879 /* If the new brk is less than the highest page reserved to the
880 * target heap allocation, set it and we're almost done... */
881 if (new_brk <= brk_page) {
882 /* Heap contents are initialized to zero, as for anonymous
883 * mapped pages. */
884 if (new_brk > target_brk) {
885 memset(g2h(target_brk), 0, new_brk - target_brk);
887 target_brk = new_brk;
888 DEBUGF_BRK(TARGET_ABI_FMT_lx " (new_brk <= brk_page)\n", target_brk);
889 return target_brk;
892 /* We need to allocate more memory after the brk... Note that
893 * we don't use MAP_FIXED because that will map over the top of
894 * any existing mapping (like the one with the host libc or qemu
895 * itself); instead we treat "mapped but at wrong address" as
896 * a failure and unmap again.
898 new_alloc_size = HOST_PAGE_ALIGN(new_brk - brk_page);
899 mapped_addr = get_errno(target_mmap(brk_page, new_alloc_size,
900 PROT_READ|PROT_WRITE,
901 MAP_ANON|MAP_PRIVATE, 0, 0));
903 if (mapped_addr == brk_page) {
904 /* Heap contents are initialized to zero, as for anonymous
905 * mapped pages. Technically the new pages are already
906 * initialized to zero since they *are* anonymous mapped
907 * pages, however we have to take care with the contents that
908 * come from the remaining part of the previous page: it may
909 * contains garbage data due to a previous heap usage (grown
910 * then shrunken). */
911 memset(g2h(target_brk), 0, brk_page - target_brk);
913 target_brk = new_brk;
914 brk_page = HOST_PAGE_ALIGN(target_brk);
915 DEBUGF_BRK(TARGET_ABI_FMT_lx " (mapped_addr == brk_page)\n",
916 target_brk);
917 return target_brk;
918 } else if (mapped_addr != -1) {
919 /* Mapped but at wrong address, meaning there wasn't actually
920 * enough space for this brk.
922 target_munmap(mapped_addr, new_alloc_size);
923 mapped_addr = -1;
924 DEBUGF_BRK(TARGET_ABI_FMT_lx " (mapped_addr != -1)\n", target_brk);
926 else {
927 DEBUGF_BRK(TARGET_ABI_FMT_lx " (otherwise)\n", target_brk);
930 #if defined(TARGET_ALPHA)
931 /* We (partially) emulate OSF/1 on Alpha, which requires we
932 return a proper errno, not an unchanged brk value. */
933 return -TARGET_ENOMEM;
934 #endif
935 /* For everything else, return the previous break. */
936 return target_brk;
939 static inline abi_long copy_from_user_fdset(fd_set *fds,
940 abi_ulong target_fds_addr,
941 int n)
943 int i, nw, j, k;
944 abi_ulong b, *target_fds;
946 nw = DIV_ROUND_UP(n, TARGET_ABI_BITS);
947 if (!(target_fds = lock_user(VERIFY_READ,
948 target_fds_addr,
949 sizeof(abi_ulong) * nw,
950 1)))
951 return -TARGET_EFAULT;
953 FD_ZERO(fds);
954 k = 0;
955 for (i = 0; i < nw; i++) {
956 /* grab the abi_ulong */
957 __get_user(b, &target_fds[i]);
958 for (j = 0; j < TARGET_ABI_BITS; j++) {
959 /* check the bit inside the abi_ulong */
960 if ((b >> j) & 1)
961 FD_SET(k, fds);
962 k++;
966 unlock_user(target_fds, target_fds_addr, 0);
968 return 0;
971 static inline abi_ulong copy_from_user_fdset_ptr(fd_set *fds, fd_set **fds_ptr,
972 abi_ulong target_fds_addr,
973 int n)
975 if (target_fds_addr) {
976 if (copy_from_user_fdset(fds, target_fds_addr, n))
977 return -TARGET_EFAULT;
978 *fds_ptr = fds;
979 } else {
980 *fds_ptr = NULL;
982 return 0;
985 static inline abi_long copy_to_user_fdset(abi_ulong target_fds_addr,
986 const fd_set *fds,
987 int n)
989 int i, nw, j, k;
990 abi_long v;
991 abi_ulong *target_fds;
993 nw = DIV_ROUND_UP(n, TARGET_ABI_BITS);
994 if (!(target_fds = lock_user(VERIFY_WRITE,
995 target_fds_addr,
996 sizeof(abi_ulong) * nw,
997 0)))
998 return -TARGET_EFAULT;
1000 k = 0;
1001 for (i = 0; i < nw; i++) {
1002 v = 0;
1003 for (j = 0; j < TARGET_ABI_BITS; j++) {
1004 v |= ((abi_ulong)(FD_ISSET(k, fds) != 0) << j);
1005 k++;
1007 __put_user(v, &target_fds[i]);
1010 unlock_user(target_fds, target_fds_addr, sizeof(abi_ulong) * nw);
1012 return 0;
1015 #if defined(__alpha__)
1016 #define HOST_HZ 1024
1017 #else
1018 #define HOST_HZ 100
1019 #endif
1021 static inline abi_long host_to_target_clock_t(long ticks)
1023 #if HOST_HZ == TARGET_HZ
1024 return ticks;
1025 #else
1026 return ((int64_t)ticks * TARGET_HZ) / HOST_HZ;
1027 #endif
1030 static inline abi_long host_to_target_rusage(abi_ulong target_addr,
1031 const struct rusage *rusage)
1033 struct target_rusage *target_rusage;
1035 if (!lock_user_struct(VERIFY_WRITE, target_rusage, target_addr, 0))
1036 return -TARGET_EFAULT;
1037 target_rusage->ru_utime.tv_sec = tswapal(rusage->ru_utime.tv_sec);
1038 target_rusage->ru_utime.tv_usec = tswapal(rusage->ru_utime.tv_usec);
1039 target_rusage->ru_stime.tv_sec = tswapal(rusage->ru_stime.tv_sec);
1040 target_rusage->ru_stime.tv_usec = tswapal(rusage->ru_stime.tv_usec);
1041 target_rusage->ru_maxrss = tswapal(rusage->ru_maxrss);
1042 target_rusage->ru_ixrss = tswapal(rusage->ru_ixrss);
1043 target_rusage->ru_idrss = tswapal(rusage->ru_idrss);
1044 target_rusage->ru_isrss = tswapal(rusage->ru_isrss);
1045 target_rusage->ru_minflt = tswapal(rusage->ru_minflt);
1046 target_rusage->ru_majflt = tswapal(rusage->ru_majflt);
1047 target_rusage->ru_nswap = tswapal(rusage->ru_nswap);
1048 target_rusage->ru_inblock = tswapal(rusage->ru_inblock);
1049 target_rusage->ru_oublock = tswapal(rusage->ru_oublock);
1050 target_rusage->ru_msgsnd = tswapal(rusage->ru_msgsnd);
1051 target_rusage->ru_msgrcv = tswapal(rusage->ru_msgrcv);
1052 target_rusage->ru_nsignals = tswapal(rusage->ru_nsignals);
1053 target_rusage->ru_nvcsw = tswapal(rusage->ru_nvcsw);
1054 target_rusage->ru_nivcsw = tswapal(rusage->ru_nivcsw);
1055 unlock_user_struct(target_rusage, target_addr, 1);
1057 return 0;
1060 static inline rlim_t target_to_host_rlim(abi_ulong target_rlim)
1062 abi_ulong target_rlim_swap;
1063 rlim_t result;
1065 target_rlim_swap = tswapal(target_rlim);
1066 if (target_rlim_swap == TARGET_RLIM_INFINITY)
1067 return RLIM_INFINITY;
1069 result = target_rlim_swap;
1070 if (target_rlim_swap != (rlim_t)result)
1071 return RLIM_INFINITY;
1073 return result;
1076 static inline abi_ulong host_to_target_rlim(rlim_t rlim)
1078 abi_ulong target_rlim_swap;
1079 abi_ulong result;
1081 if (rlim == RLIM_INFINITY || rlim != (abi_long)rlim)
1082 target_rlim_swap = TARGET_RLIM_INFINITY;
1083 else
1084 target_rlim_swap = rlim;
1085 result = tswapal(target_rlim_swap);
1087 return result;
1090 static inline int target_to_host_resource(int code)
1092 switch (code) {
1093 case TARGET_RLIMIT_AS:
1094 return RLIMIT_AS;
1095 case TARGET_RLIMIT_CORE:
1096 return RLIMIT_CORE;
1097 case TARGET_RLIMIT_CPU:
1098 return RLIMIT_CPU;
1099 case TARGET_RLIMIT_DATA:
1100 return RLIMIT_DATA;
1101 case TARGET_RLIMIT_FSIZE:
1102 return RLIMIT_FSIZE;
1103 case TARGET_RLIMIT_LOCKS:
1104 return RLIMIT_LOCKS;
1105 case TARGET_RLIMIT_MEMLOCK:
1106 return RLIMIT_MEMLOCK;
1107 case TARGET_RLIMIT_MSGQUEUE:
1108 return RLIMIT_MSGQUEUE;
1109 case TARGET_RLIMIT_NICE:
1110 return RLIMIT_NICE;
1111 case TARGET_RLIMIT_NOFILE:
1112 return RLIMIT_NOFILE;
1113 case TARGET_RLIMIT_NPROC:
1114 return RLIMIT_NPROC;
1115 case TARGET_RLIMIT_RSS:
1116 return RLIMIT_RSS;
1117 case TARGET_RLIMIT_RTPRIO:
1118 return RLIMIT_RTPRIO;
1119 case TARGET_RLIMIT_SIGPENDING:
1120 return RLIMIT_SIGPENDING;
1121 case TARGET_RLIMIT_STACK:
1122 return RLIMIT_STACK;
1123 default:
1124 return code;
1128 static inline abi_long copy_from_user_timeval(struct timeval *tv,
1129 abi_ulong target_tv_addr)
1131 struct target_timeval *target_tv;
1133 if (!lock_user_struct(VERIFY_READ, target_tv, target_tv_addr, 1)) {
1134 return -TARGET_EFAULT;
1137 __get_user(tv->tv_sec, &target_tv->tv_sec);
1138 __get_user(tv->tv_usec, &target_tv->tv_usec);
1140 unlock_user_struct(target_tv, target_tv_addr, 0);
1142 return 0;
1145 static inline abi_long copy_to_user_timeval(abi_ulong target_tv_addr,
1146 const struct timeval *tv)
1148 struct target_timeval *target_tv;
1150 if (!lock_user_struct(VERIFY_WRITE, target_tv, target_tv_addr, 0)) {
1151 return -TARGET_EFAULT;
1154 __put_user(tv->tv_sec, &target_tv->tv_sec);
1155 __put_user(tv->tv_usec, &target_tv->tv_usec);
1157 unlock_user_struct(target_tv, target_tv_addr, 1);
1159 return 0;
1162 static inline abi_long copy_to_user_timeval64(abi_ulong target_tv_addr,
1163 const struct timeval *tv)
1165 struct target__kernel_sock_timeval *target_tv;
1167 if (!lock_user_struct(VERIFY_WRITE, target_tv, target_tv_addr, 0)) {
1168 return -TARGET_EFAULT;
1171 __put_user(tv->tv_sec, &target_tv->tv_sec);
1172 __put_user(tv->tv_usec, &target_tv->tv_usec);
1174 unlock_user_struct(target_tv, target_tv_addr, 1);
1176 return 0;
1179 static inline abi_long target_to_host_timespec(struct timespec *host_ts,
1180 abi_ulong target_addr)
1182 struct target_timespec *target_ts;
1184 if (!lock_user_struct(VERIFY_READ, target_ts, target_addr, 1)) {
1185 return -TARGET_EFAULT;
1187 __get_user(host_ts->tv_sec, &target_ts->tv_sec);
1188 __get_user(host_ts->tv_nsec, &target_ts->tv_nsec);
1189 unlock_user_struct(target_ts, target_addr, 0);
1190 return 0;
1193 static inline abi_long host_to_target_timespec(abi_ulong target_addr,
1194 struct timespec *host_ts)
1196 struct target_timespec *target_ts;
1198 if (!lock_user_struct(VERIFY_WRITE, target_ts, target_addr, 0)) {
1199 return -TARGET_EFAULT;
1201 __put_user(host_ts->tv_sec, &target_ts->tv_sec);
1202 __put_user(host_ts->tv_nsec, &target_ts->tv_nsec);
1203 unlock_user_struct(target_ts, target_addr, 1);
1204 return 0;
1207 static inline abi_long host_to_target_timespec64(abi_ulong target_addr,
1208 struct timespec *host_ts)
1210 struct target__kernel_timespec *target_ts;
1212 if (!lock_user_struct(VERIFY_WRITE, target_ts, target_addr, 0)) {
1213 return -TARGET_EFAULT;
1215 __put_user(host_ts->tv_sec, &target_ts->tv_sec);
1216 __put_user(host_ts->tv_nsec, &target_ts->tv_nsec);
1217 unlock_user_struct(target_ts, target_addr, 1);
1218 return 0;
1221 static inline abi_long copy_from_user_timezone(struct timezone *tz,
1222 abi_ulong target_tz_addr)
1224 struct target_timezone *target_tz;
1226 if (!lock_user_struct(VERIFY_READ, target_tz, target_tz_addr, 1)) {
1227 return -TARGET_EFAULT;
1230 __get_user(tz->tz_minuteswest, &target_tz->tz_minuteswest);
1231 __get_user(tz->tz_dsttime, &target_tz->tz_dsttime);
1233 unlock_user_struct(target_tz, target_tz_addr, 0);
1235 return 0;
1238 #if defined(TARGET_NR_mq_open) && defined(__NR_mq_open)
1239 #include <mqueue.h>
1241 static inline abi_long copy_from_user_mq_attr(struct mq_attr *attr,
1242 abi_ulong target_mq_attr_addr)
1244 struct target_mq_attr *target_mq_attr;
1246 if (!lock_user_struct(VERIFY_READ, target_mq_attr,
1247 target_mq_attr_addr, 1))
1248 return -TARGET_EFAULT;
1250 __get_user(attr->mq_flags, &target_mq_attr->mq_flags);
1251 __get_user(attr->mq_maxmsg, &target_mq_attr->mq_maxmsg);
1252 __get_user(attr->mq_msgsize, &target_mq_attr->mq_msgsize);
1253 __get_user(attr->mq_curmsgs, &target_mq_attr->mq_curmsgs);
1255 unlock_user_struct(target_mq_attr, target_mq_attr_addr, 0);
1257 return 0;
1260 static inline abi_long copy_to_user_mq_attr(abi_ulong target_mq_attr_addr,
1261 const struct mq_attr *attr)
1263 struct target_mq_attr *target_mq_attr;
1265 if (!lock_user_struct(VERIFY_WRITE, target_mq_attr,
1266 target_mq_attr_addr, 0))
1267 return -TARGET_EFAULT;
1269 __put_user(attr->mq_flags, &target_mq_attr->mq_flags);
1270 __put_user(attr->mq_maxmsg, &target_mq_attr->mq_maxmsg);
1271 __put_user(attr->mq_msgsize, &target_mq_attr->mq_msgsize);
1272 __put_user(attr->mq_curmsgs, &target_mq_attr->mq_curmsgs);
1274 unlock_user_struct(target_mq_attr, target_mq_attr_addr, 1);
1276 return 0;
1278 #endif
1280 #if defined(TARGET_NR_select) || defined(TARGET_NR__newselect)
1281 /* do_select() must return target values and target errnos. */
1282 static abi_long do_select(int n,
1283 abi_ulong rfd_addr, abi_ulong wfd_addr,
1284 abi_ulong efd_addr, abi_ulong target_tv_addr)
1286 fd_set rfds, wfds, efds;
1287 fd_set *rfds_ptr, *wfds_ptr, *efds_ptr;
1288 struct timeval tv;
1289 struct timespec ts, *ts_ptr;
1290 abi_long ret;
1292 ret = copy_from_user_fdset_ptr(&rfds, &rfds_ptr, rfd_addr, n);
1293 if (ret) {
1294 return ret;
1296 ret = copy_from_user_fdset_ptr(&wfds, &wfds_ptr, wfd_addr, n);
1297 if (ret) {
1298 return ret;
1300 ret = copy_from_user_fdset_ptr(&efds, &efds_ptr, efd_addr, n);
1301 if (ret) {
1302 return ret;
1305 if (target_tv_addr) {
1306 if (copy_from_user_timeval(&tv, target_tv_addr))
1307 return -TARGET_EFAULT;
1308 ts.tv_sec = tv.tv_sec;
1309 ts.tv_nsec = tv.tv_usec * 1000;
1310 ts_ptr = &ts;
1311 } else {
1312 ts_ptr = NULL;
1315 ret = get_errno(safe_pselect6(n, rfds_ptr, wfds_ptr, efds_ptr,
1316 ts_ptr, NULL));
1318 if (!is_error(ret)) {
1319 if (rfd_addr && copy_to_user_fdset(rfd_addr, &rfds, n))
1320 return -TARGET_EFAULT;
1321 if (wfd_addr && copy_to_user_fdset(wfd_addr, &wfds, n))
1322 return -TARGET_EFAULT;
1323 if (efd_addr && copy_to_user_fdset(efd_addr, &efds, n))
1324 return -TARGET_EFAULT;
1326 if (target_tv_addr) {
1327 tv.tv_sec = ts.tv_sec;
1328 tv.tv_usec = ts.tv_nsec / 1000;
1329 if (copy_to_user_timeval(target_tv_addr, &tv)) {
1330 return -TARGET_EFAULT;
1335 return ret;
1338 #if defined(TARGET_WANT_OLD_SYS_SELECT)
1339 static abi_long do_old_select(abi_ulong arg1)
1341 struct target_sel_arg_struct *sel;
1342 abi_ulong inp, outp, exp, tvp;
1343 long nsel;
1345 if (!lock_user_struct(VERIFY_READ, sel, arg1, 1)) {
1346 return -TARGET_EFAULT;
1349 nsel = tswapal(sel->n);
1350 inp = tswapal(sel->inp);
1351 outp = tswapal(sel->outp);
1352 exp = tswapal(sel->exp);
1353 tvp = tswapal(sel->tvp);
1355 unlock_user_struct(sel, arg1, 0);
1357 return do_select(nsel, inp, outp, exp, tvp);
1359 #endif
1360 #endif
1362 static abi_long do_pipe2(int host_pipe[], int flags)
1364 #ifdef CONFIG_PIPE2
1365 return pipe2(host_pipe, flags);
1366 #else
1367 return -ENOSYS;
1368 #endif
1371 static abi_long do_pipe(void *cpu_env, abi_ulong pipedes,
1372 int flags, int is_pipe2)
1374 int host_pipe[2];
1375 abi_long ret;
1376 ret = flags ? do_pipe2(host_pipe, flags) : pipe(host_pipe);
1378 if (is_error(ret))
1379 return get_errno(ret);
1381 /* Several targets have special calling conventions for the original
1382 pipe syscall, but didn't replicate this into the pipe2 syscall. */
1383 if (!is_pipe2) {
1384 #if defined(TARGET_ALPHA)
1385 ((CPUAlphaState *)cpu_env)->ir[IR_A4] = host_pipe[1];
1386 return host_pipe[0];
1387 #elif defined(TARGET_MIPS)
1388 ((CPUMIPSState*)cpu_env)->active_tc.gpr[3] = host_pipe[1];
1389 return host_pipe[0];
1390 #elif defined(TARGET_SH4)
1391 ((CPUSH4State*)cpu_env)->gregs[1] = host_pipe[1];
1392 return host_pipe[0];
1393 #elif defined(TARGET_SPARC)
1394 ((CPUSPARCState*)cpu_env)->regwptr[1] = host_pipe[1];
1395 return host_pipe[0];
1396 #endif
1399 if (put_user_s32(host_pipe[0], pipedes)
1400 || put_user_s32(host_pipe[1], pipedes + sizeof(host_pipe[0])))
1401 return -TARGET_EFAULT;
1402 return get_errno(ret);
1405 static inline abi_long target_to_host_ip_mreq(struct ip_mreqn *mreqn,
1406 abi_ulong target_addr,
1407 socklen_t len)
1409 struct target_ip_mreqn *target_smreqn;
1411 target_smreqn = lock_user(VERIFY_READ, target_addr, len, 1);
1412 if (!target_smreqn)
1413 return -TARGET_EFAULT;
1414 mreqn->imr_multiaddr.s_addr = target_smreqn->imr_multiaddr.s_addr;
1415 mreqn->imr_address.s_addr = target_smreqn->imr_address.s_addr;
1416 if (len == sizeof(struct target_ip_mreqn))
1417 mreqn->imr_ifindex = tswapal(target_smreqn->imr_ifindex);
1418 unlock_user(target_smreqn, target_addr, 0);
1420 return 0;
1423 static inline abi_long target_to_host_sockaddr(int fd, struct sockaddr *addr,
1424 abi_ulong target_addr,
1425 socklen_t len)
1427 const socklen_t unix_maxlen = sizeof (struct sockaddr_un);
1428 sa_family_t sa_family;
1429 struct target_sockaddr *target_saddr;
1431 if (fd_trans_target_to_host_addr(fd)) {
1432 return fd_trans_target_to_host_addr(fd)(addr, target_addr, len);
1435 target_saddr = lock_user(VERIFY_READ, target_addr, len, 1);
1436 if (!target_saddr)
1437 return -TARGET_EFAULT;
1439 sa_family = tswap16(target_saddr->sa_family);
1441 /* Oops. The caller might send a incomplete sun_path; sun_path
1442 * must be terminated by \0 (see the manual page), but
1443 * unfortunately it is quite common to specify sockaddr_un
1444 * length as "strlen(x->sun_path)" while it should be
1445 * "strlen(...) + 1". We'll fix that here if needed.
1446 * Linux kernel has a similar feature.
1449 if (sa_family == AF_UNIX) {
1450 if (len < unix_maxlen && len > 0) {
1451 char *cp = (char*)target_saddr;
1453 if ( cp[len-1] && !cp[len] )
1454 len++;
1456 if (len > unix_maxlen)
1457 len = unix_maxlen;
1460 memcpy(addr, target_saddr, len);
1461 addr->sa_family = sa_family;
1462 if (sa_family == AF_NETLINK) {
1463 struct sockaddr_nl *nladdr;
1465 nladdr = (struct sockaddr_nl *)addr;
1466 nladdr->nl_pid = tswap32(nladdr->nl_pid);
1467 nladdr->nl_groups = tswap32(nladdr->nl_groups);
1468 } else if (sa_family == AF_PACKET) {
1469 struct target_sockaddr_ll *lladdr;
1471 lladdr = (struct target_sockaddr_ll *)addr;
1472 lladdr->sll_ifindex = tswap32(lladdr->sll_ifindex);
1473 lladdr->sll_hatype = tswap16(lladdr->sll_hatype);
1475 unlock_user(target_saddr, target_addr, 0);
1477 return 0;
1480 static inline abi_long host_to_target_sockaddr(abi_ulong target_addr,
1481 struct sockaddr *addr,
1482 socklen_t len)
1484 struct target_sockaddr *target_saddr;
1486 if (len == 0) {
1487 return 0;
1489 assert(addr);
1491 target_saddr = lock_user(VERIFY_WRITE, target_addr, len, 0);
1492 if (!target_saddr)
1493 return -TARGET_EFAULT;
1494 memcpy(target_saddr, addr, len);
1495 if (len >= offsetof(struct target_sockaddr, sa_family) +
1496 sizeof(target_saddr->sa_family)) {
1497 target_saddr->sa_family = tswap16(addr->sa_family);
1499 if (addr->sa_family == AF_NETLINK && len >= sizeof(struct sockaddr_nl)) {
1500 struct sockaddr_nl *target_nl = (struct sockaddr_nl *)target_saddr;
1501 target_nl->nl_pid = tswap32(target_nl->nl_pid);
1502 target_nl->nl_groups = tswap32(target_nl->nl_groups);
1503 } else if (addr->sa_family == AF_PACKET) {
1504 struct sockaddr_ll *target_ll = (struct sockaddr_ll *)target_saddr;
1505 target_ll->sll_ifindex = tswap32(target_ll->sll_ifindex);
1506 target_ll->sll_hatype = tswap16(target_ll->sll_hatype);
1507 } else if (addr->sa_family == AF_INET6 &&
1508 len >= sizeof(struct target_sockaddr_in6)) {
1509 struct target_sockaddr_in6 *target_in6 =
1510 (struct target_sockaddr_in6 *)target_saddr;
1511 target_in6->sin6_scope_id = tswap16(target_in6->sin6_scope_id);
1513 unlock_user(target_saddr, target_addr, len);
1515 return 0;
1518 static inline abi_long target_to_host_cmsg(struct msghdr *msgh,
1519 struct target_msghdr *target_msgh)
1521 struct cmsghdr *cmsg = CMSG_FIRSTHDR(msgh);
1522 abi_long msg_controllen;
1523 abi_ulong target_cmsg_addr;
1524 struct target_cmsghdr *target_cmsg, *target_cmsg_start;
1525 socklen_t space = 0;
1527 msg_controllen = tswapal(target_msgh->msg_controllen);
1528 if (msg_controllen < sizeof (struct target_cmsghdr))
1529 goto the_end;
1530 target_cmsg_addr = tswapal(target_msgh->msg_control);
1531 target_cmsg = lock_user(VERIFY_READ, target_cmsg_addr, msg_controllen, 1);
1532 target_cmsg_start = target_cmsg;
1533 if (!target_cmsg)
1534 return -TARGET_EFAULT;
1536 while (cmsg && target_cmsg) {
1537 void *data = CMSG_DATA(cmsg);
1538 void *target_data = TARGET_CMSG_DATA(target_cmsg);
1540 int len = tswapal(target_cmsg->cmsg_len)
1541 - sizeof(struct target_cmsghdr);
1543 space += CMSG_SPACE(len);
1544 if (space > msgh->msg_controllen) {
1545 space -= CMSG_SPACE(len);
1546 /* This is a QEMU bug, since we allocated the payload
1547 * area ourselves (unlike overflow in host-to-target
1548 * conversion, which is just the guest giving us a buffer
1549 * that's too small). It can't happen for the payload types
1550 * we currently support; if it becomes an issue in future
1551 * we would need to improve our allocation strategy to
1552 * something more intelligent than "twice the size of the
1553 * target buffer we're reading from".
1555 gemu_log("Host cmsg overflow\n");
1556 break;
1559 if (tswap32(target_cmsg->cmsg_level) == TARGET_SOL_SOCKET) {
1560 cmsg->cmsg_level = SOL_SOCKET;
1561 } else {
1562 cmsg->cmsg_level = tswap32(target_cmsg->cmsg_level);
1564 cmsg->cmsg_type = tswap32(target_cmsg->cmsg_type);
1565 cmsg->cmsg_len = CMSG_LEN(len);
1567 if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_RIGHTS) {
1568 int *fd = (int *)data;
1569 int *target_fd = (int *)target_data;
1570 int i, numfds = len / sizeof(int);
1572 for (i = 0; i < numfds; i++) {
1573 __get_user(fd[i], target_fd + i);
1575 } else if (cmsg->cmsg_level == SOL_SOCKET
1576 && cmsg->cmsg_type == SCM_CREDENTIALS) {
1577 struct ucred *cred = (struct ucred *)data;
1578 struct target_ucred *target_cred =
1579 (struct target_ucred *)target_data;
1581 __get_user(cred->pid, &target_cred->pid);
1582 __get_user(cred->uid, &target_cred->uid);
1583 __get_user(cred->gid, &target_cred->gid);
1584 } else {
1585 gemu_log("Unsupported ancillary data: %d/%d\n",
1586 cmsg->cmsg_level, cmsg->cmsg_type);
1587 memcpy(data, target_data, len);
1590 cmsg = CMSG_NXTHDR(msgh, cmsg);
1591 target_cmsg = TARGET_CMSG_NXTHDR(target_msgh, target_cmsg,
1592 target_cmsg_start);
1594 unlock_user(target_cmsg, target_cmsg_addr, 0);
1595 the_end:
1596 msgh->msg_controllen = space;
1597 return 0;
1600 static inline abi_long host_to_target_cmsg(struct target_msghdr *target_msgh,
1601 struct msghdr *msgh)
1603 struct cmsghdr *cmsg = CMSG_FIRSTHDR(msgh);
1604 abi_long msg_controllen;
1605 abi_ulong target_cmsg_addr;
1606 struct target_cmsghdr *target_cmsg, *target_cmsg_start;
1607 socklen_t space = 0;
1609 msg_controllen = tswapal(target_msgh->msg_controllen);
1610 if (msg_controllen < sizeof (struct target_cmsghdr))
1611 goto the_end;
1612 target_cmsg_addr = tswapal(target_msgh->msg_control);
1613 target_cmsg = lock_user(VERIFY_WRITE, target_cmsg_addr, msg_controllen, 0);
1614 target_cmsg_start = target_cmsg;
1615 if (!target_cmsg)
1616 return -TARGET_EFAULT;
1618 while (cmsg && target_cmsg) {
1619 void *data = CMSG_DATA(cmsg);
1620 void *target_data = TARGET_CMSG_DATA(target_cmsg);
1622 int len = cmsg->cmsg_len - sizeof(struct cmsghdr);
1623 int tgt_len, tgt_space;
1625 /* We never copy a half-header but may copy half-data;
1626 * this is Linux's behaviour in put_cmsg(). Note that
1627 * truncation here is a guest problem (which we report
1628 * to the guest via the CTRUNC bit), unlike truncation
1629 * in target_to_host_cmsg, which is a QEMU bug.
1631 if (msg_controllen < sizeof(struct target_cmsghdr)) {
1632 target_msgh->msg_flags |= tswap32(MSG_CTRUNC);
1633 break;
1636 if (cmsg->cmsg_level == SOL_SOCKET) {
1637 target_cmsg->cmsg_level = tswap32(TARGET_SOL_SOCKET);
1638 } else {
1639 target_cmsg->cmsg_level = tswap32(cmsg->cmsg_level);
1641 target_cmsg->cmsg_type = tswap32(cmsg->cmsg_type);
1643 /* Payload types which need a different size of payload on
1644 * the target must adjust tgt_len here.
1646 tgt_len = len;
1647 switch (cmsg->cmsg_level) {
1648 case SOL_SOCKET:
1649 switch (cmsg->cmsg_type) {
1650 case SO_TIMESTAMP:
1651 tgt_len = sizeof(struct target_timeval);
1652 break;
1653 default:
1654 break;
1656 break;
1657 default:
1658 break;
1661 if (msg_controllen < TARGET_CMSG_LEN(tgt_len)) {
1662 target_msgh->msg_flags |= tswap32(MSG_CTRUNC);
1663 tgt_len = msg_controllen - sizeof(struct target_cmsghdr);
1666 /* We must now copy-and-convert len bytes of payload
1667 * into tgt_len bytes of destination space. Bear in mind
1668 * that in both source and destination we may be dealing
1669 * with a truncated value!
1671 switch (cmsg->cmsg_level) {
1672 case SOL_SOCKET:
1673 switch (cmsg->cmsg_type) {
1674 case SCM_RIGHTS:
1676 int *fd = (int *)data;
1677 int *target_fd = (int *)target_data;
1678 int i, numfds = tgt_len / sizeof(int);
1680 for (i = 0; i < numfds; i++) {
1681 __put_user(fd[i], target_fd + i);
1683 break;
1685 case SO_TIMESTAMP:
1687 struct timeval *tv = (struct timeval *)data;
1688 struct target_timeval *target_tv =
1689 (struct target_timeval *)target_data;
1691 if (len != sizeof(struct timeval) ||
1692 tgt_len != sizeof(struct target_timeval)) {
1693 goto unimplemented;
1696 /* copy struct timeval to target */
1697 __put_user(tv->tv_sec, &target_tv->tv_sec);
1698 __put_user(tv->tv_usec, &target_tv->tv_usec);
1699 break;
1701 case SCM_CREDENTIALS:
1703 struct ucred *cred = (struct ucred *)data;
1704 struct target_ucred *target_cred =
1705 (struct target_ucred *)target_data;
1707 __put_user(cred->pid, &target_cred->pid);
1708 __put_user(cred->uid, &target_cred->uid);
1709 __put_user(cred->gid, &target_cred->gid);
1710 break;
1712 default:
1713 goto unimplemented;
1715 break;
1717 case SOL_IP:
1718 switch (cmsg->cmsg_type) {
1719 case IP_TTL:
1721 uint32_t *v = (uint32_t *)data;
1722 uint32_t *t_int = (uint32_t *)target_data;
1724 if (len != sizeof(uint32_t) ||
1725 tgt_len != sizeof(uint32_t)) {
1726 goto unimplemented;
1728 __put_user(*v, t_int);
1729 break;
1731 case IP_RECVERR:
1733 struct errhdr_t {
1734 struct sock_extended_err ee;
1735 struct sockaddr_in offender;
1737 struct errhdr_t *errh = (struct errhdr_t *)data;
1738 struct errhdr_t *target_errh =
1739 (struct errhdr_t *)target_data;
1741 if (len != sizeof(struct errhdr_t) ||
1742 tgt_len != sizeof(struct errhdr_t)) {
1743 goto unimplemented;
1745 __put_user(errh->ee.ee_errno, &target_errh->ee.ee_errno);
1746 __put_user(errh->ee.ee_origin, &target_errh->ee.ee_origin);
1747 __put_user(errh->ee.ee_type, &target_errh->ee.ee_type);
1748 __put_user(errh->ee.ee_code, &target_errh->ee.ee_code);
1749 __put_user(errh->ee.ee_pad, &target_errh->ee.ee_pad);
1750 __put_user(errh->ee.ee_info, &target_errh->ee.ee_info);
1751 __put_user(errh->ee.ee_data, &target_errh->ee.ee_data);
1752 host_to_target_sockaddr((unsigned long) &target_errh->offender,
1753 (void *) &errh->offender, sizeof(errh->offender));
1754 break;
1756 default:
1757 goto unimplemented;
1759 break;
1761 case SOL_IPV6:
1762 switch (cmsg->cmsg_type) {
1763 case IPV6_HOPLIMIT:
1765 uint32_t *v = (uint32_t *)data;
1766 uint32_t *t_int = (uint32_t *)target_data;
1768 if (len != sizeof(uint32_t) ||
1769 tgt_len != sizeof(uint32_t)) {
1770 goto unimplemented;
1772 __put_user(*v, t_int);
1773 break;
1775 case IPV6_RECVERR:
1777 struct errhdr6_t {
1778 struct sock_extended_err ee;
1779 struct sockaddr_in6 offender;
1781 struct errhdr6_t *errh = (struct errhdr6_t *)data;
1782 struct errhdr6_t *target_errh =
1783 (struct errhdr6_t *)target_data;
1785 if (len != sizeof(struct errhdr6_t) ||
1786 tgt_len != sizeof(struct errhdr6_t)) {
1787 goto unimplemented;
1789 __put_user(errh->ee.ee_errno, &target_errh->ee.ee_errno);
1790 __put_user(errh->ee.ee_origin, &target_errh->ee.ee_origin);
1791 __put_user(errh->ee.ee_type, &target_errh->ee.ee_type);
1792 __put_user(errh->ee.ee_code, &target_errh->ee.ee_code);
1793 __put_user(errh->ee.ee_pad, &target_errh->ee.ee_pad);
1794 __put_user(errh->ee.ee_info, &target_errh->ee.ee_info);
1795 __put_user(errh->ee.ee_data, &target_errh->ee.ee_data);
1796 host_to_target_sockaddr((unsigned long) &target_errh->offender,
1797 (void *) &errh->offender, sizeof(errh->offender));
1798 break;
1800 default:
1801 goto unimplemented;
1803 break;
1805 default:
1806 unimplemented:
1807 gemu_log("Unsupported ancillary data: %d/%d\n",
1808 cmsg->cmsg_level, cmsg->cmsg_type);
1809 memcpy(target_data, data, MIN(len, tgt_len));
1810 if (tgt_len > len) {
1811 memset(target_data + len, 0, tgt_len - len);
1815 target_cmsg->cmsg_len = tswapal(TARGET_CMSG_LEN(tgt_len));
1816 tgt_space = TARGET_CMSG_SPACE(tgt_len);
1817 if (msg_controllen < tgt_space) {
1818 tgt_space = msg_controllen;
1820 msg_controllen -= tgt_space;
1821 space += tgt_space;
1822 cmsg = CMSG_NXTHDR(msgh, cmsg);
1823 target_cmsg = TARGET_CMSG_NXTHDR(target_msgh, target_cmsg,
1824 target_cmsg_start);
1826 unlock_user(target_cmsg, target_cmsg_addr, space);
1827 the_end:
1828 target_msgh->msg_controllen = tswapal(space);
1829 return 0;
1832 /* do_setsockopt() Must return target values and target errnos. */
1833 static abi_long do_setsockopt(int sockfd, int level, int optname,
1834 abi_ulong optval_addr, socklen_t optlen)
1836 abi_long ret;
1837 int val;
1838 struct ip_mreqn *ip_mreq;
1839 struct ip_mreq_source *ip_mreq_source;
1841 switch(level) {
1842 case SOL_TCP:
1843 /* TCP options all take an 'int' value. */
1844 if (optlen < sizeof(uint32_t))
1845 return -TARGET_EINVAL;
1847 if (get_user_u32(val, optval_addr))
1848 return -TARGET_EFAULT;
1849 ret = get_errno(setsockopt(sockfd, level, optname, &val, sizeof(val)));
1850 break;
1851 case SOL_IP:
1852 switch(optname) {
1853 case IP_TOS:
1854 case IP_TTL:
1855 case IP_HDRINCL:
1856 case IP_ROUTER_ALERT:
1857 case IP_RECVOPTS:
1858 case IP_RETOPTS:
1859 case IP_PKTINFO:
1860 case IP_MTU_DISCOVER:
1861 case IP_RECVERR:
1862 case IP_RECVTTL:
1863 case IP_RECVTOS:
1864 #ifdef IP_FREEBIND
1865 case IP_FREEBIND:
1866 #endif
1867 case IP_MULTICAST_TTL:
1868 case IP_MULTICAST_LOOP:
1869 val = 0;
1870 if (optlen >= sizeof(uint32_t)) {
1871 if (get_user_u32(val, optval_addr))
1872 return -TARGET_EFAULT;
1873 } else if (optlen >= 1) {
1874 if (get_user_u8(val, optval_addr))
1875 return -TARGET_EFAULT;
1877 ret = get_errno(setsockopt(sockfd, level, optname, &val, sizeof(val)));
1878 break;
1879 case IP_ADD_MEMBERSHIP:
1880 case IP_DROP_MEMBERSHIP:
1881 if (optlen < sizeof (struct target_ip_mreq) ||
1882 optlen > sizeof (struct target_ip_mreqn))
1883 return -TARGET_EINVAL;
1885 ip_mreq = (struct ip_mreqn *) alloca(optlen);
1886 target_to_host_ip_mreq(ip_mreq, optval_addr, optlen);
1887 ret = get_errno(setsockopt(sockfd, level, optname, ip_mreq, optlen));
1888 break;
1890 case IP_BLOCK_SOURCE:
1891 case IP_UNBLOCK_SOURCE:
1892 case IP_ADD_SOURCE_MEMBERSHIP:
1893 case IP_DROP_SOURCE_MEMBERSHIP:
1894 if (optlen != sizeof (struct target_ip_mreq_source))
1895 return -TARGET_EINVAL;
1897 ip_mreq_source = lock_user(VERIFY_READ, optval_addr, optlen, 1);
1898 ret = get_errno(setsockopt(sockfd, level, optname, ip_mreq_source, optlen));
1899 unlock_user (ip_mreq_source, optval_addr, 0);
1900 break;
1902 default:
1903 goto unimplemented;
1905 break;
1906 case SOL_IPV6:
1907 switch (optname) {
1908 case IPV6_MTU_DISCOVER:
1909 case IPV6_MTU:
1910 case IPV6_V6ONLY:
1911 case IPV6_RECVPKTINFO:
1912 case IPV6_UNICAST_HOPS:
1913 case IPV6_MULTICAST_HOPS:
1914 case IPV6_MULTICAST_LOOP:
1915 case IPV6_RECVERR:
1916 case IPV6_RECVHOPLIMIT:
1917 case IPV6_2292HOPLIMIT:
1918 case IPV6_CHECKSUM:
1919 case IPV6_ADDRFORM:
1920 case IPV6_2292PKTINFO:
1921 case IPV6_RECVTCLASS:
1922 case IPV6_RECVRTHDR:
1923 case IPV6_2292RTHDR:
1924 case IPV6_RECVHOPOPTS:
1925 case IPV6_2292HOPOPTS:
1926 case IPV6_RECVDSTOPTS:
1927 case IPV6_2292DSTOPTS:
1928 case IPV6_TCLASS:
1929 #ifdef IPV6_RECVPATHMTU
1930 case IPV6_RECVPATHMTU:
1931 #endif
1932 #ifdef IPV6_TRANSPARENT
1933 case IPV6_TRANSPARENT:
1934 #endif
1935 #ifdef IPV6_FREEBIND
1936 case IPV6_FREEBIND:
1937 #endif
1938 #ifdef IPV6_RECVORIGDSTADDR
1939 case IPV6_RECVORIGDSTADDR:
1940 #endif
1941 val = 0;
1942 if (optlen < sizeof(uint32_t)) {
1943 return -TARGET_EINVAL;
1945 if (get_user_u32(val, optval_addr)) {
1946 return -TARGET_EFAULT;
1948 ret = get_errno(setsockopt(sockfd, level, optname,
1949 &val, sizeof(val)));
1950 break;
1951 case IPV6_PKTINFO:
1953 struct in6_pktinfo pki;
1955 if (optlen < sizeof(pki)) {
1956 return -TARGET_EINVAL;
1959 if (copy_from_user(&pki, optval_addr, sizeof(pki))) {
1960 return -TARGET_EFAULT;
1963 pki.ipi6_ifindex = tswap32(pki.ipi6_ifindex);
1965 ret = get_errno(setsockopt(sockfd, level, optname,
1966 &pki, sizeof(pki)));
1967 break;
1969 case IPV6_ADD_MEMBERSHIP:
1970 case IPV6_DROP_MEMBERSHIP:
1972 struct ipv6_mreq ipv6mreq;
1974 if (optlen < sizeof(ipv6mreq)) {
1975 return -TARGET_EINVAL;
1978 if (copy_from_user(&ipv6mreq, optval_addr, sizeof(ipv6mreq))) {
1979 return -TARGET_EFAULT;
1982 ipv6mreq.ipv6mr_interface = tswap32(ipv6mreq.ipv6mr_interface);
1984 ret = get_errno(setsockopt(sockfd, level, optname,
1985 &ipv6mreq, sizeof(ipv6mreq)));
1986 break;
1988 default:
1989 goto unimplemented;
1991 break;
1992 case SOL_ICMPV6:
1993 switch (optname) {
1994 case ICMPV6_FILTER:
1996 struct icmp6_filter icmp6f;
1998 if (optlen > sizeof(icmp6f)) {
1999 optlen = sizeof(icmp6f);
2002 if (copy_from_user(&icmp6f, optval_addr, optlen)) {
2003 return -TARGET_EFAULT;
2006 for (val = 0; val < 8; val++) {
2007 icmp6f.data[val] = tswap32(icmp6f.data[val]);
2010 ret = get_errno(setsockopt(sockfd, level, optname,
2011 &icmp6f, optlen));
2012 break;
2014 default:
2015 goto unimplemented;
2017 break;
2018 case SOL_RAW:
2019 switch (optname) {
2020 case ICMP_FILTER:
2021 case IPV6_CHECKSUM:
2022 /* those take an u32 value */
2023 if (optlen < sizeof(uint32_t)) {
2024 return -TARGET_EINVAL;
2027 if (get_user_u32(val, optval_addr)) {
2028 return -TARGET_EFAULT;
2030 ret = get_errno(setsockopt(sockfd, level, optname,
2031 &val, sizeof(val)));
2032 break;
2034 default:
2035 goto unimplemented;
2037 break;
2038 #if defined(SOL_ALG) && defined(ALG_SET_KEY) && defined(ALG_SET_AEAD_AUTHSIZE)
2039 case SOL_ALG:
2040 switch (optname) {
2041 case ALG_SET_KEY:
2043 char *alg_key = g_malloc(optlen);
2045 if (!alg_key) {
2046 return -TARGET_ENOMEM;
2048 if (copy_from_user(alg_key, optval_addr, optlen)) {
2049 g_free(alg_key);
2050 return -TARGET_EFAULT;
2052 ret = get_errno(setsockopt(sockfd, level, optname,
2053 alg_key, optlen));
2054 g_free(alg_key);
2055 break;
2057 case ALG_SET_AEAD_AUTHSIZE:
2059 ret = get_errno(setsockopt(sockfd, level, optname,
2060 NULL, optlen));
2061 break;
2063 default:
2064 goto unimplemented;
2066 break;
2067 #endif
2068 case TARGET_SOL_SOCKET:
2069 switch (optname) {
2070 case TARGET_SO_RCVTIMEO:
2072 struct timeval tv;
2074 optname = SO_RCVTIMEO;
2076 set_timeout:
2077 if (optlen != sizeof(struct target_timeval)) {
2078 return -TARGET_EINVAL;
2081 if (copy_from_user_timeval(&tv, optval_addr)) {
2082 return -TARGET_EFAULT;
2085 ret = get_errno(setsockopt(sockfd, SOL_SOCKET, optname,
2086 &tv, sizeof(tv)));
2087 return ret;
2089 case TARGET_SO_SNDTIMEO:
2090 optname = SO_SNDTIMEO;
2091 goto set_timeout;
2092 case TARGET_SO_ATTACH_FILTER:
2094 struct target_sock_fprog *tfprog;
2095 struct target_sock_filter *tfilter;
2096 struct sock_fprog fprog;
2097 struct sock_filter *filter;
2098 int i;
2100 if (optlen != sizeof(*tfprog)) {
2101 return -TARGET_EINVAL;
2103 if (!lock_user_struct(VERIFY_READ, tfprog, optval_addr, 0)) {
2104 return -TARGET_EFAULT;
2106 if (!lock_user_struct(VERIFY_READ, tfilter,
2107 tswapal(tfprog->filter), 0)) {
2108 unlock_user_struct(tfprog, optval_addr, 1);
2109 return -TARGET_EFAULT;
2112 fprog.len = tswap16(tfprog->len);
2113 filter = g_try_new(struct sock_filter, fprog.len);
2114 if (filter == NULL) {
2115 unlock_user_struct(tfilter, tfprog->filter, 1);
2116 unlock_user_struct(tfprog, optval_addr, 1);
2117 return -TARGET_ENOMEM;
2119 for (i = 0; i < fprog.len; i++) {
2120 filter[i].code = tswap16(tfilter[i].code);
2121 filter[i].jt = tfilter[i].jt;
2122 filter[i].jf = tfilter[i].jf;
2123 filter[i].k = tswap32(tfilter[i].k);
2125 fprog.filter = filter;
2127 ret = get_errno(setsockopt(sockfd, SOL_SOCKET,
2128 SO_ATTACH_FILTER, &fprog, sizeof(fprog)));
2129 g_free(filter);
2131 unlock_user_struct(tfilter, tfprog->filter, 1);
2132 unlock_user_struct(tfprog, optval_addr, 1);
2133 return ret;
2135 case TARGET_SO_BINDTODEVICE:
2137 char *dev_ifname, *addr_ifname;
2139 if (optlen > IFNAMSIZ - 1) {
2140 optlen = IFNAMSIZ - 1;
2142 dev_ifname = lock_user(VERIFY_READ, optval_addr, optlen, 1);
2143 if (!dev_ifname) {
2144 return -TARGET_EFAULT;
2146 optname = SO_BINDTODEVICE;
2147 addr_ifname = alloca(IFNAMSIZ);
2148 memcpy(addr_ifname, dev_ifname, optlen);
2149 addr_ifname[optlen] = 0;
2150 ret = get_errno(setsockopt(sockfd, SOL_SOCKET, optname,
2151 addr_ifname, optlen));
2152 unlock_user (dev_ifname, optval_addr, 0);
2153 return ret;
2155 case TARGET_SO_LINGER:
2157 struct linger lg;
2158 struct target_linger *tlg;
2160 if (optlen != sizeof(struct target_linger)) {
2161 return -TARGET_EINVAL;
2163 if (!lock_user_struct(VERIFY_READ, tlg, optval_addr, 1)) {
2164 return -TARGET_EFAULT;
2166 __get_user(lg.l_onoff, &tlg->l_onoff);
2167 __get_user(lg.l_linger, &tlg->l_linger);
2168 ret = get_errno(setsockopt(sockfd, SOL_SOCKET, SO_LINGER,
2169 &lg, sizeof(lg)));
2170 unlock_user_struct(tlg, optval_addr, 0);
2171 return ret;
2173 /* Options with 'int' argument. */
2174 case TARGET_SO_DEBUG:
2175 optname = SO_DEBUG;
2176 break;
2177 case TARGET_SO_REUSEADDR:
2178 optname = SO_REUSEADDR;
2179 break;
2180 #ifdef SO_REUSEPORT
2181 case TARGET_SO_REUSEPORT:
2182 optname = SO_REUSEPORT;
2183 break;
2184 #endif
2185 case TARGET_SO_TYPE:
2186 optname = SO_TYPE;
2187 break;
2188 case TARGET_SO_ERROR:
2189 optname = SO_ERROR;
2190 break;
2191 case TARGET_SO_DONTROUTE:
2192 optname = SO_DONTROUTE;
2193 break;
2194 case TARGET_SO_BROADCAST:
2195 optname = SO_BROADCAST;
2196 break;
2197 case TARGET_SO_SNDBUF:
2198 optname = SO_SNDBUF;
2199 break;
2200 case TARGET_SO_SNDBUFFORCE:
2201 optname = SO_SNDBUFFORCE;
2202 break;
2203 case TARGET_SO_RCVBUF:
2204 optname = SO_RCVBUF;
2205 break;
2206 case TARGET_SO_RCVBUFFORCE:
2207 optname = SO_RCVBUFFORCE;
2208 break;
2209 case TARGET_SO_KEEPALIVE:
2210 optname = SO_KEEPALIVE;
2211 break;
2212 case TARGET_SO_OOBINLINE:
2213 optname = SO_OOBINLINE;
2214 break;
2215 case TARGET_SO_NO_CHECK:
2216 optname = SO_NO_CHECK;
2217 break;
2218 case TARGET_SO_PRIORITY:
2219 optname = SO_PRIORITY;
2220 break;
2221 #ifdef SO_BSDCOMPAT
2222 case TARGET_SO_BSDCOMPAT:
2223 optname = SO_BSDCOMPAT;
2224 break;
2225 #endif
2226 case TARGET_SO_PASSCRED:
2227 optname = SO_PASSCRED;
2228 break;
2229 case TARGET_SO_PASSSEC:
2230 optname = SO_PASSSEC;
2231 break;
2232 case TARGET_SO_TIMESTAMP:
2233 optname = SO_TIMESTAMP;
2234 break;
2235 case TARGET_SO_RCVLOWAT:
2236 optname = SO_RCVLOWAT;
2237 break;
2238 default:
2239 goto unimplemented;
2241 if (optlen < sizeof(uint32_t))
2242 return -TARGET_EINVAL;
2244 if (get_user_u32(val, optval_addr))
2245 return -TARGET_EFAULT;
2246 ret = get_errno(setsockopt(sockfd, SOL_SOCKET, optname, &val, sizeof(val)));
2247 break;
2248 default:
2249 unimplemented:
2250 gemu_log("Unsupported setsockopt level=%d optname=%d\n", level, optname);
2251 ret = -TARGET_ENOPROTOOPT;
2253 return ret;
2256 /* do_getsockopt() Must return target values and target errnos. */
2257 static abi_long do_getsockopt(int sockfd, int level, int optname,
2258 abi_ulong optval_addr, abi_ulong optlen)
2260 abi_long ret;
2261 int len, val;
2262 socklen_t lv;
2264 switch(level) {
2265 case TARGET_SOL_SOCKET:
2266 level = SOL_SOCKET;
2267 switch (optname) {
2268 /* These don't just return a single integer */
2269 case TARGET_SO_RCVTIMEO:
2270 case TARGET_SO_SNDTIMEO:
2271 case TARGET_SO_PEERNAME:
2272 goto unimplemented;
2273 case TARGET_SO_PEERCRED: {
2274 struct ucred cr;
2275 socklen_t crlen;
2276 struct target_ucred *tcr;
2278 if (get_user_u32(len, optlen)) {
2279 return -TARGET_EFAULT;
2281 if (len < 0) {
2282 return -TARGET_EINVAL;
2285 crlen = sizeof(cr);
2286 ret = get_errno(getsockopt(sockfd, level, SO_PEERCRED,
2287 &cr, &crlen));
2288 if (ret < 0) {
2289 return ret;
2291 if (len > crlen) {
2292 len = crlen;
2294 if (!lock_user_struct(VERIFY_WRITE, tcr, optval_addr, 0)) {
2295 return -TARGET_EFAULT;
2297 __put_user(cr.pid, &tcr->pid);
2298 __put_user(cr.uid, &tcr->uid);
2299 __put_user(cr.gid, &tcr->gid);
2300 unlock_user_struct(tcr, optval_addr, 1);
2301 if (put_user_u32(len, optlen)) {
2302 return -TARGET_EFAULT;
2304 break;
2306 case TARGET_SO_LINGER:
2308 struct linger lg;
2309 socklen_t lglen;
2310 struct target_linger *tlg;
2312 if (get_user_u32(len, optlen)) {
2313 return -TARGET_EFAULT;
2315 if (len < 0) {
2316 return -TARGET_EINVAL;
2319 lglen = sizeof(lg);
2320 ret = get_errno(getsockopt(sockfd, level, SO_LINGER,
2321 &lg, &lglen));
2322 if (ret < 0) {
2323 return ret;
2325 if (len > lglen) {
2326 len = lglen;
2328 if (!lock_user_struct(VERIFY_WRITE, tlg, optval_addr, 0)) {
2329 return -TARGET_EFAULT;
2331 __put_user(lg.l_onoff, &tlg->l_onoff);
2332 __put_user(lg.l_linger, &tlg->l_linger);
2333 unlock_user_struct(tlg, optval_addr, 1);
2334 if (put_user_u32(len, optlen)) {
2335 return -TARGET_EFAULT;
2337 break;
2339 /* Options with 'int' argument. */
2340 case TARGET_SO_DEBUG:
2341 optname = SO_DEBUG;
2342 goto int_case;
2343 case TARGET_SO_REUSEADDR:
2344 optname = SO_REUSEADDR;
2345 goto int_case;
2346 #ifdef SO_REUSEPORT
2347 case TARGET_SO_REUSEPORT:
2348 optname = SO_REUSEPORT;
2349 goto int_case;
2350 #endif
2351 case TARGET_SO_TYPE:
2352 optname = SO_TYPE;
2353 goto int_case;
2354 case TARGET_SO_ERROR:
2355 optname = SO_ERROR;
2356 goto int_case;
2357 case TARGET_SO_DONTROUTE:
2358 optname = SO_DONTROUTE;
2359 goto int_case;
2360 case TARGET_SO_BROADCAST:
2361 optname = SO_BROADCAST;
2362 goto int_case;
2363 case TARGET_SO_SNDBUF:
2364 optname = SO_SNDBUF;
2365 goto int_case;
2366 case TARGET_SO_RCVBUF:
2367 optname = SO_RCVBUF;
2368 goto int_case;
2369 case TARGET_SO_KEEPALIVE:
2370 optname = SO_KEEPALIVE;
2371 goto int_case;
2372 case TARGET_SO_OOBINLINE:
2373 optname = SO_OOBINLINE;
2374 goto int_case;
2375 case TARGET_SO_NO_CHECK:
2376 optname = SO_NO_CHECK;
2377 goto int_case;
2378 case TARGET_SO_PRIORITY:
2379 optname = SO_PRIORITY;
2380 goto int_case;
2381 #ifdef SO_BSDCOMPAT
2382 case TARGET_SO_BSDCOMPAT:
2383 optname = SO_BSDCOMPAT;
2384 goto int_case;
2385 #endif
2386 case TARGET_SO_PASSCRED:
2387 optname = SO_PASSCRED;
2388 goto int_case;
2389 case TARGET_SO_TIMESTAMP:
2390 optname = SO_TIMESTAMP;
2391 goto int_case;
2392 case TARGET_SO_RCVLOWAT:
2393 optname = SO_RCVLOWAT;
2394 goto int_case;
2395 case TARGET_SO_ACCEPTCONN:
2396 optname = SO_ACCEPTCONN;
2397 goto int_case;
2398 default:
2399 goto int_case;
2401 break;
2402 case SOL_TCP:
2403 /* TCP options all take an 'int' value. */
2404 int_case:
2405 if (get_user_u32(len, optlen))
2406 return -TARGET_EFAULT;
2407 if (len < 0)
2408 return -TARGET_EINVAL;
2409 lv = sizeof(lv);
2410 ret = get_errno(getsockopt(sockfd, level, optname, &val, &lv));
2411 if (ret < 0)
2412 return ret;
2413 if (optname == SO_TYPE) {
2414 val = host_to_target_sock_type(val);
2416 if (len > lv)
2417 len = lv;
2418 if (len == 4) {
2419 if (put_user_u32(val, optval_addr))
2420 return -TARGET_EFAULT;
2421 } else {
2422 if (put_user_u8(val, optval_addr))
2423 return -TARGET_EFAULT;
2425 if (put_user_u32(len, optlen))
2426 return -TARGET_EFAULT;
2427 break;
2428 case SOL_IP:
2429 switch(optname) {
2430 case IP_TOS:
2431 case IP_TTL:
2432 case IP_HDRINCL:
2433 case IP_ROUTER_ALERT:
2434 case IP_RECVOPTS:
2435 case IP_RETOPTS:
2436 case IP_PKTINFO:
2437 case IP_MTU_DISCOVER:
2438 case IP_RECVERR:
2439 case IP_RECVTOS:
2440 #ifdef IP_FREEBIND
2441 case IP_FREEBIND:
2442 #endif
2443 case IP_MULTICAST_TTL:
2444 case IP_MULTICAST_LOOP:
2445 if (get_user_u32(len, optlen))
2446 return -TARGET_EFAULT;
2447 if (len < 0)
2448 return -TARGET_EINVAL;
2449 lv = sizeof(lv);
2450 ret = get_errno(getsockopt(sockfd, level, optname, &val, &lv));
2451 if (ret < 0)
2452 return ret;
2453 if (len < sizeof(int) && len > 0 && val >= 0 && val < 255) {
2454 len = 1;
2455 if (put_user_u32(len, optlen)
2456 || put_user_u8(val, optval_addr))
2457 return -TARGET_EFAULT;
2458 } else {
2459 if (len > sizeof(int))
2460 len = sizeof(int);
2461 if (put_user_u32(len, optlen)
2462 || put_user_u32(val, optval_addr))
2463 return -TARGET_EFAULT;
2465 break;
2466 default:
2467 ret = -TARGET_ENOPROTOOPT;
2468 break;
2470 break;
2471 case SOL_IPV6:
2472 switch (optname) {
2473 case IPV6_MTU_DISCOVER:
2474 case IPV6_MTU:
2475 case IPV6_V6ONLY:
2476 case IPV6_RECVPKTINFO:
2477 case IPV6_UNICAST_HOPS:
2478 case IPV6_MULTICAST_HOPS:
2479 case IPV6_MULTICAST_LOOP:
2480 case IPV6_RECVERR:
2481 case IPV6_RECVHOPLIMIT:
2482 case IPV6_2292HOPLIMIT:
2483 case IPV6_CHECKSUM:
2484 case IPV6_ADDRFORM:
2485 case IPV6_2292PKTINFO:
2486 case IPV6_RECVTCLASS:
2487 case IPV6_RECVRTHDR:
2488 case IPV6_2292RTHDR:
2489 case IPV6_RECVHOPOPTS:
2490 case IPV6_2292HOPOPTS:
2491 case IPV6_RECVDSTOPTS:
2492 case IPV6_2292DSTOPTS:
2493 case IPV6_TCLASS:
2494 #ifdef IPV6_RECVPATHMTU
2495 case IPV6_RECVPATHMTU:
2496 #endif
2497 #ifdef IPV6_TRANSPARENT
2498 case IPV6_TRANSPARENT:
2499 #endif
2500 #ifdef IPV6_FREEBIND
2501 case IPV6_FREEBIND:
2502 #endif
2503 #ifdef IPV6_RECVORIGDSTADDR
2504 case IPV6_RECVORIGDSTADDR:
2505 #endif
2506 if (get_user_u32(len, optlen))
2507 return -TARGET_EFAULT;
2508 if (len < 0)
2509 return -TARGET_EINVAL;
2510 lv = sizeof(lv);
2511 ret = get_errno(getsockopt(sockfd, level, optname, &val, &lv));
2512 if (ret < 0)
2513 return ret;
2514 if (len < sizeof(int) && len > 0 && val >= 0 && val < 255) {
2515 len = 1;
2516 if (put_user_u32(len, optlen)
2517 || put_user_u8(val, optval_addr))
2518 return -TARGET_EFAULT;
2519 } else {
2520 if (len > sizeof(int))
2521 len = sizeof(int);
2522 if (put_user_u32(len, optlen)
2523 || put_user_u32(val, optval_addr))
2524 return -TARGET_EFAULT;
2526 break;
2527 default:
2528 ret = -TARGET_ENOPROTOOPT;
2529 break;
2531 break;
2532 default:
2533 unimplemented:
2534 gemu_log("getsockopt level=%d optname=%d not yet supported\n",
2535 level, optname);
2536 ret = -TARGET_EOPNOTSUPP;
2537 break;
2539 return ret;
2542 /* Convert target low/high pair representing file offset into the host
2543 * low/high pair. This function doesn't handle offsets bigger than 64 bits
2544 * as the kernel doesn't handle them either.
2546 static void target_to_host_low_high(abi_ulong tlow,
2547 abi_ulong thigh,
2548 unsigned long *hlow,
2549 unsigned long *hhigh)
2551 uint64_t off = tlow |
2552 ((unsigned long long)thigh << TARGET_LONG_BITS / 2) <<
2553 TARGET_LONG_BITS / 2;
2555 *hlow = off;
2556 *hhigh = (off >> HOST_LONG_BITS / 2) >> HOST_LONG_BITS / 2;
2559 static struct iovec *lock_iovec(int type, abi_ulong target_addr,
2560 abi_ulong count, int copy)
2562 struct target_iovec *target_vec;
2563 struct iovec *vec;
2564 abi_ulong total_len, max_len;
2565 int i;
2566 int err = 0;
2567 bool bad_address = false;
2569 if (count == 0) {
2570 errno = 0;
2571 return NULL;
2573 if (count > IOV_MAX) {
2574 errno = EINVAL;
2575 return NULL;
2578 vec = g_try_new0(struct iovec, count);
2579 if (vec == NULL) {
2580 errno = ENOMEM;
2581 return NULL;
2584 target_vec = lock_user(VERIFY_READ, target_addr,
2585 count * sizeof(struct target_iovec), 1);
2586 if (target_vec == NULL) {
2587 err = EFAULT;
2588 goto fail2;
2591 /* ??? If host page size > target page size, this will result in a
2592 value larger than what we can actually support. */
2593 max_len = 0x7fffffff & TARGET_PAGE_MASK;
2594 total_len = 0;
2596 for (i = 0; i < count; i++) {
2597 abi_ulong base = tswapal(target_vec[i].iov_base);
2598 abi_long len = tswapal(target_vec[i].iov_len);
2600 if (len < 0) {
2601 err = EINVAL;
2602 goto fail;
2603 } else if (len == 0) {
2604 /* Zero length pointer is ignored. */
2605 vec[i].iov_base = 0;
2606 } else {
2607 vec[i].iov_base = lock_user(type, base, len, copy);
2608 /* If the first buffer pointer is bad, this is a fault. But
2609 * subsequent bad buffers will result in a partial write; this
2610 * is realized by filling the vector with null pointers and
2611 * zero lengths. */
2612 if (!vec[i].iov_base) {
2613 if (i == 0) {
2614 err = EFAULT;
2615 goto fail;
2616 } else {
2617 bad_address = true;
2620 if (bad_address) {
2621 len = 0;
2623 if (len > max_len - total_len) {
2624 len = max_len - total_len;
2627 vec[i].iov_len = len;
2628 total_len += len;
2631 unlock_user(target_vec, target_addr, 0);
2632 return vec;
2634 fail:
2635 while (--i >= 0) {
2636 if (tswapal(target_vec[i].iov_len) > 0) {
2637 unlock_user(vec[i].iov_base, tswapal(target_vec[i].iov_base), 0);
2640 unlock_user(target_vec, target_addr, 0);
2641 fail2:
2642 g_free(vec);
2643 errno = err;
2644 return NULL;
2647 static void unlock_iovec(struct iovec *vec, abi_ulong target_addr,
2648 abi_ulong count, int copy)
2650 struct target_iovec *target_vec;
2651 int i;
2653 target_vec = lock_user(VERIFY_READ, target_addr,
2654 count * sizeof(struct target_iovec), 1);
2655 if (target_vec) {
2656 for (i = 0; i < count; i++) {
2657 abi_ulong base = tswapal(target_vec[i].iov_base);
2658 abi_long len = tswapal(target_vec[i].iov_len);
2659 if (len < 0) {
2660 break;
2662 unlock_user(vec[i].iov_base, base, copy ? vec[i].iov_len : 0);
2664 unlock_user(target_vec, target_addr, 0);
2667 g_free(vec);
2670 static inline int target_to_host_sock_type(int *type)
2672 int host_type = 0;
2673 int target_type = *type;
2675 switch (target_type & TARGET_SOCK_TYPE_MASK) {
2676 case TARGET_SOCK_DGRAM:
2677 host_type = SOCK_DGRAM;
2678 break;
2679 case TARGET_SOCK_STREAM:
2680 host_type = SOCK_STREAM;
2681 break;
2682 default:
2683 host_type = target_type & TARGET_SOCK_TYPE_MASK;
2684 break;
2686 if (target_type & TARGET_SOCK_CLOEXEC) {
2687 #if defined(SOCK_CLOEXEC)
2688 host_type |= SOCK_CLOEXEC;
2689 #else
2690 return -TARGET_EINVAL;
2691 #endif
2693 if (target_type & TARGET_SOCK_NONBLOCK) {
2694 #if defined(SOCK_NONBLOCK)
2695 host_type |= SOCK_NONBLOCK;
2696 #elif !defined(O_NONBLOCK)
2697 return -TARGET_EINVAL;
2698 #endif
2700 *type = host_type;
2701 return 0;
2704 /* Try to emulate socket type flags after socket creation. */
2705 static int sock_flags_fixup(int fd, int target_type)
2707 #if !defined(SOCK_NONBLOCK) && defined(O_NONBLOCK)
2708 if (target_type & TARGET_SOCK_NONBLOCK) {
2709 int flags = fcntl(fd, F_GETFL);
2710 if (fcntl(fd, F_SETFL, O_NONBLOCK | flags) == -1) {
2711 close(fd);
2712 return -TARGET_EINVAL;
2715 #endif
2716 return fd;
2719 /* do_socket() Must return target values and target errnos. */
2720 static abi_long do_socket(int domain, int type, int protocol)
2722 int target_type = type;
2723 int ret;
2725 ret = target_to_host_sock_type(&type);
2726 if (ret) {
2727 return ret;
2730 if (domain == PF_NETLINK && !(
2731 #ifdef CONFIG_RTNETLINK
2732 protocol == NETLINK_ROUTE ||
2733 #endif
2734 protocol == NETLINK_KOBJECT_UEVENT ||
2735 protocol == NETLINK_AUDIT)) {
2736 return -EPFNOSUPPORT;
2739 if (domain == AF_PACKET ||
2740 (domain == AF_INET && type == SOCK_PACKET)) {
2741 protocol = tswap16(protocol);
2744 ret = get_errno(socket(domain, type, protocol));
2745 if (ret >= 0) {
2746 ret = sock_flags_fixup(ret, target_type);
2747 if (type == SOCK_PACKET) {
2748 /* Manage an obsolete case :
2749 * if socket type is SOCK_PACKET, bind by name
2751 fd_trans_register(ret, &target_packet_trans);
2752 } else if (domain == PF_NETLINK) {
2753 switch (protocol) {
2754 #ifdef CONFIG_RTNETLINK
2755 case NETLINK_ROUTE:
2756 fd_trans_register(ret, &target_netlink_route_trans);
2757 break;
2758 #endif
2759 case NETLINK_KOBJECT_UEVENT:
2760 /* nothing to do: messages are strings */
2761 break;
2762 case NETLINK_AUDIT:
2763 fd_trans_register(ret, &target_netlink_audit_trans);
2764 break;
2765 default:
2766 g_assert_not_reached();
2770 return ret;
2773 /* do_bind() Must return target values and target errnos. */
2774 static abi_long do_bind(int sockfd, abi_ulong target_addr,
2775 socklen_t addrlen)
2777 void *addr;
2778 abi_long ret;
2780 if ((int)addrlen < 0) {
2781 return -TARGET_EINVAL;
2784 addr = alloca(addrlen+1);
2786 ret = target_to_host_sockaddr(sockfd, addr, target_addr, addrlen);
2787 if (ret)
2788 return ret;
2790 return get_errno(bind(sockfd, addr, addrlen));
2793 /* do_connect() Must return target values and target errnos. */
2794 static abi_long do_connect(int sockfd, abi_ulong target_addr,
2795 socklen_t addrlen)
2797 void *addr;
2798 abi_long ret;
2800 if ((int)addrlen < 0) {
2801 return -TARGET_EINVAL;
2804 addr = alloca(addrlen+1);
2806 ret = target_to_host_sockaddr(sockfd, addr, target_addr, addrlen);
2807 if (ret)
2808 return ret;
2810 return get_errno(safe_connect(sockfd, addr, addrlen));
2813 /* do_sendrecvmsg_locked() Must return target values and target errnos. */
2814 static abi_long do_sendrecvmsg_locked(int fd, struct target_msghdr *msgp,
2815 int flags, int send)
2817 abi_long ret, len;
2818 struct msghdr msg;
2819 abi_ulong count;
2820 struct iovec *vec;
2821 abi_ulong target_vec;
2823 if (msgp->msg_name) {
2824 msg.msg_namelen = tswap32(msgp->msg_namelen);
2825 msg.msg_name = alloca(msg.msg_namelen+1);
2826 ret = target_to_host_sockaddr(fd, msg.msg_name,
2827 tswapal(msgp->msg_name),
2828 msg.msg_namelen);
2829 if (ret == -TARGET_EFAULT) {
2830 /* For connected sockets msg_name and msg_namelen must
2831 * be ignored, so returning EFAULT immediately is wrong.
2832 * Instead, pass a bad msg_name to the host kernel, and
2833 * let it decide whether to return EFAULT or not.
2835 msg.msg_name = (void *)-1;
2836 } else if (ret) {
2837 goto out2;
2839 } else {
2840 msg.msg_name = NULL;
2841 msg.msg_namelen = 0;
2843 msg.msg_controllen = 2 * tswapal(msgp->msg_controllen);
2844 msg.msg_control = alloca(msg.msg_controllen);
2845 memset(msg.msg_control, 0, msg.msg_controllen);
2847 msg.msg_flags = tswap32(msgp->msg_flags);
2849 count = tswapal(msgp->msg_iovlen);
2850 target_vec = tswapal(msgp->msg_iov);
2852 if (count > IOV_MAX) {
2853 /* sendrcvmsg returns a different errno for this condition than
2854 * readv/writev, so we must catch it here before lock_iovec() does.
2856 ret = -TARGET_EMSGSIZE;
2857 goto out2;
2860 vec = lock_iovec(send ? VERIFY_READ : VERIFY_WRITE,
2861 target_vec, count, send);
2862 if (vec == NULL) {
2863 ret = -host_to_target_errno(errno);
2864 goto out2;
2866 msg.msg_iovlen = count;
2867 msg.msg_iov = vec;
2869 if (send) {
2870 if (fd_trans_target_to_host_data(fd)) {
2871 void *host_msg;
2873 host_msg = g_malloc(msg.msg_iov->iov_len);
2874 memcpy(host_msg, msg.msg_iov->iov_base, msg.msg_iov->iov_len);
2875 ret = fd_trans_target_to_host_data(fd)(host_msg,
2876 msg.msg_iov->iov_len);
2877 if (ret >= 0) {
2878 msg.msg_iov->iov_base = host_msg;
2879 ret = get_errno(safe_sendmsg(fd, &msg, flags));
2881 g_free(host_msg);
2882 } else {
2883 ret = target_to_host_cmsg(&msg, msgp);
2884 if (ret == 0) {
2885 ret = get_errno(safe_sendmsg(fd, &msg, flags));
2888 } else {
2889 ret = get_errno(safe_recvmsg(fd, &msg, flags));
2890 if (!is_error(ret)) {
2891 len = ret;
2892 if (fd_trans_host_to_target_data(fd)) {
2893 ret = fd_trans_host_to_target_data(fd)(msg.msg_iov->iov_base,
2894 MIN(msg.msg_iov->iov_len, len));
2895 } else {
2896 ret = host_to_target_cmsg(msgp, &msg);
2898 if (!is_error(ret)) {
2899 msgp->msg_namelen = tswap32(msg.msg_namelen);
2900 msgp->msg_flags = tswap32(msg.msg_flags);
2901 if (msg.msg_name != NULL && msg.msg_name != (void *)-1) {
2902 ret = host_to_target_sockaddr(tswapal(msgp->msg_name),
2903 msg.msg_name, msg.msg_namelen);
2904 if (ret) {
2905 goto out;
2909 ret = len;
2914 out:
2915 unlock_iovec(vec, target_vec, count, !send);
2916 out2:
2917 return ret;
2920 static abi_long do_sendrecvmsg(int fd, abi_ulong target_msg,
2921 int flags, int send)
2923 abi_long ret;
2924 struct target_msghdr *msgp;
2926 if (!lock_user_struct(send ? VERIFY_READ : VERIFY_WRITE,
2927 msgp,
2928 target_msg,
2929 send ? 1 : 0)) {
2930 return -TARGET_EFAULT;
2932 ret = do_sendrecvmsg_locked(fd, msgp, flags, send);
2933 unlock_user_struct(msgp, target_msg, send ? 0 : 1);
2934 return ret;
2937 /* We don't rely on the C library to have sendmmsg/recvmmsg support,
2938 * so it might not have this *mmsg-specific flag either.
2940 #ifndef MSG_WAITFORONE
2941 #define MSG_WAITFORONE 0x10000
2942 #endif
2944 static abi_long do_sendrecvmmsg(int fd, abi_ulong target_msgvec,
2945 unsigned int vlen, unsigned int flags,
2946 int send)
2948 struct target_mmsghdr *mmsgp;
2949 abi_long ret = 0;
2950 int i;
2952 if (vlen > UIO_MAXIOV) {
2953 vlen = UIO_MAXIOV;
2956 mmsgp = lock_user(VERIFY_WRITE, target_msgvec, sizeof(*mmsgp) * vlen, 1);
2957 if (!mmsgp) {
2958 return -TARGET_EFAULT;
2961 for (i = 0; i < vlen; i++) {
2962 ret = do_sendrecvmsg_locked(fd, &mmsgp[i].msg_hdr, flags, send);
2963 if (is_error(ret)) {
2964 break;
2966 mmsgp[i].msg_len = tswap32(ret);
2967 /* MSG_WAITFORONE turns on MSG_DONTWAIT after one packet */
2968 if (flags & MSG_WAITFORONE) {
2969 flags |= MSG_DONTWAIT;
2973 unlock_user(mmsgp, target_msgvec, sizeof(*mmsgp) * i);
2975 /* Return number of datagrams sent if we sent any at all;
2976 * otherwise return the error.
2978 if (i) {
2979 return i;
2981 return ret;
2984 /* do_accept4() Must return target values and target errnos. */
2985 static abi_long do_accept4(int fd, abi_ulong target_addr,
2986 abi_ulong target_addrlen_addr, int flags)
2988 socklen_t addrlen, ret_addrlen;
2989 void *addr;
2990 abi_long ret;
2991 int host_flags;
2993 host_flags = target_to_host_bitmask(flags, fcntl_flags_tbl);
2995 if (target_addr == 0) {
2996 return get_errno(safe_accept4(fd, NULL, NULL, host_flags));
2999 /* linux returns EINVAL if addrlen pointer is invalid */
3000 if (get_user_u32(addrlen, target_addrlen_addr))
3001 return -TARGET_EINVAL;
3003 if ((int)addrlen < 0) {
3004 return -TARGET_EINVAL;
3007 if (!access_ok(VERIFY_WRITE, target_addr, addrlen))
3008 return -TARGET_EINVAL;
3010 addr = alloca(addrlen);
3012 ret_addrlen = addrlen;
3013 ret = get_errno(safe_accept4(fd, addr, &ret_addrlen, host_flags));
3014 if (!is_error(ret)) {
3015 host_to_target_sockaddr(target_addr, addr, MIN(addrlen, ret_addrlen));
3016 if (put_user_u32(ret_addrlen, target_addrlen_addr)) {
3017 ret = -TARGET_EFAULT;
3020 return ret;
3023 /* do_getpeername() Must return target values and target errnos. */
3024 static abi_long do_getpeername(int fd, abi_ulong target_addr,
3025 abi_ulong target_addrlen_addr)
3027 socklen_t addrlen, ret_addrlen;
3028 void *addr;
3029 abi_long ret;
3031 if (get_user_u32(addrlen, target_addrlen_addr))
3032 return -TARGET_EFAULT;
3034 if ((int)addrlen < 0) {
3035 return -TARGET_EINVAL;
3038 if (!access_ok(VERIFY_WRITE, target_addr, addrlen))
3039 return -TARGET_EFAULT;
3041 addr = alloca(addrlen);
3043 ret_addrlen = addrlen;
3044 ret = get_errno(getpeername(fd, addr, &ret_addrlen));
3045 if (!is_error(ret)) {
3046 host_to_target_sockaddr(target_addr, addr, MIN(addrlen, ret_addrlen));
3047 if (put_user_u32(ret_addrlen, target_addrlen_addr)) {
3048 ret = -TARGET_EFAULT;
3051 return ret;
3054 /* do_getsockname() Must return target values and target errnos. */
3055 static abi_long do_getsockname(int fd, abi_ulong target_addr,
3056 abi_ulong target_addrlen_addr)
3058 socklen_t addrlen, ret_addrlen;
3059 void *addr;
3060 abi_long ret;
3062 if (get_user_u32(addrlen, target_addrlen_addr))
3063 return -TARGET_EFAULT;
3065 if ((int)addrlen < 0) {
3066 return -TARGET_EINVAL;
3069 if (!access_ok(VERIFY_WRITE, target_addr, addrlen))
3070 return -TARGET_EFAULT;
3072 addr = alloca(addrlen);
3074 ret_addrlen = addrlen;
3075 ret = get_errno(getsockname(fd, addr, &ret_addrlen));
3076 if (!is_error(ret)) {
3077 host_to_target_sockaddr(target_addr, addr, MIN(addrlen, ret_addrlen));
3078 if (put_user_u32(ret_addrlen, target_addrlen_addr)) {
3079 ret = -TARGET_EFAULT;
3082 return ret;
3085 /* do_socketpair() Must return target values and target errnos. */
3086 static abi_long do_socketpair(int domain, int type, int protocol,
3087 abi_ulong target_tab_addr)
3089 int tab[2];
3090 abi_long ret;
3092 target_to_host_sock_type(&type);
3094 ret = get_errno(socketpair(domain, type, protocol, tab));
3095 if (!is_error(ret)) {
3096 if (put_user_s32(tab[0], target_tab_addr)
3097 || put_user_s32(tab[1], target_tab_addr + sizeof(tab[0])))
3098 ret = -TARGET_EFAULT;
3100 return ret;
3103 /* do_sendto() Must return target values and target errnos. */
3104 static abi_long do_sendto(int fd, abi_ulong msg, size_t len, int flags,
3105 abi_ulong target_addr, socklen_t addrlen)
3107 void *addr;
3108 void *host_msg;
3109 void *copy_msg = NULL;
3110 abi_long ret;
3112 if ((int)addrlen < 0) {
3113 return -TARGET_EINVAL;
3116 host_msg = lock_user(VERIFY_READ, msg, len, 1);
3117 if (!host_msg)
3118 return -TARGET_EFAULT;
3119 if (fd_trans_target_to_host_data(fd)) {
3120 copy_msg = host_msg;
3121 host_msg = g_malloc(len);
3122 memcpy(host_msg, copy_msg, len);
3123 ret = fd_trans_target_to_host_data(fd)(host_msg, len);
3124 if (ret < 0) {
3125 goto fail;
3128 if (target_addr) {
3129 addr = alloca(addrlen+1);
3130 ret = target_to_host_sockaddr(fd, addr, target_addr, addrlen);
3131 if (ret) {
3132 goto fail;
3134 ret = get_errno(safe_sendto(fd, host_msg, len, flags, addr, addrlen));
3135 } else {
3136 ret = get_errno(safe_sendto(fd, host_msg, len, flags, NULL, 0));
3138 fail:
3139 if (copy_msg) {
3140 g_free(host_msg);
3141 host_msg = copy_msg;
3143 unlock_user(host_msg, msg, 0);
3144 return ret;
3147 /* do_recvfrom() Must return target values and target errnos. */
3148 static abi_long do_recvfrom(int fd, abi_ulong msg, size_t len, int flags,
3149 abi_ulong target_addr,
3150 abi_ulong target_addrlen)
3152 socklen_t addrlen, ret_addrlen;
3153 void *addr;
3154 void *host_msg;
3155 abi_long ret;
3157 host_msg = lock_user(VERIFY_WRITE, msg, len, 0);
3158 if (!host_msg)
3159 return -TARGET_EFAULT;
3160 if (target_addr) {
3161 if (get_user_u32(addrlen, target_addrlen)) {
3162 ret = -TARGET_EFAULT;
3163 goto fail;
3165 if ((int)addrlen < 0) {
3166 ret = -TARGET_EINVAL;
3167 goto fail;
3169 addr = alloca(addrlen);
3170 ret_addrlen = addrlen;
3171 ret = get_errno(safe_recvfrom(fd, host_msg, len, flags,
3172 addr, &ret_addrlen));
3173 } else {
3174 addr = NULL; /* To keep compiler quiet. */
3175 addrlen = 0; /* To keep compiler quiet. */
3176 ret = get_errno(safe_recvfrom(fd, host_msg, len, flags, NULL, 0));
3178 if (!is_error(ret)) {
3179 if (fd_trans_host_to_target_data(fd)) {
3180 abi_long trans;
3181 trans = fd_trans_host_to_target_data(fd)(host_msg, MIN(ret, len));
3182 if (is_error(trans)) {
3183 ret = trans;
3184 goto fail;
3187 if (target_addr) {
3188 host_to_target_sockaddr(target_addr, addr,
3189 MIN(addrlen, ret_addrlen));
3190 if (put_user_u32(ret_addrlen, target_addrlen)) {
3191 ret = -TARGET_EFAULT;
3192 goto fail;
3195 unlock_user(host_msg, msg, len);
3196 } else {
3197 fail:
3198 unlock_user(host_msg, msg, 0);
3200 return ret;
3203 #ifdef TARGET_NR_socketcall
3204 /* do_socketcall() must return target values and target errnos. */
3205 static abi_long do_socketcall(int num, abi_ulong vptr)
3207 static const unsigned nargs[] = { /* number of arguments per operation */
3208 [TARGET_SYS_SOCKET] = 3, /* domain, type, protocol */
3209 [TARGET_SYS_BIND] = 3, /* fd, addr, addrlen */
3210 [TARGET_SYS_CONNECT] = 3, /* fd, addr, addrlen */
3211 [TARGET_SYS_LISTEN] = 2, /* fd, backlog */
3212 [TARGET_SYS_ACCEPT] = 3, /* fd, addr, addrlen */
3213 [TARGET_SYS_GETSOCKNAME] = 3, /* fd, addr, addrlen */
3214 [TARGET_SYS_GETPEERNAME] = 3, /* fd, addr, addrlen */
3215 [TARGET_SYS_SOCKETPAIR] = 4, /* domain, type, protocol, tab */
3216 [TARGET_SYS_SEND] = 4, /* fd, msg, len, flags */
3217 [TARGET_SYS_RECV] = 4, /* fd, msg, len, flags */
3218 [TARGET_SYS_SENDTO] = 6, /* fd, msg, len, flags, addr, addrlen */
3219 [TARGET_SYS_RECVFROM] = 6, /* fd, msg, len, flags, addr, addrlen */
3220 [TARGET_SYS_SHUTDOWN] = 2, /* fd, how */
3221 [TARGET_SYS_SETSOCKOPT] = 5, /* fd, level, optname, optval, optlen */
3222 [TARGET_SYS_GETSOCKOPT] = 5, /* fd, level, optname, optval, optlen */
3223 [TARGET_SYS_SENDMSG] = 3, /* fd, msg, flags */
3224 [TARGET_SYS_RECVMSG] = 3, /* fd, msg, flags */
3225 [TARGET_SYS_ACCEPT4] = 4, /* fd, addr, addrlen, flags */
3226 [TARGET_SYS_RECVMMSG] = 4, /* fd, msgvec, vlen, flags */
3227 [TARGET_SYS_SENDMMSG] = 4, /* fd, msgvec, vlen, flags */
3229 abi_long a[6]; /* max 6 args */
3230 unsigned i;
3232 /* check the range of the first argument num */
3233 /* (TARGET_SYS_SENDMMSG is the highest among TARGET_SYS_xxx) */
3234 if (num < 1 || num > TARGET_SYS_SENDMMSG) {
3235 return -TARGET_EINVAL;
3237 /* ensure we have space for args */
3238 if (nargs[num] > ARRAY_SIZE(a)) {
3239 return -TARGET_EINVAL;
3241 /* collect the arguments in a[] according to nargs[] */
3242 for (i = 0; i < nargs[num]; ++i) {
3243 if (get_user_ual(a[i], vptr + i * sizeof(abi_long)) != 0) {
3244 return -TARGET_EFAULT;
3247 /* now when we have the args, invoke the appropriate underlying function */
3248 switch (num) {
3249 case TARGET_SYS_SOCKET: /* domain, type, protocol */
3250 return do_socket(a[0], a[1], a[2]);
3251 case TARGET_SYS_BIND: /* sockfd, addr, addrlen */
3252 return do_bind(a[0], a[1], a[2]);
3253 case TARGET_SYS_CONNECT: /* sockfd, addr, addrlen */
3254 return do_connect(a[0], a[1], a[2]);
3255 case TARGET_SYS_LISTEN: /* sockfd, backlog */
3256 return get_errno(listen(a[0], a[1]));
3257 case TARGET_SYS_ACCEPT: /* sockfd, addr, addrlen */
3258 return do_accept4(a[0], a[1], a[2], 0);
3259 case TARGET_SYS_GETSOCKNAME: /* sockfd, addr, addrlen */
3260 return do_getsockname(a[0], a[1], a[2]);
3261 case TARGET_SYS_GETPEERNAME: /* sockfd, addr, addrlen */
3262 return do_getpeername(a[0], a[1], a[2]);
3263 case TARGET_SYS_SOCKETPAIR: /* domain, type, protocol, tab */
3264 return do_socketpair(a[0], a[1], a[2], a[3]);
3265 case TARGET_SYS_SEND: /* sockfd, msg, len, flags */
3266 return do_sendto(a[0], a[1], a[2], a[3], 0, 0);
3267 case TARGET_SYS_RECV: /* sockfd, msg, len, flags */
3268 return do_recvfrom(a[0], a[1], a[2], a[3], 0, 0);
3269 case TARGET_SYS_SENDTO: /* sockfd, msg, len, flags, addr, addrlen */
3270 return do_sendto(a[0], a[1], a[2], a[3], a[4], a[5]);
3271 case TARGET_SYS_RECVFROM: /* sockfd, msg, len, flags, addr, addrlen */
3272 return do_recvfrom(a[0], a[1], a[2], a[3], a[4], a[5]);
3273 case TARGET_SYS_SHUTDOWN: /* sockfd, how */
3274 return get_errno(shutdown(a[0], a[1]));
3275 case TARGET_SYS_SETSOCKOPT: /* sockfd, level, optname, optval, optlen */
3276 return do_setsockopt(a[0], a[1], a[2], a[3], a[4]);
3277 case TARGET_SYS_GETSOCKOPT: /* sockfd, level, optname, optval, optlen */
3278 return do_getsockopt(a[0], a[1], a[2], a[3], a[4]);
3279 case TARGET_SYS_SENDMSG: /* sockfd, msg, flags */
3280 return do_sendrecvmsg(a[0], a[1], a[2], 1);
3281 case TARGET_SYS_RECVMSG: /* sockfd, msg, flags */
3282 return do_sendrecvmsg(a[0], a[1], a[2], 0);
3283 case TARGET_SYS_ACCEPT4: /* sockfd, addr, addrlen, flags */
3284 return do_accept4(a[0], a[1], a[2], a[3]);
3285 case TARGET_SYS_RECVMMSG: /* sockfd, msgvec, vlen, flags */
3286 return do_sendrecvmmsg(a[0], a[1], a[2], a[3], 0);
3287 case TARGET_SYS_SENDMMSG: /* sockfd, msgvec, vlen, flags */
3288 return do_sendrecvmmsg(a[0], a[1], a[2], a[3], 1);
3289 default:
3290 gemu_log("Unsupported socketcall: %d\n", num);
3291 return -TARGET_EINVAL;
3294 #endif
3296 #define N_SHM_REGIONS 32
3298 static struct shm_region {
3299 abi_ulong start;
3300 abi_ulong size;
3301 bool in_use;
3302 } shm_regions[N_SHM_REGIONS];
3304 #ifndef TARGET_SEMID64_DS
3305 /* asm-generic version of this struct */
3306 struct target_semid64_ds
3308 struct target_ipc_perm sem_perm;
3309 abi_ulong sem_otime;
3310 #if TARGET_ABI_BITS == 32
3311 abi_ulong __unused1;
3312 #endif
3313 abi_ulong sem_ctime;
3314 #if TARGET_ABI_BITS == 32
3315 abi_ulong __unused2;
3316 #endif
3317 abi_ulong sem_nsems;
3318 abi_ulong __unused3;
3319 abi_ulong __unused4;
3321 #endif
3323 static inline abi_long target_to_host_ipc_perm(struct ipc_perm *host_ip,
3324 abi_ulong target_addr)
3326 struct target_ipc_perm *target_ip;
3327 struct target_semid64_ds *target_sd;
3329 if (!lock_user_struct(VERIFY_READ, target_sd, target_addr, 1))
3330 return -TARGET_EFAULT;
3331 target_ip = &(target_sd->sem_perm);
3332 host_ip->__key = tswap32(target_ip->__key);
3333 host_ip->uid = tswap32(target_ip->uid);
3334 host_ip->gid = tswap32(target_ip->gid);
3335 host_ip->cuid = tswap32(target_ip->cuid);
3336 host_ip->cgid = tswap32(target_ip->cgid);
3337 #if defined(TARGET_ALPHA) || defined(TARGET_MIPS) || defined(TARGET_PPC)
3338 host_ip->mode = tswap32(target_ip->mode);
3339 #else
3340 host_ip->mode = tswap16(target_ip->mode);
3341 #endif
3342 #if defined(TARGET_PPC)
3343 host_ip->__seq = tswap32(target_ip->__seq);
3344 #else
3345 host_ip->__seq = tswap16(target_ip->__seq);
3346 #endif
3347 unlock_user_struct(target_sd, target_addr, 0);
3348 return 0;
3351 static inline abi_long host_to_target_ipc_perm(abi_ulong target_addr,
3352 struct ipc_perm *host_ip)
3354 struct target_ipc_perm *target_ip;
3355 struct target_semid64_ds *target_sd;
3357 if (!lock_user_struct(VERIFY_WRITE, target_sd, target_addr, 0))
3358 return -TARGET_EFAULT;
3359 target_ip = &(target_sd->sem_perm);
3360 target_ip->__key = tswap32(host_ip->__key);
3361 target_ip->uid = tswap32(host_ip->uid);
3362 target_ip->gid = tswap32(host_ip->gid);
3363 target_ip->cuid = tswap32(host_ip->cuid);
3364 target_ip->cgid = tswap32(host_ip->cgid);
3365 #if defined(TARGET_ALPHA) || defined(TARGET_MIPS) || defined(TARGET_PPC)
3366 target_ip->mode = tswap32(host_ip->mode);
3367 #else
3368 target_ip->mode = tswap16(host_ip->mode);
3369 #endif
3370 #if defined(TARGET_PPC)
3371 target_ip->__seq = tswap32(host_ip->__seq);
3372 #else
3373 target_ip->__seq = tswap16(host_ip->__seq);
3374 #endif
3375 unlock_user_struct(target_sd, target_addr, 1);
3376 return 0;
3379 static inline abi_long target_to_host_semid_ds(struct semid_ds *host_sd,
3380 abi_ulong target_addr)
3382 struct target_semid64_ds *target_sd;
3384 if (!lock_user_struct(VERIFY_READ, target_sd, target_addr, 1))
3385 return -TARGET_EFAULT;
3386 if (target_to_host_ipc_perm(&(host_sd->sem_perm),target_addr))
3387 return -TARGET_EFAULT;
3388 host_sd->sem_nsems = tswapal(target_sd->sem_nsems);
3389 host_sd->sem_otime = tswapal(target_sd->sem_otime);
3390 host_sd->sem_ctime = tswapal(target_sd->sem_ctime);
3391 unlock_user_struct(target_sd, target_addr, 0);
3392 return 0;
3395 static inline abi_long host_to_target_semid_ds(abi_ulong target_addr,
3396 struct semid_ds *host_sd)
3398 struct target_semid64_ds *target_sd;
3400 if (!lock_user_struct(VERIFY_WRITE, target_sd, target_addr, 0))
3401 return -TARGET_EFAULT;
3402 if (host_to_target_ipc_perm(target_addr,&(host_sd->sem_perm)))
3403 return -TARGET_EFAULT;
3404 target_sd->sem_nsems = tswapal(host_sd->sem_nsems);
3405 target_sd->sem_otime = tswapal(host_sd->sem_otime);
3406 target_sd->sem_ctime = tswapal(host_sd->sem_ctime);
3407 unlock_user_struct(target_sd, target_addr, 1);
3408 return 0;
3411 struct target_seminfo {
3412 int semmap;
3413 int semmni;
3414 int semmns;
3415 int semmnu;
3416 int semmsl;
3417 int semopm;
3418 int semume;
3419 int semusz;
3420 int semvmx;
3421 int semaem;
3424 static inline abi_long host_to_target_seminfo(abi_ulong target_addr,
3425 struct seminfo *host_seminfo)
3427 struct target_seminfo *target_seminfo;
3428 if (!lock_user_struct(VERIFY_WRITE, target_seminfo, target_addr, 0))
3429 return -TARGET_EFAULT;
3430 __put_user(host_seminfo->semmap, &target_seminfo->semmap);
3431 __put_user(host_seminfo->semmni, &target_seminfo->semmni);
3432 __put_user(host_seminfo->semmns, &target_seminfo->semmns);
3433 __put_user(host_seminfo->semmnu, &target_seminfo->semmnu);
3434 __put_user(host_seminfo->semmsl, &target_seminfo->semmsl);
3435 __put_user(host_seminfo->semopm, &target_seminfo->semopm);
3436 __put_user(host_seminfo->semume, &target_seminfo->semume);
3437 __put_user(host_seminfo->semusz, &target_seminfo->semusz);
3438 __put_user(host_seminfo->semvmx, &target_seminfo->semvmx);
3439 __put_user(host_seminfo->semaem, &target_seminfo->semaem);
3440 unlock_user_struct(target_seminfo, target_addr, 1);
3441 return 0;
3444 union semun {
3445 int val;
3446 struct semid_ds *buf;
3447 unsigned short *array;
3448 struct seminfo *__buf;
3451 union target_semun {
3452 int val;
3453 abi_ulong buf;
3454 abi_ulong array;
3455 abi_ulong __buf;
3458 static inline abi_long target_to_host_semarray(int semid, unsigned short **host_array,
3459 abi_ulong target_addr)
3461 int nsems;
3462 unsigned short *array;
3463 union semun semun;
3464 struct semid_ds semid_ds;
3465 int i, ret;
3467 semun.buf = &semid_ds;
3469 ret = semctl(semid, 0, IPC_STAT, semun);
3470 if (ret == -1)
3471 return get_errno(ret);
3473 nsems = semid_ds.sem_nsems;
3475 *host_array = g_try_new(unsigned short, nsems);
3476 if (!*host_array) {
3477 return -TARGET_ENOMEM;
3479 array = lock_user(VERIFY_READ, target_addr,
3480 nsems*sizeof(unsigned short), 1);
3481 if (!array) {
3482 g_free(*host_array);
3483 return -TARGET_EFAULT;
3486 for(i=0; i<nsems; i++) {
3487 __get_user((*host_array)[i], &array[i]);
3489 unlock_user(array, target_addr, 0);
3491 return 0;
3494 static inline abi_long host_to_target_semarray(int semid, abi_ulong target_addr,
3495 unsigned short **host_array)
3497 int nsems;
3498 unsigned short *array;
3499 union semun semun;
3500 struct semid_ds semid_ds;
3501 int i, ret;
3503 semun.buf = &semid_ds;
3505 ret = semctl(semid, 0, IPC_STAT, semun);
3506 if (ret == -1)
3507 return get_errno(ret);
3509 nsems = semid_ds.sem_nsems;
3511 array = lock_user(VERIFY_WRITE, target_addr,
3512 nsems*sizeof(unsigned short), 0);
3513 if (!array)
3514 return -TARGET_EFAULT;
3516 for(i=0; i<nsems; i++) {
3517 __put_user((*host_array)[i], &array[i]);
3519 g_free(*host_array);
3520 unlock_user(array, target_addr, 1);
3522 return 0;
3525 static inline abi_long do_semctl(int semid, int semnum, int cmd,
3526 abi_ulong target_arg)
3528 union target_semun target_su = { .buf = target_arg };
3529 union semun arg;
3530 struct semid_ds dsarg;
3531 unsigned short *array = NULL;
3532 struct seminfo seminfo;
3533 abi_long ret = -TARGET_EINVAL;
3534 abi_long err;
3535 cmd &= 0xff;
3537 switch( cmd ) {
3538 case GETVAL:
3539 case SETVAL:
3540 /* In 64 bit cross-endian situations, we will erroneously pick up
3541 * the wrong half of the union for the "val" element. To rectify
3542 * this, the entire 8-byte structure is byteswapped, followed by
3543 * a swap of the 4 byte val field. In other cases, the data is
3544 * already in proper host byte order. */
3545 if (sizeof(target_su.val) != (sizeof(target_su.buf))) {
3546 target_su.buf = tswapal(target_su.buf);
3547 arg.val = tswap32(target_su.val);
3548 } else {
3549 arg.val = target_su.val;
3551 ret = get_errno(semctl(semid, semnum, cmd, arg));
3552 break;
3553 case GETALL:
3554 case SETALL:
3555 err = target_to_host_semarray(semid, &array, target_su.array);
3556 if (err)
3557 return err;
3558 arg.array = array;
3559 ret = get_errno(semctl(semid, semnum, cmd, arg));
3560 err = host_to_target_semarray(semid, target_su.array, &array);
3561 if (err)
3562 return err;
3563 break;
3564 case IPC_STAT:
3565 case IPC_SET:
3566 case SEM_STAT:
3567 err = target_to_host_semid_ds(&dsarg, target_su.buf);
3568 if (err)
3569 return err;
3570 arg.buf = &dsarg;
3571 ret = get_errno(semctl(semid, semnum, cmd, arg));
3572 err = host_to_target_semid_ds(target_su.buf, &dsarg);
3573 if (err)
3574 return err;
3575 break;
3576 case IPC_INFO:
3577 case SEM_INFO:
3578 arg.__buf = &seminfo;
3579 ret = get_errno(semctl(semid, semnum, cmd, arg));
3580 err = host_to_target_seminfo(target_su.__buf, &seminfo);
3581 if (err)
3582 return err;
3583 break;
3584 case IPC_RMID:
3585 case GETPID:
3586 case GETNCNT:
3587 case GETZCNT:
3588 ret = get_errno(semctl(semid, semnum, cmd, NULL));
3589 break;
3592 return ret;
3595 struct target_sembuf {
3596 unsigned short sem_num;
3597 short sem_op;
3598 short sem_flg;
3601 static inline abi_long target_to_host_sembuf(struct sembuf *host_sembuf,
3602 abi_ulong target_addr,
3603 unsigned nsops)
3605 struct target_sembuf *target_sembuf;
3606 int i;
3608 target_sembuf = lock_user(VERIFY_READ, target_addr,
3609 nsops*sizeof(struct target_sembuf), 1);
3610 if (!target_sembuf)
3611 return -TARGET_EFAULT;
3613 for(i=0; i<nsops; i++) {
3614 __get_user(host_sembuf[i].sem_num, &target_sembuf[i].sem_num);
3615 __get_user(host_sembuf[i].sem_op, &target_sembuf[i].sem_op);
3616 __get_user(host_sembuf[i].sem_flg, &target_sembuf[i].sem_flg);
3619 unlock_user(target_sembuf, target_addr, 0);
3621 return 0;
3624 static inline abi_long do_semop(int semid, abi_long ptr, unsigned nsops)
3626 struct sembuf sops[nsops];
3627 abi_long ret;
3629 if (target_to_host_sembuf(sops, ptr, nsops))
3630 return -TARGET_EFAULT;
3632 ret = -TARGET_ENOSYS;
3633 #ifdef __NR_semtimedop
3634 ret = get_errno(safe_semtimedop(semid, sops, nsops, NULL));
3635 #endif
3636 #ifdef __NR_ipc
3637 if (ret == -TARGET_ENOSYS) {
3638 ret = get_errno(safe_ipc(IPCOP_semtimedop, semid, nsops, 0, sops, 0));
3640 #endif
3641 return ret;
3644 struct target_msqid_ds
3646 struct target_ipc_perm msg_perm;
3647 abi_ulong msg_stime;
3648 #if TARGET_ABI_BITS == 32
3649 abi_ulong __unused1;
3650 #endif
3651 abi_ulong msg_rtime;
3652 #if TARGET_ABI_BITS == 32
3653 abi_ulong __unused2;
3654 #endif
3655 abi_ulong msg_ctime;
3656 #if TARGET_ABI_BITS == 32
3657 abi_ulong __unused3;
3658 #endif
3659 abi_ulong __msg_cbytes;
3660 abi_ulong msg_qnum;
3661 abi_ulong msg_qbytes;
3662 abi_ulong msg_lspid;
3663 abi_ulong msg_lrpid;
3664 abi_ulong __unused4;
3665 abi_ulong __unused5;
3668 static inline abi_long target_to_host_msqid_ds(struct msqid_ds *host_md,
3669 abi_ulong target_addr)
3671 struct target_msqid_ds *target_md;
3673 if (!lock_user_struct(VERIFY_READ, target_md, target_addr, 1))
3674 return -TARGET_EFAULT;
3675 if (target_to_host_ipc_perm(&(host_md->msg_perm),target_addr))
3676 return -TARGET_EFAULT;
3677 host_md->msg_stime = tswapal(target_md->msg_stime);
3678 host_md->msg_rtime = tswapal(target_md->msg_rtime);
3679 host_md->msg_ctime = tswapal(target_md->msg_ctime);
3680 host_md->__msg_cbytes = tswapal(target_md->__msg_cbytes);
3681 host_md->msg_qnum = tswapal(target_md->msg_qnum);
3682 host_md->msg_qbytes = tswapal(target_md->msg_qbytes);
3683 host_md->msg_lspid = tswapal(target_md->msg_lspid);
3684 host_md->msg_lrpid = tswapal(target_md->msg_lrpid);
3685 unlock_user_struct(target_md, target_addr, 0);
3686 return 0;
3689 static inline abi_long host_to_target_msqid_ds(abi_ulong target_addr,
3690 struct msqid_ds *host_md)
3692 struct target_msqid_ds *target_md;
3694 if (!lock_user_struct(VERIFY_WRITE, target_md, target_addr, 0))
3695 return -TARGET_EFAULT;
3696 if (host_to_target_ipc_perm(target_addr,&(host_md->msg_perm)))
3697 return -TARGET_EFAULT;
3698 target_md->msg_stime = tswapal(host_md->msg_stime);
3699 target_md->msg_rtime = tswapal(host_md->msg_rtime);
3700 target_md->msg_ctime = tswapal(host_md->msg_ctime);
3701 target_md->__msg_cbytes = tswapal(host_md->__msg_cbytes);
3702 target_md->msg_qnum = tswapal(host_md->msg_qnum);
3703 target_md->msg_qbytes = tswapal(host_md->msg_qbytes);
3704 target_md->msg_lspid = tswapal(host_md->msg_lspid);
3705 target_md->msg_lrpid = tswapal(host_md->msg_lrpid);
3706 unlock_user_struct(target_md, target_addr, 1);
3707 return 0;
3710 struct target_msginfo {
3711 int msgpool;
3712 int msgmap;
3713 int msgmax;
3714 int msgmnb;
3715 int msgmni;
3716 int msgssz;
3717 int msgtql;
3718 unsigned short int msgseg;
3721 static inline abi_long host_to_target_msginfo(abi_ulong target_addr,
3722 struct msginfo *host_msginfo)
3724 struct target_msginfo *target_msginfo;
3725 if (!lock_user_struct(VERIFY_WRITE, target_msginfo, target_addr, 0))
3726 return -TARGET_EFAULT;
3727 __put_user(host_msginfo->msgpool, &target_msginfo->msgpool);
3728 __put_user(host_msginfo->msgmap, &target_msginfo->msgmap);
3729 __put_user(host_msginfo->msgmax, &target_msginfo->msgmax);
3730 __put_user(host_msginfo->msgmnb, &target_msginfo->msgmnb);
3731 __put_user(host_msginfo->msgmni, &target_msginfo->msgmni);
3732 __put_user(host_msginfo->msgssz, &target_msginfo->msgssz);
3733 __put_user(host_msginfo->msgtql, &target_msginfo->msgtql);
3734 __put_user(host_msginfo->msgseg, &target_msginfo->msgseg);
3735 unlock_user_struct(target_msginfo, target_addr, 1);
3736 return 0;
3739 static inline abi_long do_msgctl(int msgid, int cmd, abi_long ptr)
3741 struct msqid_ds dsarg;
3742 struct msginfo msginfo;
3743 abi_long ret = -TARGET_EINVAL;
3745 cmd &= 0xff;
3747 switch (cmd) {
3748 case IPC_STAT:
3749 case IPC_SET:
3750 case MSG_STAT:
3751 if (target_to_host_msqid_ds(&dsarg,ptr))
3752 return -TARGET_EFAULT;
3753 ret = get_errno(msgctl(msgid, cmd, &dsarg));
3754 if (host_to_target_msqid_ds(ptr,&dsarg))
3755 return -TARGET_EFAULT;
3756 break;
3757 case IPC_RMID:
3758 ret = get_errno(msgctl(msgid, cmd, NULL));
3759 break;
3760 case IPC_INFO:
3761 case MSG_INFO:
3762 ret = get_errno(msgctl(msgid, cmd, (struct msqid_ds *)&msginfo));
3763 if (host_to_target_msginfo(ptr, &msginfo))
3764 return -TARGET_EFAULT;
3765 break;
3768 return ret;
3771 struct target_msgbuf {
3772 abi_long mtype;
3773 char mtext[1];
3776 static inline abi_long do_msgsnd(int msqid, abi_long msgp,
3777 ssize_t msgsz, int msgflg)
3779 struct target_msgbuf *target_mb;
3780 struct msgbuf *host_mb;
3781 abi_long ret = 0;
3783 if (msgsz < 0) {
3784 return -TARGET_EINVAL;
3787 if (!lock_user_struct(VERIFY_READ, target_mb, msgp, 0))
3788 return -TARGET_EFAULT;
3789 host_mb = g_try_malloc(msgsz + sizeof(long));
3790 if (!host_mb) {
3791 unlock_user_struct(target_mb, msgp, 0);
3792 return -TARGET_ENOMEM;
3794 host_mb->mtype = (abi_long) tswapal(target_mb->mtype);
3795 memcpy(host_mb->mtext, target_mb->mtext, msgsz);
3796 ret = -TARGET_ENOSYS;
3797 #ifdef __NR_msgsnd
3798 ret = get_errno(safe_msgsnd(msqid, host_mb, msgsz, msgflg));
3799 #endif
3800 #ifdef __NR_ipc
3801 if (ret == -TARGET_ENOSYS) {
3802 ret = get_errno(safe_ipc(IPCOP_msgsnd, msqid, msgsz, msgflg,
3803 host_mb, 0));
3805 #endif
3806 g_free(host_mb);
3807 unlock_user_struct(target_mb, msgp, 0);
3809 return ret;
3812 static inline abi_long do_msgrcv(int msqid, abi_long msgp,
3813 ssize_t msgsz, abi_long msgtyp,
3814 int msgflg)
3816 struct target_msgbuf *target_mb;
3817 char *target_mtext;
3818 struct msgbuf *host_mb;
3819 abi_long ret = 0;
3821 if (msgsz < 0) {
3822 return -TARGET_EINVAL;
3825 if (!lock_user_struct(VERIFY_WRITE, target_mb, msgp, 0))
3826 return -TARGET_EFAULT;
3828 host_mb = g_try_malloc(msgsz + sizeof(long));
3829 if (!host_mb) {
3830 ret = -TARGET_ENOMEM;
3831 goto end;
3833 ret = -TARGET_ENOSYS;
3834 #ifdef __NR_msgrcv
3835 ret = get_errno(safe_msgrcv(msqid, host_mb, msgsz, msgtyp, msgflg));
3836 #endif
3837 #ifdef __NR_ipc
3838 if (ret == -TARGET_ENOSYS) {
3839 ret = get_errno(safe_ipc(IPCOP_CALL(1, IPCOP_msgrcv), msqid, msgsz,
3840 msgflg, host_mb, msgtyp));
3842 #endif
3844 if (ret > 0) {
3845 abi_ulong target_mtext_addr = msgp + sizeof(abi_ulong);
3846 target_mtext = lock_user(VERIFY_WRITE, target_mtext_addr, ret, 0);
3847 if (!target_mtext) {
3848 ret = -TARGET_EFAULT;
3849 goto end;
3851 memcpy(target_mb->mtext, host_mb->mtext, ret);
3852 unlock_user(target_mtext, target_mtext_addr, ret);
3855 target_mb->mtype = tswapal(host_mb->mtype);
3857 end:
3858 if (target_mb)
3859 unlock_user_struct(target_mb, msgp, 1);
3860 g_free(host_mb);
3861 return ret;
3864 static inline abi_long target_to_host_shmid_ds(struct shmid_ds *host_sd,
3865 abi_ulong target_addr)
3867 struct target_shmid_ds *target_sd;
3869 if (!lock_user_struct(VERIFY_READ, target_sd, target_addr, 1))
3870 return -TARGET_EFAULT;
3871 if (target_to_host_ipc_perm(&(host_sd->shm_perm), target_addr))
3872 return -TARGET_EFAULT;
3873 __get_user(host_sd->shm_segsz, &target_sd->shm_segsz);
3874 __get_user(host_sd->shm_atime, &target_sd->shm_atime);
3875 __get_user(host_sd->shm_dtime, &target_sd->shm_dtime);
3876 __get_user(host_sd->shm_ctime, &target_sd->shm_ctime);
3877 __get_user(host_sd->shm_cpid, &target_sd->shm_cpid);
3878 __get_user(host_sd->shm_lpid, &target_sd->shm_lpid);
3879 __get_user(host_sd->shm_nattch, &target_sd->shm_nattch);
3880 unlock_user_struct(target_sd, target_addr, 0);
3881 return 0;
3884 static inline abi_long host_to_target_shmid_ds(abi_ulong target_addr,
3885 struct shmid_ds *host_sd)
3887 struct target_shmid_ds *target_sd;
3889 if (!lock_user_struct(VERIFY_WRITE, target_sd, target_addr, 0))
3890 return -TARGET_EFAULT;
3891 if (host_to_target_ipc_perm(target_addr, &(host_sd->shm_perm)))
3892 return -TARGET_EFAULT;
3893 __put_user(host_sd->shm_segsz, &target_sd->shm_segsz);
3894 __put_user(host_sd->shm_atime, &target_sd->shm_atime);
3895 __put_user(host_sd->shm_dtime, &target_sd->shm_dtime);
3896 __put_user(host_sd->shm_ctime, &target_sd->shm_ctime);
3897 __put_user(host_sd->shm_cpid, &target_sd->shm_cpid);
3898 __put_user(host_sd->shm_lpid, &target_sd->shm_lpid);
3899 __put_user(host_sd->shm_nattch, &target_sd->shm_nattch);
3900 unlock_user_struct(target_sd, target_addr, 1);
3901 return 0;
3904 struct target_shminfo {
3905 abi_ulong shmmax;
3906 abi_ulong shmmin;
3907 abi_ulong shmmni;
3908 abi_ulong shmseg;
3909 abi_ulong shmall;
3912 static inline abi_long host_to_target_shminfo(abi_ulong target_addr,
3913 struct shminfo *host_shminfo)
3915 struct target_shminfo *target_shminfo;
3916 if (!lock_user_struct(VERIFY_WRITE, target_shminfo, target_addr, 0))
3917 return -TARGET_EFAULT;
3918 __put_user(host_shminfo->shmmax, &target_shminfo->shmmax);
3919 __put_user(host_shminfo->shmmin, &target_shminfo->shmmin);
3920 __put_user(host_shminfo->shmmni, &target_shminfo->shmmni);
3921 __put_user(host_shminfo->shmseg, &target_shminfo->shmseg);
3922 __put_user(host_shminfo->shmall, &target_shminfo->shmall);
3923 unlock_user_struct(target_shminfo, target_addr, 1);
3924 return 0;
3927 struct target_shm_info {
3928 int used_ids;
3929 abi_ulong shm_tot;
3930 abi_ulong shm_rss;
3931 abi_ulong shm_swp;
3932 abi_ulong swap_attempts;
3933 abi_ulong swap_successes;
3936 static inline abi_long host_to_target_shm_info(abi_ulong target_addr,
3937 struct shm_info *host_shm_info)
3939 struct target_shm_info *target_shm_info;
3940 if (!lock_user_struct(VERIFY_WRITE, target_shm_info, target_addr, 0))
3941 return -TARGET_EFAULT;
3942 __put_user(host_shm_info->used_ids, &target_shm_info->used_ids);
3943 __put_user(host_shm_info->shm_tot, &target_shm_info->shm_tot);
3944 __put_user(host_shm_info->shm_rss, &target_shm_info->shm_rss);
3945 __put_user(host_shm_info->shm_swp, &target_shm_info->shm_swp);
3946 __put_user(host_shm_info->swap_attempts, &target_shm_info->swap_attempts);
3947 __put_user(host_shm_info->swap_successes, &target_shm_info->swap_successes);
3948 unlock_user_struct(target_shm_info, target_addr, 1);
3949 return 0;
3952 static inline abi_long do_shmctl(int shmid, int cmd, abi_long buf)
3954 struct shmid_ds dsarg;
3955 struct shminfo shminfo;
3956 struct shm_info shm_info;
3957 abi_long ret = -TARGET_EINVAL;
3959 cmd &= 0xff;
3961 switch(cmd) {
3962 case IPC_STAT:
3963 case IPC_SET:
3964 case SHM_STAT:
3965 if (target_to_host_shmid_ds(&dsarg, buf))
3966 return -TARGET_EFAULT;
3967 ret = get_errno(shmctl(shmid, cmd, &dsarg));
3968 if (host_to_target_shmid_ds(buf, &dsarg))
3969 return -TARGET_EFAULT;
3970 break;
3971 case IPC_INFO:
3972 ret = get_errno(shmctl(shmid, cmd, (struct shmid_ds *)&shminfo));
3973 if (host_to_target_shminfo(buf, &shminfo))
3974 return -TARGET_EFAULT;
3975 break;
3976 case SHM_INFO:
3977 ret = get_errno(shmctl(shmid, cmd, (struct shmid_ds *)&shm_info));
3978 if (host_to_target_shm_info(buf, &shm_info))
3979 return -TARGET_EFAULT;
3980 break;
3981 case IPC_RMID:
3982 case SHM_LOCK:
3983 case SHM_UNLOCK:
3984 ret = get_errno(shmctl(shmid, cmd, NULL));
3985 break;
3988 return ret;
3991 #ifndef TARGET_FORCE_SHMLBA
3992 /* For most architectures, SHMLBA is the same as the page size;
3993 * some architectures have larger values, in which case they should
3994 * define TARGET_FORCE_SHMLBA and provide a target_shmlba() function.
3995 * This corresponds to the kernel arch code defining __ARCH_FORCE_SHMLBA
3996 * and defining its own value for SHMLBA.
3998 * The kernel also permits SHMLBA to be set by the architecture to a
3999 * value larger than the page size without setting __ARCH_FORCE_SHMLBA;
4000 * this means that addresses are rounded to the large size if
4001 * SHM_RND is set but addresses not aligned to that size are not rejected
4002 * as long as they are at least page-aligned. Since the only architecture
4003 * which uses this is ia64 this code doesn't provide for that oddity.
4005 static inline abi_ulong target_shmlba(CPUArchState *cpu_env)
4007 return TARGET_PAGE_SIZE;
4009 #endif
4011 static inline abi_ulong do_shmat(CPUArchState *cpu_env,
4012 int shmid, abi_ulong shmaddr, int shmflg)
4014 abi_long raddr;
4015 void *host_raddr;
4016 struct shmid_ds shm_info;
4017 int i,ret;
4018 abi_ulong shmlba;
4020 /* find out the length of the shared memory segment */
4021 ret = get_errno(shmctl(shmid, IPC_STAT, &shm_info));
4022 if (is_error(ret)) {
4023 /* can't get length, bail out */
4024 return ret;
4027 shmlba = target_shmlba(cpu_env);
4029 if (shmaddr & (shmlba - 1)) {
4030 if (shmflg & SHM_RND) {
4031 shmaddr &= ~(shmlba - 1);
4032 } else {
4033 return -TARGET_EINVAL;
4036 if (!guest_range_valid(shmaddr, shm_info.shm_segsz)) {
4037 return -TARGET_EINVAL;
4040 mmap_lock();
4042 if (shmaddr)
4043 host_raddr = shmat(shmid, (void *)g2h(shmaddr), shmflg);
4044 else {
4045 abi_ulong mmap_start;
4047 /* In order to use the host shmat, we need to honor host SHMLBA. */
4048 mmap_start = mmap_find_vma(0, shm_info.shm_segsz, MAX(SHMLBA, shmlba));
4050 if (mmap_start == -1) {
4051 errno = ENOMEM;
4052 host_raddr = (void *)-1;
4053 } else
4054 host_raddr = shmat(shmid, g2h(mmap_start), shmflg | SHM_REMAP);
4057 if (host_raddr == (void *)-1) {
4058 mmap_unlock();
4059 return get_errno((long)host_raddr);
4061 raddr=h2g((unsigned long)host_raddr);
4063 page_set_flags(raddr, raddr + shm_info.shm_segsz,
4064 PAGE_VALID | PAGE_READ |
4065 ((shmflg & SHM_RDONLY)? 0 : PAGE_WRITE));
4067 for (i = 0; i < N_SHM_REGIONS; i++) {
4068 if (!shm_regions[i].in_use) {
4069 shm_regions[i].in_use = true;
4070 shm_regions[i].start = raddr;
4071 shm_regions[i].size = shm_info.shm_segsz;
4072 break;
4076 mmap_unlock();
4077 return raddr;
4081 static inline abi_long do_shmdt(abi_ulong shmaddr)
4083 int i;
4084 abi_long rv;
4086 mmap_lock();
4088 for (i = 0; i < N_SHM_REGIONS; ++i) {
4089 if (shm_regions[i].in_use && shm_regions[i].start == shmaddr) {
4090 shm_regions[i].in_use = false;
4091 page_set_flags(shmaddr, shmaddr + shm_regions[i].size, 0);
4092 break;
4095 rv = get_errno(shmdt(g2h(shmaddr)));
4097 mmap_unlock();
4099 return rv;
4102 #ifdef TARGET_NR_ipc
4103 /* ??? This only works with linear mappings. */
4104 /* do_ipc() must return target values and target errnos. */
4105 static abi_long do_ipc(CPUArchState *cpu_env,
4106 unsigned int call, abi_long first,
4107 abi_long second, abi_long third,
4108 abi_long ptr, abi_long fifth)
4110 int version;
4111 abi_long ret = 0;
4113 version = call >> 16;
4114 call &= 0xffff;
4116 switch (call) {
4117 case IPCOP_semop:
4118 ret = do_semop(first, ptr, second);
4119 break;
4121 case IPCOP_semget:
4122 ret = get_errno(semget(first, second, third));
4123 break;
4125 case IPCOP_semctl: {
4126 /* The semun argument to semctl is passed by value, so dereference the
4127 * ptr argument. */
4128 abi_ulong atptr;
4129 get_user_ual(atptr, ptr);
4130 ret = do_semctl(first, second, third, atptr);
4131 break;
4134 case IPCOP_msgget:
4135 ret = get_errno(msgget(first, second));
4136 break;
4138 case IPCOP_msgsnd:
4139 ret = do_msgsnd(first, ptr, second, third);
4140 break;
4142 case IPCOP_msgctl:
4143 ret = do_msgctl(first, second, ptr);
4144 break;
4146 case IPCOP_msgrcv:
4147 switch (version) {
4148 case 0:
4150 struct target_ipc_kludge {
4151 abi_long msgp;
4152 abi_long msgtyp;
4153 } *tmp;
4155 if (!lock_user_struct(VERIFY_READ, tmp, ptr, 1)) {
4156 ret = -TARGET_EFAULT;
4157 break;
4160 ret = do_msgrcv(first, tswapal(tmp->msgp), second, tswapal(tmp->msgtyp), third);
4162 unlock_user_struct(tmp, ptr, 0);
4163 break;
4165 default:
4166 ret = do_msgrcv(first, ptr, second, fifth, third);
4168 break;
4170 case IPCOP_shmat:
4171 switch (version) {
4172 default:
4174 abi_ulong raddr;
4175 raddr = do_shmat(cpu_env, first, ptr, second);
4176 if (is_error(raddr))
4177 return get_errno(raddr);
4178 if (put_user_ual(raddr, third))
4179 return -TARGET_EFAULT;
4180 break;
4182 case 1:
4183 ret = -TARGET_EINVAL;
4184 break;
4186 break;
4187 case IPCOP_shmdt:
4188 ret = do_shmdt(ptr);
4189 break;
4191 case IPCOP_shmget:
4192 /* IPC_* flag values are the same on all linux platforms */
4193 ret = get_errno(shmget(first, second, third));
4194 break;
4196 /* IPC_* and SHM_* command values are the same on all linux platforms */
4197 case IPCOP_shmctl:
4198 ret = do_shmctl(first, second, ptr);
4199 break;
4200 default:
4201 gemu_log("Unsupported ipc call: %d (version %d)\n", call, version);
4202 ret = -TARGET_ENOSYS;
4203 break;
4205 return ret;
4207 #endif
4209 /* kernel structure types definitions */
4211 #define STRUCT(name, ...) STRUCT_ ## name,
4212 #define STRUCT_SPECIAL(name) STRUCT_ ## name,
4213 enum {
4214 #include "syscall_types.h"
4215 STRUCT_MAX
4217 #undef STRUCT
4218 #undef STRUCT_SPECIAL
4220 #define STRUCT(name, ...) static const argtype struct_ ## name ## _def[] = { __VA_ARGS__, TYPE_NULL };
4221 #define STRUCT_SPECIAL(name)
4222 #include "syscall_types.h"
4223 #undef STRUCT
4224 #undef STRUCT_SPECIAL
4226 typedef struct IOCTLEntry IOCTLEntry;
4228 typedef abi_long do_ioctl_fn(const IOCTLEntry *ie, uint8_t *buf_temp,
4229 int fd, int cmd, abi_long arg);
4231 struct IOCTLEntry {
4232 int target_cmd;
4233 unsigned int host_cmd;
4234 const char *name;
4235 int access;
4236 do_ioctl_fn *do_ioctl;
4237 const argtype arg_type[5];
4240 #define IOC_R 0x0001
4241 #define IOC_W 0x0002
4242 #define IOC_RW (IOC_R | IOC_W)
4244 #define MAX_STRUCT_SIZE 4096
4246 #ifdef CONFIG_FIEMAP
4247 /* So fiemap access checks don't overflow on 32 bit systems.
4248 * This is very slightly smaller than the limit imposed by
4249 * the underlying kernel.
4251 #define FIEMAP_MAX_EXTENTS ((UINT_MAX - sizeof(struct fiemap)) \
4252 / sizeof(struct fiemap_extent))
4254 static abi_long do_ioctl_fs_ioc_fiemap(const IOCTLEntry *ie, uint8_t *buf_temp,
4255 int fd, int cmd, abi_long arg)
4257 /* The parameter for this ioctl is a struct fiemap followed
4258 * by an array of struct fiemap_extent whose size is set
4259 * in fiemap->fm_extent_count. The array is filled in by the
4260 * ioctl.
4262 int target_size_in, target_size_out;
4263 struct fiemap *fm;
4264 const argtype *arg_type = ie->arg_type;
4265 const argtype extent_arg_type[] = { MK_STRUCT(STRUCT_fiemap_extent) };
4266 void *argptr, *p;
4267 abi_long ret;
4268 int i, extent_size = thunk_type_size(extent_arg_type, 0);
4269 uint32_t outbufsz;
4270 int free_fm = 0;
4272 assert(arg_type[0] == TYPE_PTR);
4273 assert(ie->access == IOC_RW);
4274 arg_type++;
4275 target_size_in = thunk_type_size(arg_type, 0);
4276 argptr = lock_user(VERIFY_READ, arg, target_size_in, 1);
4277 if (!argptr) {
4278 return -TARGET_EFAULT;
4280 thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST);
4281 unlock_user(argptr, arg, 0);
4282 fm = (struct fiemap *)buf_temp;
4283 if (fm->fm_extent_count > FIEMAP_MAX_EXTENTS) {
4284 return -TARGET_EINVAL;
4287 outbufsz = sizeof (*fm) +
4288 (sizeof(struct fiemap_extent) * fm->fm_extent_count);
4290 if (outbufsz > MAX_STRUCT_SIZE) {
4291 /* We can't fit all the extents into the fixed size buffer.
4292 * Allocate one that is large enough and use it instead.
4294 fm = g_try_malloc(outbufsz);
4295 if (!fm) {
4296 return -TARGET_ENOMEM;
4298 memcpy(fm, buf_temp, sizeof(struct fiemap));
4299 free_fm = 1;
4301 ret = get_errno(safe_ioctl(fd, ie->host_cmd, fm));
4302 if (!is_error(ret)) {
4303 target_size_out = target_size_in;
4304 /* An extent_count of 0 means we were only counting the extents
4305 * so there are no structs to copy
4307 if (fm->fm_extent_count != 0) {
4308 target_size_out += fm->fm_mapped_extents * extent_size;
4310 argptr = lock_user(VERIFY_WRITE, arg, target_size_out, 0);
4311 if (!argptr) {
4312 ret = -TARGET_EFAULT;
4313 } else {
4314 /* Convert the struct fiemap */
4315 thunk_convert(argptr, fm, arg_type, THUNK_TARGET);
4316 if (fm->fm_extent_count != 0) {
4317 p = argptr + target_size_in;
4318 /* ...and then all the struct fiemap_extents */
4319 for (i = 0; i < fm->fm_mapped_extents; i++) {
4320 thunk_convert(p, &fm->fm_extents[i], extent_arg_type,
4321 THUNK_TARGET);
4322 p += extent_size;
4325 unlock_user(argptr, arg, target_size_out);
4328 if (free_fm) {
4329 g_free(fm);
4331 return ret;
4333 #endif
4335 static abi_long do_ioctl_ifconf(const IOCTLEntry *ie, uint8_t *buf_temp,
4336 int fd, int cmd, abi_long arg)
4338 const argtype *arg_type = ie->arg_type;
4339 int target_size;
4340 void *argptr;
4341 int ret;
4342 struct ifconf *host_ifconf;
4343 uint32_t outbufsz;
4344 const argtype ifreq_arg_type[] = { MK_STRUCT(STRUCT_sockaddr_ifreq) };
4345 int target_ifreq_size;
4346 int nb_ifreq;
4347 int free_buf = 0;
4348 int i;
4349 int target_ifc_len;
4350 abi_long target_ifc_buf;
4351 int host_ifc_len;
4352 char *host_ifc_buf;
4354 assert(arg_type[0] == TYPE_PTR);
4355 assert(ie->access == IOC_RW);
4357 arg_type++;
4358 target_size = thunk_type_size(arg_type, 0);
4360 argptr = lock_user(VERIFY_READ, arg, target_size, 1);
4361 if (!argptr)
4362 return -TARGET_EFAULT;
4363 thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST);
4364 unlock_user(argptr, arg, 0);
4366 host_ifconf = (struct ifconf *)(unsigned long)buf_temp;
4367 target_ifc_buf = (abi_long)(unsigned long)host_ifconf->ifc_buf;
4368 target_ifreq_size = thunk_type_size(ifreq_arg_type, 0);
4370 if (target_ifc_buf != 0) {
4371 target_ifc_len = host_ifconf->ifc_len;
4372 nb_ifreq = target_ifc_len / target_ifreq_size;
4373 host_ifc_len = nb_ifreq * sizeof(struct ifreq);
4375 outbufsz = sizeof(*host_ifconf) + host_ifc_len;
4376 if (outbufsz > MAX_STRUCT_SIZE) {
4378 * We can't fit all the extents into the fixed size buffer.
4379 * Allocate one that is large enough and use it instead.
4381 host_ifconf = malloc(outbufsz);
4382 if (!host_ifconf) {
4383 return -TARGET_ENOMEM;
4385 memcpy(host_ifconf, buf_temp, sizeof(*host_ifconf));
4386 free_buf = 1;
4388 host_ifc_buf = (char *)host_ifconf + sizeof(*host_ifconf);
4390 host_ifconf->ifc_len = host_ifc_len;
4391 } else {
4392 host_ifc_buf = NULL;
4394 host_ifconf->ifc_buf = host_ifc_buf;
4396 ret = get_errno(safe_ioctl(fd, ie->host_cmd, host_ifconf));
4397 if (!is_error(ret)) {
4398 /* convert host ifc_len to target ifc_len */
4400 nb_ifreq = host_ifconf->ifc_len / sizeof(struct ifreq);
4401 target_ifc_len = nb_ifreq * target_ifreq_size;
4402 host_ifconf->ifc_len = target_ifc_len;
4404 /* restore target ifc_buf */
4406 host_ifconf->ifc_buf = (char *)(unsigned long)target_ifc_buf;
4408 /* copy struct ifconf to target user */
4410 argptr = lock_user(VERIFY_WRITE, arg, target_size, 0);
4411 if (!argptr)
4412 return -TARGET_EFAULT;
4413 thunk_convert(argptr, host_ifconf, arg_type, THUNK_TARGET);
4414 unlock_user(argptr, arg, target_size);
4416 if (target_ifc_buf != 0) {
4417 /* copy ifreq[] to target user */
4418 argptr = lock_user(VERIFY_WRITE, target_ifc_buf, target_ifc_len, 0);
4419 for (i = 0; i < nb_ifreq ; i++) {
4420 thunk_convert(argptr + i * target_ifreq_size,
4421 host_ifc_buf + i * sizeof(struct ifreq),
4422 ifreq_arg_type, THUNK_TARGET);
4424 unlock_user(argptr, target_ifc_buf, target_ifc_len);
4428 if (free_buf) {
4429 free(host_ifconf);
4432 return ret;
4435 #if defined(CONFIG_USBFS)
4436 #if HOST_LONG_BITS > 64
4437 #error USBDEVFS thunks do not support >64 bit hosts yet.
4438 #endif
4439 struct live_urb {
4440 uint64_t target_urb_adr;
4441 uint64_t target_buf_adr;
4442 char *target_buf_ptr;
4443 struct usbdevfs_urb host_urb;
4446 static GHashTable *usbdevfs_urb_hashtable(void)
4448 static GHashTable *urb_hashtable;
4450 if (!urb_hashtable) {
4451 urb_hashtable = g_hash_table_new(g_int64_hash, g_int64_equal);
4453 return urb_hashtable;
4456 static void urb_hashtable_insert(struct live_urb *urb)
4458 GHashTable *urb_hashtable = usbdevfs_urb_hashtable();
4459 g_hash_table_insert(urb_hashtable, urb, urb);
4462 static struct live_urb *urb_hashtable_lookup(uint64_t target_urb_adr)
4464 GHashTable *urb_hashtable = usbdevfs_urb_hashtable();
4465 return g_hash_table_lookup(urb_hashtable, &target_urb_adr);
4468 static void urb_hashtable_remove(struct live_urb *urb)
4470 GHashTable *urb_hashtable = usbdevfs_urb_hashtable();
4471 g_hash_table_remove(urb_hashtable, urb);
4474 static abi_long
4475 do_ioctl_usbdevfs_reapurb(const IOCTLEntry *ie, uint8_t *buf_temp,
4476 int fd, int cmd, abi_long arg)
4478 const argtype usbfsurb_arg_type[] = { MK_STRUCT(STRUCT_usbdevfs_urb) };
4479 const argtype ptrvoid_arg_type[] = { TYPE_PTRVOID, 0, 0 };
4480 struct live_urb *lurb;
4481 void *argptr;
4482 uint64_t hurb;
4483 int target_size;
4484 uintptr_t target_urb_adr;
4485 abi_long ret;
4487 target_size = thunk_type_size(usbfsurb_arg_type, THUNK_TARGET);
4489 memset(buf_temp, 0, sizeof(uint64_t));
4490 ret = get_errno(safe_ioctl(fd, ie->host_cmd, buf_temp));
4491 if (is_error(ret)) {
4492 return ret;
4495 memcpy(&hurb, buf_temp, sizeof(uint64_t));
4496 lurb = (void *)((uintptr_t)hurb - offsetof(struct live_urb, host_urb));
4497 if (!lurb->target_urb_adr) {
4498 return -TARGET_EFAULT;
4500 urb_hashtable_remove(lurb);
4501 unlock_user(lurb->target_buf_ptr, lurb->target_buf_adr,
4502 lurb->host_urb.buffer_length);
4503 lurb->target_buf_ptr = NULL;
4505 /* restore the guest buffer pointer */
4506 lurb->host_urb.buffer = (void *)(uintptr_t)lurb->target_buf_adr;
4508 /* update the guest urb struct */
4509 argptr = lock_user(VERIFY_WRITE, lurb->target_urb_adr, target_size, 0);
4510 if (!argptr) {
4511 g_free(lurb);
4512 return -TARGET_EFAULT;
4514 thunk_convert(argptr, &lurb->host_urb, usbfsurb_arg_type, THUNK_TARGET);
4515 unlock_user(argptr, lurb->target_urb_adr, target_size);
4517 target_size = thunk_type_size(ptrvoid_arg_type, THUNK_TARGET);
4518 /* write back the urb handle */
4519 argptr = lock_user(VERIFY_WRITE, arg, target_size, 0);
4520 if (!argptr) {
4521 g_free(lurb);
4522 return -TARGET_EFAULT;
4525 /* GHashTable uses 64-bit keys but thunk_convert expects uintptr_t */
4526 target_urb_adr = lurb->target_urb_adr;
4527 thunk_convert(argptr, &target_urb_adr, ptrvoid_arg_type, THUNK_TARGET);
4528 unlock_user(argptr, arg, target_size);
4530 g_free(lurb);
4531 return ret;
4534 static abi_long
4535 do_ioctl_usbdevfs_discardurb(const IOCTLEntry *ie,
4536 uint8_t *buf_temp __attribute__((unused)),
4537 int fd, int cmd, abi_long arg)
4539 struct live_urb *lurb;
4541 /* map target address back to host URB with metadata. */
4542 lurb = urb_hashtable_lookup(arg);
4543 if (!lurb) {
4544 return -TARGET_EFAULT;
4546 return get_errno(safe_ioctl(fd, ie->host_cmd, &lurb->host_urb));
4549 static abi_long
4550 do_ioctl_usbdevfs_submiturb(const IOCTLEntry *ie, uint8_t *buf_temp,
4551 int fd, int cmd, abi_long arg)
4553 const argtype *arg_type = ie->arg_type;
4554 int target_size;
4555 abi_long ret;
4556 void *argptr;
4557 int rw_dir;
4558 struct live_urb *lurb;
4561 * each submitted URB needs to map to a unique ID for the
4562 * kernel, and that unique ID needs to be a pointer to
4563 * host memory. hence, we need to malloc for each URB.
4564 * isochronous transfers have a variable length struct.
4566 arg_type++;
4567 target_size = thunk_type_size(arg_type, THUNK_TARGET);
4569 /* construct host copy of urb and metadata */
4570 lurb = g_try_malloc0(sizeof(struct live_urb));
4571 if (!lurb) {
4572 return -TARGET_ENOMEM;
4575 argptr = lock_user(VERIFY_READ, arg, target_size, 1);
4576 if (!argptr) {
4577 g_free(lurb);
4578 return -TARGET_EFAULT;
4580 thunk_convert(&lurb->host_urb, argptr, arg_type, THUNK_HOST);
4581 unlock_user(argptr, arg, 0);
4583 lurb->target_urb_adr = arg;
4584 lurb->target_buf_adr = (uintptr_t)lurb->host_urb.buffer;
4586 /* buffer space used depends on endpoint type so lock the entire buffer */
4587 /* control type urbs should check the buffer contents for true direction */
4588 rw_dir = lurb->host_urb.endpoint & USB_DIR_IN ? VERIFY_WRITE : VERIFY_READ;
4589 lurb->target_buf_ptr = lock_user(rw_dir, lurb->target_buf_adr,
4590 lurb->host_urb.buffer_length, 1);
4591 if (lurb->target_buf_ptr == NULL) {
4592 g_free(lurb);
4593 return -TARGET_EFAULT;
4596 /* update buffer pointer in host copy */
4597 lurb->host_urb.buffer = lurb->target_buf_ptr;
4599 ret = get_errno(safe_ioctl(fd, ie->host_cmd, &lurb->host_urb));
4600 if (is_error(ret)) {
4601 unlock_user(lurb->target_buf_ptr, lurb->target_buf_adr, 0);
4602 g_free(lurb);
4603 } else {
4604 urb_hashtable_insert(lurb);
4607 return ret;
4609 #endif /* CONFIG_USBFS */
4611 static abi_long do_ioctl_dm(const IOCTLEntry *ie, uint8_t *buf_temp, int fd,
4612 int cmd, abi_long arg)
4614 void *argptr;
4615 struct dm_ioctl *host_dm;
4616 abi_long guest_data;
4617 uint32_t guest_data_size;
4618 int target_size;
4619 const argtype *arg_type = ie->arg_type;
4620 abi_long ret;
4621 void *big_buf = NULL;
4622 char *host_data;
4624 arg_type++;
4625 target_size = thunk_type_size(arg_type, 0);
4626 argptr = lock_user(VERIFY_READ, arg, target_size, 1);
4627 if (!argptr) {
4628 ret = -TARGET_EFAULT;
4629 goto out;
4631 thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST);
4632 unlock_user(argptr, arg, 0);
4634 /* buf_temp is too small, so fetch things into a bigger buffer */
4635 big_buf = g_malloc0(((struct dm_ioctl*)buf_temp)->data_size * 2);
4636 memcpy(big_buf, buf_temp, target_size);
4637 buf_temp = big_buf;
4638 host_dm = big_buf;
4640 guest_data = arg + host_dm->data_start;
4641 if ((guest_data - arg) < 0) {
4642 ret = -TARGET_EINVAL;
4643 goto out;
4645 guest_data_size = host_dm->data_size - host_dm->data_start;
4646 host_data = (char*)host_dm + host_dm->data_start;
4648 argptr = lock_user(VERIFY_READ, guest_data, guest_data_size, 1);
4649 if (!argptr) {
4650 ret = -TARGET_EFAULT;
4651 goto out;
4654 switch (ie->host_cmd) {
4655 case DM_REMOVE_ALL:
4656 case DM_LIST_DEVICES:
4657 case DM_DEV_CREATE:
4658 case DM_DEV_REMOVE:
4659 case DM_DEV_SUSPEND:
4660 case DM_DEV_STATUS:
4661 case DM_DEV_WAIT:
4662 case DM_TABLE_STATUS:
4663 case DM_TABLE_CLEAR:
4664 case DM_TABLE_DEPS:
4665 case DM_LIST_VERSIONS:
4666 /* no input data */
4667 break;
4668 case DM_DEV_RENAME:
4669 case DM_DEV_SET_GEOMETRY:
4670 /* data contains only strings */
4671 memcpy(host_data, argptr, guest_data_size);
4672 break;
4673 case DM_TARGET_MSG:
4674 memcpy(host_data, argptr, guest_data_size);
4675 *(uint64_t*)host_data = tswap64(*(uint64_t*)argptr);
4676 break;
4677 case DM_TABLE_LOAD:
4679 void *gspec = argptr;
4680 void *cur_data = host_data;
4681 const argtype arg_type[] = { MK_STRUCT(STRUCT_dm_target_spec) };
4682 int spec_size = thunk_type_size(arg_type, 0);
4683 int i;
4685 for (i = 0; i < host_dm->target_count; i++) {
4686 struct dm_target_spec *spec = cur_data;
4687 uint32_t next;
4688 int slen;
4690 thunk_convert(spec, gspec, arg_type, THUNK_HOST);
4691 slen = strlen((char*)gspec + spec_size) + 1;
4692 next = spec->next;
4693 spec->next = sizeof(*spec) + slen;
4694 strcpy((char*)&spec[1], gspec + spec_size);
4695 gspec += next;
4696 cur_data += spec->next;
4698 break;
4700 default:
4701 ret = -TARGET_EINVAL;
4702 unlock_user(argptr, guest_data, 0);
4703 goto out;
4705 unlock_user(argptr, guest_data, 0);
4707 ret = get_errno(safe_ioctl(fd, ie->host_cmd, buf_temp));
4708 if (!is_error(ret)) {
4709 guest_data = arg + host_dm->data_start;
4710 guest_data_size = host_dm->data_size - host_dm->data_start;
4711 argptr = lock_user(VERIFY_WRITE, guest_data, guest_data_size, 0);
4712 switch (ie->host_cmd) {
4713 case DM_REMOVE_ALL:
4714 case DM_DEV_CREATE:
4715 case DM_DEV_REMOVE:
4716 case DM_DEV_RENAME:
4717 case DM_DEV_SUSPEND:
4718 case DM_DEV_STATUS:
4719 case DM_TABLE_LOAD:
4720 case DM_TABLE_CLEAR:
4721 case DM_TARGET_MSG:
4722 case DM_DEV_SET_GEOMETRY:
4723 /* no return data */
4724 break;
4725 case DM_LIST_DEVICES:
4727 struct dm_name_list *nl = (void*)host_dm + host_dm->data_start;
4728 uint32_t remaining_data = guest_data_size;
4729 void *cur_data = argptr;
4730 const argtype arg_type[] = { MK_STRUCT(STRUCT_dm_name_list) };
4731 int nl_size = 12; /* can't use thunk_size due to alignment */
4733 while (1) {
4734 uint32_t next = nl->next;
4735 if (next) {
4736 nl->next = nl_size + (strlen(nl->name) + 1);
4738 if (remaining_data < nl->next) {
4739 host_dm->flags |= DM_BUFFER_FULL_FLAG;
4740 break;
4742 thunk_convert(cur_data, nl, arg_type, THUNK_TARGET);
4743 strcpy(cur_data + nl_size, nl->name);
4744 cur_data += nl->next;
4745 remaining_data -= nl->next;
4746 if (!next) {
4747 break;
4749 nl = (void*)nl + next;
4751 break;
4753 case DM_DEV_WAIT:
4754 case DM_TABLE_STATUS:
4756 struct dm_target_spec *spec = (void*)host_dm + host_dm->data_start;
4757 void *cur_data = argptr;
4758 const argtype arg_type[] = { MK_STRUCT(STRUCT_dm_target_spec) };
4759 int spec_size = thunk_type_size(arg_type, 0);
4760 int i;
4762 for (i = 0; i < host_dm->target_count; i++) {
4763 uint32_t next = spec->next;
4764 int slen = strlen((char*)&spec[1]) + 1;
4765 spec->next = (cur_data - argptr) + spec_size + slen;
4766 if (guest_data_size < spec->next) {
4767 host_dm->flags |= DM_BUFFER_FULL_FLAG;
4768 break;
4770 thunk_convert(cur_data, spec, arg_type, THUNK_TARGET);
4771 strcpy(cur_data + spec_size, (char*)&spec[1]);
4772 cur_data = argptr + spec->next;
4773 spec = (void*)host_dm + host_dm->data_start + next;
4775 break;
4777 case DM_TABLE_DEPS:
4779 void *hdata = (void*)host_dm + host_dm->data_start;
4780 int count = *(uint32_t*)hdata;
4781 uint64_t *hdev = hdata + 8;
4782 uint64_t *gdev = argptr + 8;
4783 int i;
4785 *(uint32_t*)argptr = tswap32(count);
4786 for (i = 0; i < count; i++) {
4787 *gdev = tswap64(*hdev);
4788 gdev++;
4789 hdev++;
4791 break;
4793 case DM_LIST_VERSIONS:
4795 struct dm_target_versions *vers = (void*)host_dm + host_dm->data_start;
4796 uint32_t remaining_data = guest_data_size;
4797 void *cur_data = argptr;
4798 const argtype arg_type[] = { MK_STRUCT(STRUCT_dm_target_versions) };
4799 int vers_size = thunk_type_size(arg_type, 0);
4801 while (1) {
4802 uint32_t next = vers->next;
4803 if (next) {
4804 vers->next = vers_size + (strlen(vers->name) + 1);
4806 if (remaining_data < vers->next) {
4807 host_dm->flags |= DM_BUFFER_FULL_FLAG;
4808 break;
4810 thunk_convert(cur_data, vers, arg_type, THUNK_TARGET);
4811 strcpy(cur_data + vers_size, vers->name);
4812 cur_data += vers->next;
4813 remaining_data -= vers->next;
4814 if (!next) {
4815 break;
4817 vers = (void*)vers + next;
4819 break;
4821 default:
4822 unlock_user(argptr, guest_data, 0);
4823 ret = -TARGET_EINVAL;
4824 goto out;
4826 unlock_user(argptr, guest_data, guest_data_size);
4828 argptr = lock_user(VERIFY_WRITE, arg, target_size, 0);
4829 if (!argptr) {
4830 ret = -TARGET_EFAULT;
4831 goto out;
4833 thunk_convert(argptr, buf_temp, arg_type, THUNK_TARGET);
4834 unlock_user(argptr, arg, target_size);
4836 out:
4837 g_free(big_buf);
4838 return ret;
4841 static abi_long do_ioctl_blkpg(const IOCTLEntry *ie, uint8_t *buf_temp, int fd,
4842 int cmd, abi_long arg)
4844 void *argptr;
4845 int target_size;
4846 const argtype *arg_type = ie->arg_type;
4847 const argtype part_arg_type[] = { MK_STRUCT(STRUCT_blkpg_partition) };
4848 abi_long ret;
4850 struct blkpg_ioctl_arg *host_blkpg = (void*)buf_temp;
4851 struct blkpg_partition host_part;
4853 /* Read and convert blkpg */
4854 arg_type++;
4855 target_size = thunk_type_size(arg_type, 0);
4856 argptr = lock_user(VERIFY_READ, arg, target_size, 1);
4857 if (!argptr) {
4858 ret = -TARGET_EFAULT;
4859 goto out;
4861 thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST);
4862 unlock_user(argptr, arg, 0);
4864 switch (host_blkpg->op) {
4865 case BLKPG_ADD_PARTITION:
4866 case BLKPG_DEL_PARTITION:
4867 /* payload is struct blkpg_partition */
4868 break;
4869 default:
4870 /* Unknown opcode */
4871 ret = -TARGET_EINVAL;
4872 goto out;
4875 /* Read and convert blkpg->data */
4876 arg = (abi_long)(uintptr_t)host_blkpg->data;
4877 target_size = thunk_type_size(part_arg_type, 0);
4878 argptr = lock_user(VERIFY_READ, arg, target_size, 1);
4879 if (!argptr) {
4880 ret = -TARGET_EFAULT;
4881 goto out;
4883 thunk_convert(&host_part, argptr, part_arg_type, THUNK_HOST);
4884 unlock_user(argptr, arg, 0);
4886 /* Swizzle the data pointer to our local copy and call! */
4887 host_blkpg->data = &host_part;
4888 ret = get_errno(safe_ioctl(fd, ie->host_cmd, host_blkpg));
4890 out:
4891 return ret;
4894 static abi_long do_ioctl_rt(const IOCTLEntry *ie, uint8_t *buf_temp,
4895 int fd, int cmd, abi_long arg)
4897 const argtype *arg_type = ie->arg_type;
4898 const StructEntry *se;
4899 const argtype *field_types;
4900 const int *dst_offsets, *src_offsets;
4901 int target_size;
4902 void *argptr;
4903 abi_ulong *target_rt_dev_ptr = NULL;
4904 unsigned long *host_rt_dev_ptr = NULL;
4905 abi_long ret;
4906 int i;
4908 assert(ie->access == IOC_W);
4909 assert(*arg_type == TYPE_PTR);
4910 arg_type++;
4911 assert(*arg_type == TYPE_STRUCT);
4912 target_size = thunk_type_size(arg_type, 0);
4913 argptr = lock_user(VERIFY_READ, arg, target_size, 1);
4914 if (!argptr) {
4915 return -TARGET_EFAULT;
4917 arg_type++;
4918 assert(*arg_type == (int)STRUCT_rtentry);
4919 se = struct_entries + *arg_type++;
4920 assert(se->convert[0] == NULL);
4921 /* convert struct here to be able to catch rt_dev string */
4922 field_types = se->field_types;
4923 dst_offsets = se->field_offsets[THUNK_HOST];
4924 src_offsets = se->field_offsets[THUNK_TARGET];
4925 for (i = 0; i < se->nb_fields; i++) {
4926 if (dst_offsets[i] == offsetof(struct rtentry, rt_dev)) {
4927 assert(*field_types == TYPE_PTRVOID);
4928 target_rt_dev_ptr = (abi_ulong *)(argptr + src_offsets[i]);
4929 host_rt_dev_ptr = (unsigned long *)(buf_temp + dst_offsets[i]);
4930 if (*target_rt_dev_ptr != 0) {
4931 *host_rt_dev_ptr = (unsigned long)lock_user_string(
4932 tswapal(*target_rt_dev_ptr));
4933 if (!*host_rt_dev_ptr) {
4934 unlock_user(argptr, arg, 0);
4935 return -TARGET_EFAULT;
4937 } else {
4938 *host_rt_dev_ptr = 0;
4940 field_types++;
4941 continue;
4943 field_types = thunk_convert(buf_temp + dst_offsets[i],
4944 argptr + src_offsets[i],
4945 field_types, THUNK_HOST);
4947 unlock_user(argptr, arg, 0);
4949 ret = get_errno(safe_ioctl(fd, ie->host_cmd, buf_temp));
4951 assert(host_rt_dev_ptr != NULL);
4952 assert(target_rt_dev_ptr != NULL);
4953 if (*host_rt_dev_ptr != 0) {
4954 unlock_user((void *)*host_rt_dev_ptr,
4955 *target_rt_dev_ptr, 0);
4957 return ret;
4960 static abi_long do_ioctl_kdsigaccept(const IOCTLEntry *ie, uint8_t *buf_temp,
4961 int fd, int cmd, abi_long arg)
4963 int sig = target_to_host_signal(arg);
4964 return get_errno(safe_ioctl(fd, ie->host_cmd, sig));
4967 static abi_long do_ioctl_SIOCGSTAMP(const IOCTLEntry *ie, uint8_t *buf_temp,
4968 int fd, int cmd, abi_long arg)
4970 struct timeval tv;
4971 abi_long ret;
4973 ret = get_errno(safe_ioctl(fd, SIOCGSTAMP, &tv));
4974 if (is_error(ret)) {
4975 return ret;
4978 if (cmd == (int)TARGET_SIOCGSTAMP_OLD) {
4979 if (copy_to_user_timeval(arg, &tv)) {
4980 return -TARGET_EFAULT;
4982 } else {
4983 if (copy_to_user_timeval64(arg, &tv)) {
4984 return -TARGET_EFAULT;
4988 return ret;
4991 static abi_long do_ioctl_SIOCGSTAMPNS(const IOCTLEntry *ie, uint8_t *buf_temp,
4992 int fd, int cmd, abi_long arg)
4994 struct timespec ts;
4995 abi_long ret;
4997 ret = get_errno(safe_ioctl(fd, SIOCGSTAMPNS, &ts));
4998 if (is_error(ret)) {
4999 return ret;
5002 if (cmd == (int)TARGET_SIOCGSTAMPNS_OLD) {
5003 if (host_to_target_timespec(arg, &ts)) {
5004 return -TARGET_EFAULT;
5006 } else{
5007 if (host_to_target_timespec64(arg, &ts)) {
5008 return -TARGET_EFAULT;
5012 return ret;
5015 #ifdef TIOCGPTPEER
5016 static abi_long do_ioctl_tiocgptpeer(const IOCTLEntry *ie, uint8_t *buf_temp,
5017 int fd, int cmd, abi_long arg)
5019 int flags = target_to_host_bitmask(arg, fcntl_flags_tbl);
5020 return get_errno(safe_ioctl(fd, ie->host_cmd, flags));
5022 #endif
5024 static IOCTLEntry ioctl_entries[] = {
5025 #define IOCTL(cmd, access, ...) \
5026 { TARGET_ ## cmd, cmd, #cmd, access, 0, { __VA_ARGS__ } },
5027 #define IOCTL_SPECIAL(cmd, access, dofn, ...) \
5028 { TARGET_ ## cmd, cmd, #cmd, access, dofn, { __VA_ARGS__ } },
5029 #define IOCTL_IGNORE(cmd) \
5030 { TARGET_ ## cmd, 0, #cmd },
5031 #include "ioctls.h"
5032 { 0, 0, },
5035 /* ??? Implement proper locking for ioctls. */
5036 /* do_ioctl() Must return target values and target errnos. */
5037 static abi_long do_ioctl(int fd, int cmd, abi_long arg)
5039 const IOCTLEntry *ie;
5040 const argtype *arg_type;
5041 abi_long ret;
5042 uint8_t buf_temp[MAX_STRUCT_SIZE];
5043 int target_size;
5044 void *argptr;
5046 ie = ioctl_entries;
5047 for(;;) {
5048 if (ie->target_cmd == 0) {
5049 gemu_log("Unsupported ioctl: cmd=0x%04lx\n", (long)cmd);
5050 return -TARGET_ENOSYS;
5052 if (ie->target_cmd == cmd)
5053 break;
5054 ie++;
5056 arg_type = ie->arg_type;
5057 if (ie->do_ioctl) {
5058 return ie->do_ioctl(ie, buf_temp, fd, cmd, arg);
5059 } else if (!ie->host_cmd) {
5060 /* Some architectures define BSD ioctls in their headers
5061 that are not implemented in Linux. */
5062 return -TARGET_ENOSYS;
5065 switch(arg_type[0]) {
5066 case TYPE_NULL:
5067 /* no argument */
5068 ret = get_errno(safe_ioctl(fd, ie->host_cmd));
5069 break;
5070 case TYPE_PTRVOID:
5071 case TYPE_INT:
5072 ret = get_errno(safe_ioctl(fd, ie->host_cmd, arg));
5073 break;
5074 case TYPE_PTR:
5075 arg_type++;
5076 target_size = thunk_type_size(arg_type, 0);
5077 switch(ie->access) {
5078 case IOC_R:
5079 ret = get_errno(safe_ioctl(fd, ie->host_cmd, buf_temp));
5080 if (!is_error(ret)) {
5081 argptr = lock_user(VERIFY_WRITE, arg, target_size, 0);
5082 if (!argptr)
5083 return -TARGET_EFAULT;
5084 thunk_convert(argptr, buf_temp, arg_type, THUNK_TARGET);
5085 unlock_user(argptr, arg, target_size);
5087 break;
5088 case IOC_W:
5089 argptr = lock_user(VERIFY_READ, arg, target_size, 1);
5090 if (!argptr)
5091 return -TARGET_EFAULT;
5092 thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST);
5093 unlock_user(argptr, arg, 0);
5094 ret = get_errno(safe_ioctl(fd, ie->host_cmd, buf_temp));
5095 break;
5096 default:
5097 case IOC_RW:
5098 argptr = lock_user(VERIFY_READ, arg, target_size, 1);
5099 if (!argptr)
5100 return -TARGET_EFAULT;
5101 thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST);
5102 unlock_user(argptr, arg, 0);
5103 ret = get_errno(safe_ioctl(fd, ie->host_cmd, buf_temp));
5104 if (!is_error(ret)) {
5105 argptr = lock_user(VERIFY_WRITE, arg, target_size, 0);
5106 if (!argptr)
5107 return -TARGET_EFAULT;
5108 thunk_convert(argptr, buf_temp, arg_type, THUNK_TARGET);
5109 unlock_user(argptr, arg, target_size);
5111 break;
5113 break;
5114 default:
5115 gemu_log("Unsupported ioctl type: cmd=0x%04lx type=%d\n",
5116 (long)cmd, arg_type[0]);
5117 ret = -TARGET_ENOSYS;
5118 break;
5120 return ret;
5123 static const bitmask_transtbl iflag_tbl[] = {
5124 { TARGET_IGNBRK, TARGET_IGNBRK, IGNBRK, IGNBRK },
5125 { TARGET_BRKINT, TARGET_BRKINT, BRKINT, BRKINT },
5126 { TARGET_IGNPAR, TARGET_IGNPAR, IGNPAR, IGNPAR },
5127 { TARGET_PARMRK, TARGET_PARMRK, PARMRK, PARMRK },
5128 { TARGET_INPCK, TARGET_INPCK, INPCK, INPCK },
5129 { TARGET_ISTRIP, TARGET_ISTRIP, ISTRIP, ISTRIP },
5130 { TARGET_INLCR, TARGET_INLCR, INLCR, INLCR },
5131 { TARGET_IGNCR, TARGET_IGNCR, IGNCR, IGNCR },
5132 { TARGET_ICRNL, TARGET_ICRNL, ICRNL, ICRNL },
5133 { TARGET_IUCLC, TARGET_IUCLC, IUCLC, IUCLC },
5134 { TARGET_IXON, TARGET_IXON, IXON, IXON },
5135 { TARGET_IXANY, TARGET_IXANY, IXANY, IXANY },
5136 { TARGET_IXOFF, TARGET_IXOFF, IXOFF, IXOFF },
5137 { TARGET_IMAXBEL, TARGET_IMAXBEL, IMAXBEL, IMAXBEL },
5138 { 0, 0, 0, 0 }
5141 static const bitmask_transtbl oflag_tbl[] = {
5142 { TARGET_OPOST, TARGET_OPOST, OPOST, OPOST },
5143 { TARGET_OLCUC, TARGET_OLCUC, OLCUC, OLCUC },
5144 { TARGET_ONLCR, TARGET_ONLCR, ONLCR, ONLCR },
5145 { TARGET_OCRNL, TARGET_OCRNL, OCRNL, OCRNL },
5146 { TARGET_ONOCR, TARGET_ONOCR, ONOCR, ONOCR },
5147 { TARGET_ONLRET, TARGET_ONLRET, ONLRET, ONLRET },
5148 { TARGET_OFILL, TARGET_OFILL, OFILL, OFILL },
5149 { TARGET_OFDEL, TARGET_OFDEL, OFDEL, OFDEL },
5150 { TARGET_NLDLY, TARGET_NL0, NLDLY, NL0 },
5151 { TARGET_NLDLY, TARGET_NL1, NLDLY, NL1 },
5152 { TARGET_CRDLY, TARGET_CR0, CRDLY, CR0 },
5153 { TARGET_CRDLY, TARGET_CR1, CRDLY, CR1 },
5154 { TARGET_CRDLY, TARGET_CR2, CRDLY, CR2 },
5155 { TARGET_CRDLY, TARGET_CR3, CRDLY, CR3 },
5156 { TARGET_TABDLY, TARGET_TAB0, TABDLY, TAB0 },
5157 { TARGET_TABDLY, TARGET_TAB1, TABDLY, TAB1 },
5158 { TARGET_TABDLY, TARGET_TAB2, TABDLY, TAB2 },
5159 { TARGET_TABDLY, TARGET_TAB3, TABDLY, TAB3 },
5160 { TARGET_BSDLY, TARGET_BS0, BSDLY, BS0 },
5161 { TARGET_BSDLY, TARGET_BS1, BSDLY, BS1 },
5162 { TARGET_VTDLY, TARGET_VT0, VTDLY, VT0 },
5163 { TARGET_VTDLY, TARGET_VT1, VTDLY, VT1 },
5164 { TARGET_FFDLY, TARGET_FF0, FFDLY, FF0 },
5165 { TARGET_FFDLY, TARGET_FF1, FFDLY, FF1 },
5166 { 0, 0, 0, 0 }
5169 static const bitmask_transtbl cflag_tbl[] = {
5170 { TARGET_CBAUD, TARGET_B0, CBAUD, B0 },
5171 { TARGET_CBAUD, TARGET_B50, CBAUD, B50 },
5172 { TARGET_CBAUD, TARGET_B75, CBAUD, B75 },
5173 { TARGET_CBAUD, TARGET_B110, CBAUD, B110 },
5174 { TARGET_CBAUD, TARGET_B134, CBAUD, B134 },
5175 { TARGET_CBAUD, TARGET_B150, CBAUD, B150 },
5176 { TARGET_CBAUD, TARGET_B200, CBAUD, B200 },
5177 { TARGET_CBAUD, TARGET_B300, CBAUD, B300 },
5178 { TARGET_CBAUD, TARGET_B600, CBAUD, B600 },
5179 { TARGET_CBAUD, TARGET_B1200, CBAUD, B1200 },
5180 { TARGET_CBAUD, TARGET_B1800, CBAUD, B1800 },
5181 { TARGET_CBAUD, TARGET_B2400, CBAUD, B2400 },
5182 { TARGET_CBAUD, TARGET_B4800, CBAUD, B4800 },
5183 { TARGET_CBAUD, TARGET_B9600, CBAUD, B9600 },
5184 { TARGET_CBAUD, TARGET_B19200, CBAUD, B19200 },
5185 { TARGET_CBAUD, TARGET_B38400, CBAUD, B38400 },
5186 { TARGET_CBAUD, TARGET_B57600, CBAUD, B57600 },
5187 { TARGET_CBAUD, TARGET_B115200, CBAUD, B115200 },
5188 { TARGET_CBAUD, TARGET_B230400, CBAUD, B230400 },
5189 { TARGET_CBAUD, TARGET_B460800, CBAUD, B460800 },
5190 { TARGET_CSIZE, TARGET_CS5, CSIZE, CS5 },
5191 { TARGET_CSIZE, TARGET_CS6, CSIZE, CS6 },
5192 { TARGET_CSIZE, TARGET_CS7, CSIZE, CS7 },
5193 { TARGET_CSIZE, TARGET_CS8, CSIZE, CS8 },
5194 { TARGET_CSTOPB, TARGET_CSTOPB, CSTOPB, CSTOPB },
5195 { TARGET_CREAD, TARGET_CREAD, CREAD, CREAD },
5196 { TARGET_PARENB, TARGET_PARENB, PARENB, PARENB },
5197 { TARGET_PARODD, TARGET_PARODD, PARODD, PARODD },
5198 { TARGET_HUPCL, TARGET_HUPCL, HUPCL, HUPCL },
5199 { TARGET_CLOCAL, TARGET_CLOCAL, CLOCAL, CLOCAL },
5200 { TARGET_CRTSCTS, TARGET_CRTSCTS, CRTSCTS, CRTSCTS },
5201 { 0, 0, 0, 0 }
5204 static const bitmask_transtbl lflag_tbl[] = {
5205 { TARGET_ISIG, TARGET_ISIG, ISIG, ISIG },
5206 { TARGET_ICANON, TARGET_ICANON, ICANON, ICANON },
5207 { TARGET_XCASE, TARGET_XCASE, XCASE, XCASE },
5208 { TARGET_ECHO, TARGET_ECHO, ECHO, ECHO },
5209 { TARGET_ECHOE, TARGET_ECHOE, ECHOE, ECHOE },
5210 { TARGET_ECHOK, TARGET_ECHOK, ECHOK, ECHOK },
5211 { TARGET_ECHONL, TARGET_ECHONL, ECHONL, ECHONL },
5212 { TARGET_NOFLSH, TARGET_NOFLSH, NOFLSH, NOFLSH },
5213 { TARGET_TOSTOP, TARGET_TOSTOP, TOSTOP, TOSTOP },
5214 { TARGET_ECHOCTL, TARGET_ECHOCTL, ECHOCTL, ECHOCTL },
5215 { TARGET_ECHOPRT, TARGET_ECHOPRT, ECHOPRT, ECHOPRT },
5216 { TARGET_ECHOKE, TARGET_ECHOKE, ECHOKE, ECHOKE },
5217 { TARGET_FLUSHO, TARGET_FLUSHO, FLUSHO, FLUSHO },
5218 { TARGET_PENDIN, TARGET_PENDIN, PENDIN, PENDIN },
5219 { TARGET_IEXTEN, TARGET_IEXTEN, IEXTEN, IEXTEN },
5220 { 0, 0, 0, 0 }
5223 static void target_to_host_termios (void *dst, const void *src)
5225 struct host_termios *host = dst;
5226 const struct target_termios *target = src;
5228 host->c_iflag =
5229 target_to_host_bitmask(tswap32(target->c_iflag), iflag_tbl);
5230 host->c_oflag =
5231 target_to_host_bitmask(tswap32(target->c_oflag), oflag_tbl);
5232 host->c_cflag =
5233 target_to_host_bitmask(tswap32(target->c_cflag), cflag_tbl);
5234 host->c_lflag =
5235 target_to_host_bitmask(tswap32(target->c_lflag), lflag_tbl);
5236 host->c_line = target->c_line;
5238 memset(host->c_cc, 0, sizeof(host->c_cc));
5239 host->c_cc[VINTR] = target->c_cc[TARGET_VINTR];
5240 host->c_cc[VQUIT] = target->c_cc[TARGET_VQUIT];
5241 host->c_cc[VERASE] = target->c_cc[TARGET_VERASE];
5242 host->c_cc[VKILL] = target->c_cc[TARGET_VKILL];
5243 host->c_cc[VEOF] = target->c_cc[TARGET_VEOF];
5244 host->c_cc[VTIME] = target->c_cc[TARGET_VTIME];
5245 host->c_cc[VMIN] = target->c_cc[TARGET_VMIN];
5246 host->c_cc[VSWTC] = target->c_cc[TARGET_VSWTC];
5247 host->c_cc[VSTART] = target->c_cc[TARGET_VSTART];
5248 host->c_cc[VSTOP] = target->c_cc[TARGET_VSTOP];
5249 host->c_cc[VSUSP] = target->c_cc[TARGET_VSUSP];
5250 host->c_cc[VEOL] = target->c_cc[TARGET_VEOL];
5251 host->c_cc[VREPRINT] = target->c_cc[TARGET_VREPRINT];
5252 host->c_cc[VDISCARD] = target->c_cc[TARGET_VDISCARD];
5253 host->c_cc[VWERASE] = target->c_cc[TARGET_VWERASE];
5254 host->c_cc[VLNEXT] = target->c_cc[TARGET_VLNEXT];
5255 host->c_cc[VEOL2] = target->c_cc[TARGET_VEOL2];
5258 static void host_to_target_termios (void *dst, const void *src)
5260 struct target_termios *target = dst;
5261 const struct host_termios *host = src;
5263 target->c_iflag =
5264 tswap32(host_to_target_bitmask(host->c_iflag, iflag_tbl));
5265 target->c_oflag =
5266 tswap32(host_to_target_bitmask(host->c_oflag, oflag_tbl));
5267 target->c_cflag =
5268 tswap32(host_to_target_bitmask(host->c_cflag, cflag_tbl));
5269 target->c_lflag =
5270 tswap32(host_to_target_bitmask(host->c_lflag, lflag_tbl));
5271 target->c_line = host->c_line;
5273 memset(target->c_cc, 0, sizeof(target->c_cc));
5274 target->c_cc[TARGET_VINTR] = host->c_cc[VINTR];
5275 target->c_cc[TARGET_VQUIT] = host->c_cc[VQUIT];
5276 target->c_cc[TARGET_VERASE] = host->c_cc[VERASE];
5277 target->c_cc[TARGET_VKILL] = host->c_cc[VKILL];
5278 target->c_cc[TARGET_VEOF] = host->c_cc[VEOF];
5279 target->c_cc[TARGET_VTIME] = host->c_cc[VTIME];
5280 target->c_cc[TARGET_VMIN] = host->c_cc[VMIN];
5281 target->c_cc[TARGET_VSWTC] = host->c_cc[VSWTC];
5282 target->c_cc[TARGET_VSTART] = host->c_cc[VSTART];
5283 target->c_cc[TARGET_VSTOP] = host->c_cc[VSTOP];
5284 target->c_cc[TARGET_VSUSP] = host->c_cc[VSUSP];
5285 target->c_cc[TARGET_VEOL] = host->c_cc[VEOL];
5286 target->c_cc[TARGET_VREPRINT] = host->c_cc[VREPRINT];
5287 target->c_cc[TARGET_VDISCARD] = host->c_cc[VDISCARD];
5288 target->c_cc[TARGET_VWERASE] = host->c_cc[VWERASE];
5289 target->c_cc[TARGET_VLNEXT] = host->c_cc[VLNEXT];
5290 target->c_cc[TARGET_VEOL2] = host->c_cc[VEOL2];
5293 static const StructEntry struct_termios_def = {
5294 .convert = { host_to_target_termios, target_to_host_termios },
5295 .size = { sizeof(struct target_termios), sizeof(struct host_termios) },
5296 .align = { __alignof__(struct target_termios), __alignof__(struct host_termios) },
5299 static bitmask_transtbl mmap_flags_tbl[] = {
5300 { TARGET_MAP_SHARED, TARGET_MAP_SHARED, MAP_SHARED, MAP_SHARED },
5301 { TARGET_MAP_PRIVATE, TARGET_MAP_PRIVATE, MAP_PRIVATE, MAP_PRIVATE },
5302 { TARGET_MAP_FIXED, TARGET_MAP_FIXED, MAP_FIXED, MAP_FIXED },
5303 { TARGET_MAP_ANONYMOUS, TARGET_MAP_ANONYMOUS,
5304 MAP_ANONYMOUS, MAP_ANONYMOUS },
5305 { TARGET_MAP_GROWSDOWN, TARGET_MAP_GROWSDOWN,
5306 MAP_GROWSDOWN, MAP_GROWSDOWN },
5307 { TARGET_MAP_DENYWRITE, TARGET_MAP_DENYWRITE,
5308 MAP_DENYWRITE, MAP_DENYWRITE },
5309 { TARGET_MAP_EXECUTABLE, TARGET_MAP_EXECUTABLE,
5310 MAP_EXECUTABLE, MAP_EXECUTABLE },
5311 { TARGET_MAP_LOCKED, TARGET_MAP_LOCKED, MAP_LOCKED, MAP_LOCKED },
5312 { TARGET_MAP_NORESERVE, TARGET_MAP_NORESERVE,
5313 MAP_NORESERVE, MAP_NORESERVE },
5314 { TARGET_MAP_HUGETLB, TARGET_MAP_HUGETLB, MAP_HUGETLB, MAP_HUGETLB },
5315 /* MAP_STACK had been ignored by the kernel for quite some time.
5316 Recognize it for the target insofar as we do not want to pass
5317 it through to the host. */
5318 { TARGET_MAP_STACK, TARGET_MAP_STACK, 0, 0 },
5319 { 0, 0, 0, 0 }
5322 #if defined(TARGET_I386)
5324 /* NOTE: there is really one LDT for all the threads */
5325 static uint8_t *ldt_table;
5327 static abi_long read_ldt(abi_ulong ptr, unsigned long bytecount)
5329 int size;
5330 void *p;
5332 if (!ldt_table)
5333 return 0;
5334 size = TARGET_LDT_ENTRIES * TARGET_LDT_ENTRY_SIZE;
5335 if (size > bytecount)
5336 size = bytecount;
5337 p = lock_user(VERIFY_WRITE, ptr, size, 0);
5338 if (!p)
5339 return -TARGET_EFAULT;
5340 /* ??? Should this by byteswapped? */
5341 memcpy(p, ldt_table, size);
5342 unlock_user(p, ptr, size);
5343 return size;
5346 /* XXX: add locking support */
5347 static abi_long write_ldt(CPUX86State *env,
5348 abi_ulong ptr, unsigned long bytecount, int oldmode)
5350 struct target_modify_ldt_ldt_s ldt_info;
5351 struct target_modify_ldt_ldt_s *target_ldt_info;
5352 int seg_32bit, contents, read_exec_only, limit_in_pages;
5353 int seg_not_present, useable, lm;
5354 uint32_t *lp, entry_1, entry_2;
5356 if (bytecount != sizeof(ldt_info))
5357 return -TARGET_EINVAL;
5358 if (!lock_user_struct(VERIFY_READ, target_ldt_info, ptr, 1))
5359 return -TARGET_EFAULT;
5360 ldt_info.entry_number = tswap32(target_ldt_info->entry_number);
5361 ldt_info.base_addr = tswapal(target_ldt_info->base_addr);
5362 ldt_info.limit = tswap32(target_ldt_info->limit);
5363 ldt_info.flags = tswap32(target_ldt_info->flags);
5364 unlock_user_struct(target_ldt_info, ptr, 0);
5366 if (ldt_info.entry_number >= TARGET_LDT_ENTRIES)
5367 return -TARGET_EINVAL;
5368 seg_32bit = ldt_info.flags & 1;
5369 contents = (ldt_info.flags >> 1) & 3;
5370 read_exec_only = (ldt_info.flags >> 3) & 1;
5371 limit_in_pages = (ldt_info.flags >> 4) & 1;
5372 seg_not_present = (ldt_info.flags >> 5) & 1;
5373 useable = (ldt_info.flags >> 6) & 1;
5374 #ifdef TARGET_ABI32
5375 lm = 0;
5376 #else
5377 lm = (ldt_info.flags >> 7) & 1;
5378 #endif
5379 if (contents == 3) {
5380 if (oldmode)
5381 return -TARGET_EINVAL;
5382 if (seg_not_present == 0)
5383 return -TARGET_EINVAL;
5385 /* allocate the LDT */
5386 if (!ldt_table) {
5387 env->ldt.base = target_mmap(0,
5388 TARGET_LDT_ENTRIES * TARGET_LDT_ENTRY_SIZE,
5389 PROT_READ|PROT_WRITE,
5390 MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
5391 if (env->ldt.base == -1)
5392 return -TARGET_ENOMEM;
5393 memset(g2h(env->ldt.base), 0,
5394 TARGET_LDT_ENTRIES * TARGET_LDT_ENTRY_SIZE);
5395 env->ldt.limit = 0xffff;
5396 ldt_table = g2h(env->ldt.base);
5399 /* NOTE: same code as Linux kernel */
5400 /* Allow LDTs to be cleared by the user. */
5401 if (ldt_info.base_addr == 0 && ldt_info.limit == 0) {
5402 if (oldmode ||
5403 (contents == 0 &&
5404 read_exec_only == 1 &&
5405 seg_32bit == 0 &&
5406 limit_in_pages == 0 &&
5407 seg_not_present == 1 &&
5408 useable == 0 )) {
5409 entry_1 = 0;
5410 entry_2 = 0;
5411 goto install;
5415 entry_1 = ((ldt_info.base_addr & 0x0000ffff) << 16) |
5416 (ldt_info.limit & 0x0ffff);
5417 entry_2 = (ldt_info.base_addr & 0xff000000) |
5418 ((ldt_info.base_addr & 0x00ff0000) >> 16) |
5419 (ldt_info.limit & 0xf0000) |
5420 ((read_exec_only ^ 1) << 9) |
5421 (contents << 10) |
5422 ((seg_not_present ^ 1) << 15) |
5423 (seg_32bit << 22) |
5424 (limit_in_pages << 23) |
5425 (lm << 21) |
5426 0x7000;
5427 if (!oldmode)
5428 entry_2 |= (useable << 20);
5430 /* Install the new entry ... */
5431 install:
5432 lp = (uint32_t *)(ldt_table + (ldt_info.entry_number << 3));
5433 lp[0] = tswap32(entry_1);
5434 lp[1] = tswap32(entry_2);
5435 return 0;
5438 /* specific and weird i386 syscalls */
5439 static abi_long do_modify_ldt(CPUX86State *env, int func, abi_ulong ptr,
5440 unsigned long bytecount)
5442 abi_long ret;
5444 switch (func) {
5445 case 0:
5446 ret = read_ldt(ptr, bytecount);
5447 break;
5448 case 1:
5449 ret = write_ldt(env, ptr, bytecount, 1);
5450 break;
5451 case 0x11:
5452 ret = write_ldt(env, ptr, bytecount, 0);
5453 break;
5454 default:
5455 ret = -TARGET_ENOSYS;
5456 break;
5458 return ret;
5461 #if defined(TARGET_I386) && defined(TARGET_ABI32)
5462 abi_long do_set_thread_area(CPUX86State *env, abi_ulong ptr)
5464 uint64_t *gdt_table = g2h(env->gdt.base);
5465 struct target_modify_ldt_ldt_s ldt_info;
5466 struct target_modify_ldt_ldt_s *target_ldt_info;
5467 int seg_32bit, contents, read_exec_only, limit_in_pages;
5468 int seg_not_present, useable, lm;
5469 uint32_t *lp, entry_1, entry_2;
5470 int i;
5472 lock_user_struct(VERIFY_WRITE, target_ldt_info, ptr, 1);
5473 if (!target_ldt_info)
5474 return -TARGET_EFAULT;
5475 ldt_info.entry_number = tswap32(target_ldt_info->entry_number);
5476 ldt_info.base_addr = tswapal(target_ldt_info->base_addr);
5477 ldt_info.limit = tswap32(target_ldt_info->limit);
5478 ldt_info.flags = tswap32(target_ldt_info->flags);
5479 if (ldt_info.entry_number == -1) {
5480 for (i=TARGET_GDT_ENTRY_TLS_MIN; i<=TARGET_GDT_ENTRY_TLS_MAX; i++) {
5481 if (gdt_table[i] == 0) {
5482 ldt_info.entry_number = i;
5483 target_ldt_info->entry_number = tswap32(i);
5484 break;
5488 unlock_user_struct(target_ldt_info, ptr, 1);
5490 if (ldt_info.entry_number < TARGET_GDT_ENTRY_TLS_MIN ||
5491 ldt_info.entry_number > TARGET_GDT_ENTRY_TLS_MAX)
5492 return -TARGET_EINVAL;
5493 seg_32bit = ldt_info.flags & 1;
5494 contents = (ldt_info.flags >> 1) & 3;
5495 read_exec_only = (ldt_info.flags >> 3) & 1;
5496 limit_in_pages = (ldt_info.flags >> 4) & 1;
5497 seg_not_present = (ldt_info.flags >> 5) & 1;
5498 useable = (ldt_info.flags >> 6) & 1;
5499 #ifdef TARGET_ABI32
5500 lm = 0;
5501 #else
5502 lm = (ldt_info.flags >> 7) & 1;
5503 #endif
5505 if (contents == 3) {
5506 if (seg_not_present == 0)
5507 return -TARGET_EINVAL;
5510 /* NOTE: same code as Linux kernel */
5511 /* Allow LDTs to be cleared by the user. */
5512 if (ldt_info.base_addr == 0 && ldt_info.limit == 0) {
5513 if ((contents == 0 &&
5514 read_exec_only == 1 &&
5515 seg_32bit == 0 &&
5516 limit_in_pages == 0 &&
5517 seg_not_present == 1 &&
5518 useable == 0 )) {
5519 entry_1 = 0;
5520 entry_2 = 0;
5521 goto install;
5525 entry_1 = ((ldt_info.base_addr & 0x0000ffff) << 16) |
5526 (ldt_info.limit & 0x0ffff);
5527 entry_2 = (ldt_info.base_addr & 0xff000000) |
5528 ((ldt_info.base_addr & 0x00ff0000) >> 16) |
5529 (ldt_info.limit & 0xf0000) |
5530 ((read_exec_only ^ 1) << 9) |
5531 (contents << 10) |
5532 ((seg_not_present ^ 1) << 15) |
5533 (seg_32bit << 22) |
5534 (limit_in_pages << 23) |
5535 (useable << 20) |
5536 (lm << 21) |
5537 0x7000;
5539 /* Install the new entry ... */
5540 install:
5541 lp = (uint32_t *)(gdt_table + ldt_info.entry_number);
5542 lp[0] = tswap32(entry_1);
5543 lp[1] = tswap32(entry_2);
5544 return 0;
5547 static abi_long do_get_thread_area(CPUX86State *env, abi_ulong ptr)
5549 struct target_modify_ldt_ldt_s *target_ldt_info;
5550 uint64_t *gdt_table = g2h(env->gdt.base);
5551 uint32_t base_addr, limit, flags;
5552 int seg_32bit, contents, read_exec_only, limit_in_pages, idx;
5553 int seg_not_present, useable, lm;
5554 uint32_t *lp, entry_1, entry_2;
5556 lock_user_struct(VERIFY_WRITE, target_ldt_info, ptr, 1);
5557 if (!target_ldt_info)
5558 return -TARGET_EFAULT;
5559 idx = tswap32(target_ldt_info->entry_number);
5560 if (idx < TARGET_GDT_ENTRY_TLS_MIN ||
5561 idx > TARGET_GDT_ENTRY_TLS_MAX) {
5562 unlock_user_struct(target_ldt_info, ptr, 1);
5563 return -TARGET_EINVAL;
5565 lp = (uint32_t *)(gdt_table + idx);
5566 entry_1 = tswap32(lp[0]);
5567 entry_2 = tswap32(lp[1]);
5569 read_exec_only = ((entry_2 >> 9) & 1) ^ 1;
5570 contents = (entry_2 >> 10) & 3;
5571 seg_not_present = ((entry_2 >> 15) & 1) ^ 1;
5572 seg_32bit = (entry_2 >> 22) & 1;
5573 limit_in_pages = (entry_2 >> 23) & 1;
5574 useable = (entry_2 >> 20) & 1;
5575 #ifdef TARGET_ABI32
5576 lm = 0;
5577 #else
5578 lm = (entry_2 >> 21) & 1;
5579 #endif
5580 flags = (seg_32bit << 0) | (contents << 1) |
5581 (read_exec_only << 3) | (limit_in_pages << 4) |
5582 (seg_not_present << 5) | (useable << 6) | (lm << 7);
5583 limit = (entry_1 & 0xffff) | (entry_2 & 0xf0000);
5584 base_addr = (entry_1 >> 16) |
5585 (entry_2 & 0xff000000) |
5586 ((entry_2 & 0xff) << 16);
5587 target_ldt_info->base_addr = tswapal(base_addr);
5588 target_ldt_info->limit = tswap32(limit);
5589 target_ldt_info->flags = tswap32(flags);
5590 unlock_user_struct(target_ldt_info, ptr, 1);
5591 return 0;
5593 #endif /* TARGET_I386 && TARGET_ABI32 */
5595 #ifndef TARGET_ABI32
5596 abi_long do_arch_prctl(CPUX86State *env, int code, abi_ulong addr)
5598 abi_long ret = 0;
5599 abi_ulong val;
5600 int idx;
5602 switch(code) {
5603 case TARGET_ARCH_SET_GS:
5604 case TARGET_ARCH_SET_FS:
5605 if (code == TARGET_ARCH_SET_GS)
5606 idx = R_GS;
5607 else
5608 idx = R_FS;
5609 cpu_x86_load_seg(env, idx, 0);
5610 env->segs[idx].base = addr;
5611 break;
5612 case TARGET_ARCH_GET_GS:
5613 case TARGET_ARCH_GET_FS:
5614 if (code == TARGET_ARCH_GET_GS)
5615 idx = R_GS;
5616 else
5617 idx = R_FS;
5618 val = env->segs[idx].base;
5619 if (put_user(val, addr, abi_ulong))
5620 ret = -TARGET_EFAULT;
5621 break;
5622 default:
5623 ret = -TARGET_EINVAL;
5624 break;
5626 return ret;
5628 #endif
5630 #endif /* defined(TARGET_I386) */
5632 #define NEW_STACK_SIZE 0x40000
5635 static pthread_mutex_t clone_lock = PTHREAD_MUTEX_INITIALIZER;
5636 typedef struct {
5637 CPUArchState *env;
5638 pthread_mutex_t mutex;
5639 pthread_cond_t cond;
5640 pthread_t thread;
5641 uint32_t tid;
5642 abi_ulong child_tidptr;
5643 abi_ulong parent_tidptr;
5644 sigset_t sigmask;
5645 } new_thread_info;
5647 static void *clone_func(void *arg)
5649 new_thread_info *info = arg;
5650 CPUArchState *env;
5651 CPUState *cpu;
5652 TaskState *ts;
5654 rcu_register_thread();
5655 tcg_register_thread();
5656 env = info->env;
5657 cpu = env_cpu(env);
5658 thread_cpu = cpu;
5659 ts = (TaskState *)cpu->opaque;
5660 info->tid = sys_gettid();
5661 task_settid(ts);
5662 if (info->child_tidptr)
5663 put_user_u32(info->tid, info->child_tidptr);
5664 if (info->parent_tidptr)
5665 put_user_u32(info->tid, info->parent_tidptr);
5666 qemu_guest_random_seed_thread_part2(cpu->random_seed);
5667 /* Enable signals. */
5668 sigprocmask(SIG_SETMASK, &info->sigmask, NULL);
5669 /* Signal to the parent that we're ready. */
5670 pthread_mutex_lock(&info->mutex);
5671 pthread_cond_broadcast(&info->cond);
5672 pthread_mutex_unlock(&info->mutex);
5673 /* Wait until the parent has finished initializing the tls state. */
5674 pthread_mutex_lock(&clone_lock);
5675 pthread_mutex_unlock(&clone_lock);
5676 cpu_loop(env);
5677 /* never exits */
5678 return NULL;
5681 /* do_fork() Must return host values and target errnos (unlike most
5682 do_*() functions). */
5683 static int do_fork(CPUArchState *env, unsigned int flags, abi_ulong newsp,
5684 abi_ulong parent_tidptr, target_ulong newtls,
5685 abi_ulong child_tidptr)
5687 CPUState *cpu = env_cpu(env);
5688 int ret;
5689 TaskState *ts;
5690 CPUState *new_cpu;
5691 CPUArchState *new_env;
5692 sigset_t sigmask;
5694 flags &= ~CLONE_IGNORED_FLAGS;
5696 /* Emulate vfork() with fork() */
5697 if (flags & CLONE_VFORK)
5698 flags &= ~(CLONE_VFORK | CLONE_VM);
5700 if (flags & CLONE_VM) {
5701 TaskState *parent_ts = (TaskState *)cpu->opaque;
5702 new_thread_info info;
5703 pthread_attr_t attr;
5705 if (((flags & CLONE_THREAD_FLAGS) != CLONE_THREAD_FLAGS) ||
5706 (flags & CLONE_INVALID_THREAD_FLAGS)) {
5707 return -TARGET_EINVAL;
5710 ts = g_new0(TaskState, 1);
5711 init_task_state(ts);
5713 /* Grab a mutex so that thread setup appears atomic. */
5714 pthread_mutex_lock(&clone_lock);
5716 /* we create a new CPU instance. */
5717 new_env = cpu_copy(env);
5718 /* Init regs that differ from the parent. */
5719 cpu_clone_regs(new_env, newsp);
5720 new_cpu = env_cpu(new_env);
5721 new_cpu->opaque = ts;
5722 ts->bprm = parent_ts->bprm;
5723 ts->info = parent_ts->info;
5724 ts->signal_mask = parent_ts->signal_mask;
5726 if (flags & CLONE_CHILD_CLEARTID) {
5727 ts->child_tidptr = child_tidptr;
5730 if (flags & CLONE_SETTLS) {
5731 cpu_set_tls (new_env, newtls);
5734 memset(&info, 0, sizeof(info));
5735 pthread_mutex_init(&info.mutex, NULL);
5736 pthread_mutex_lock(&info.mutex);
5737 pthread_cond_init(&info.cond, NULL);
5738 info.env = new_env;
5739 if (flags & CLONE_CHILD_SETTID) {
5740 info.child_tidptr = child_tidptr;
5742 if (flags & CLONE_PARENT_SETTID) {
5743 info.parent_tidptr = parent_tidptr;
5746 ret = pthread_attr_init(&attr);
5747 ret = pthread_attr_setstacksize(&attr, NEW_STACK_SIZE);
5748 ret = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
5749 /* It is not safe to deliver signals until the child has finished
5750 initializing, so temporarily block all signals. */
5751 sigfillset(&sigmask);
5752 sigprocmask(SIG_BLOCK, &sigmask, &info.sigmask);
5753 cpu->random_seed = qemu_guest_random_seed_thread_part1();
5755 /* If this is our first additional thread, we need to ensure we
5756 * generate code for parallel execution and flush old translations.
5758 if (!parallel_cpus) {
5759 parallel_cpus = true;
5760 tb_flush(cpu);
5763 ret = pthread_create(&info.thread, &attr, clone_func, &info);
5764 /* TODO: Free new CPU state if thread creation failed. */
5766 sigprocmask(SIG_SETMASK, &info.sigmask, NULL);
5767 pthread_attr_destroy(&attr);
5768 if (ret == 0) {
5769 /* Wait for the child to initialize. */
5770 pthread_cond_wait(&info.cond, &info.mutex);
5771 ret = info.tid;
5772 } else {
5773 ret = -1;
5775 pthread_mutex_unlock(&info.mutex);
5776 pthread_cond_destroy(&info.cond);
5777 pthread_mutex_destroy(&info.mutex);
5778 pthread_mutex_unlock(&clone_lock);
5779 } else {
5780 /* if no CLONE_VM, we consider it is a fork */
5781 if (flags & CLONE_INVALID_FORK_FLAGS) {
5782 return -TARGET_EINVAL;
5785 /* We can't support custom termination signals */
5786 if ((flags & CSIGNAL) != TARGET_SIGCHLD) {
5787 return -TARGET_EINVAL;
5790 if (block_signals()) {
5791 return -TARGET_ERESTARTSYS;
5794 fork_start();
5795 ret = fork();
5796 if (ret == 0) {
5797 /* Child Process. */
5798 cpu_clone_regs(env, newsp);
5799 fork_end(1);
5800 /* There is a race condition here. The parent process could
5801 theoretically read the TID in the child process before the child
5802 tid is set. This would require using either ptrace
5803 (not implemented) or having *_tidptr to point at a shared memory
5804 mapping. We can't repeat the spinlock hack used above because
5805 the child process gets its own copy of the lock. */
5806 if (flags & CLONE_CHILD_SETTID)
5807 put_user_u32(sys_gettid(), child_tidptr);
5808 if (flags & CLONE_PARENT_SETTID)
5809 put_user_u32(sys_gettid(), parent_tidptr);
5810 ts = (TaskState *)cpu->opaque;
5811 if (flags & CLONE_SETTLS)
5812 cpu_set_tls (env, newtls);
5813 if (flags & CLONE_CHILD_CLEARTID)
5814 ts->child_tidptr = child_tidptr;
5815 } else {
5816 fork_end(0);
5819 return ret;
5822 /* warning : doesn't handle linux specific flags... */
5823 static int target_to_host_fcntl_cmd(int cmd)
5825 int ret;
5827 switch(cmd) {
5828 case TARGET_F_DUPFD:
5829 case TARGET_F_GETFD:
5830 case TARGET_F_SETFD:
5831 case TARGET_F_GETFL:
5832 case TARGET_F_SETFL:
5833 ret = cmd;
5834 break;
5835 case TARGET_F_GETLK:
5836 ret = F_GETLK64;
5837 break;
5838 case TARGET_F_SETLK:
5839 ret = F_SETLK64;
5840 break;
5841 case TARGET_F_SETLKW:
5842 ret = F_SETLKW64;
5843 break;
5844 case TARGET_F_GETOWN:
5845 ret = F_GETOWN;
5846 break;
5847 case TARGET_F_SETOWN:
5848 ret = F_SETOWN;
5849 break;
5850 case TARGET_F_GETSIG:
5851 ret = F_GETSIG;
5852 break;
5853 case TARGET_F_SETSIG:
5854 ret = F_SETSIG;
5855 break;
5856 #if TARGET_ABI_BITS == 32
5857 case TARGET_F_GETLK64:
5858 ret = F_GETLK64;
5859 break;
5860 case TARGET_F_SETLK64:
5861 ret = F_SETLK64;
5862 break;
5863 case TARGET_F_SETLKW64:
5864 ret = F_SETLKW64;
5865 break;
5866 #endif
5867 case TARGET_F_SETLEASE:
5868 ret = F_SETLEASE;
5869 break;
5870 case TARGET_F_GETLEASE:
5871 ret = F_GETLEASE;
5872 break;
5873 #ifdef F_DUPFD_CLOEXEC
5874 case TARGET_F_DUPFD_CLOEXEC:
5875 ret = F_DUPFD_CLOEXEC;
5876 break;
5877 #endif
5878 case TARGET_F_NOTIFY:
5879 ret = F_NOTIFY;
5880 break;
5881 #ifdef F_GETOWN_EX
5882 case TARGET_F_GETOWN_EX:
5883 ret = F_GETOWN_EX;
5884 break;
5885 #endif
5886 #ifdef F_SETOWN_EX
5887 case TARGET_F_SETOWN_EX:
5888 ret = F_SETOWN_EX;
5889 break;
5890 #endif
5891 #ifdef F_SETPIPE_SZ
5892 case TARGET_F_SETPIPE_SZ:
5893 ret = F_SETPIPE_SZ;
5894 break;
5895 case TARGET_F_GETPIPE_SZ:
5896 ret = F_GETPIPE_SZ;
5897 break;
5898 #endif
5899 default:
5900 ret = -TARGET_EINVAL;
5901 break;
5904 #if defined(__powerpc64__)
5905 /* On PPC64, glibc headers has the F_*LK* defined to 12, 13 and 14 and
5906 * is not supported by kernel. The glibc fcntl call actually adjusts
5907 * them to 5, 6 and 7 before making the syscall(). Since we make the
5908 * syscall directly, adjust to what is supported by the kernel.
5910 if (ret >= F_GETLK64 && ret <= F_SETLKW64) {
5911 ret -= F_GETLK64 - 5;
5913 #endif
5915 return ret;
5918 #define FLOCK_TRANSTBL \
5919 switch (type) { \
5920 TRANSTBL_CONVERT(F_RDLCK); \
5921 TRANSTBL_CONVERT(F_WRLCK); \
5922 TRANSTBL_CONVERT(F_UNLCK); \
5923 TRANSTBL_CONVERT(F_EXLCK); \
5924 TRANSTBL_CONVERT(F_SHLCK); \
5927 static int target_to_host_flock(int type)
5929 #define TRANSTBL_CONVERT(a) case TARGET_##a: return a
5930 FLOCK_TRANSTBL
5931 #undef TRANSTBL_CONVERT
5932 return -TARGET_EINVAL;
5935 static int host_to_target_flock(int type)
5937 #define TRANSTBL_CONVERT(a) case a: return TARGET_##a
5938 FLOCK_TRANSTBL
5939 #undef TRANSTBL_CONVERT
5940 /* if we don't know how to convert the value coming
5941 * from the host we copy to the target field as-is
5943 return type;
5946 static inline abi_long copy_from_user_flock(struct flock64 *fl,
5947 abi_ulong target_flock_addr)
5949 struct target_flock *target_fl;
5950 int l_type;
5952 if (!lock_user_struct(VERIFY_READ, target_fl, target_flock_addr, 1)) {
5953 return -TARGET_EFAULT;
5956 __get_user(l_type, &target_fl->l_type);
5957 l_type = target_to_host_flock(l_type);
5958 if (l_type < 0) {
5959 return l_type;
5961 fl->l_type = l_type;
5962 __get_user(fl->l_whence, &target_fl->l_whence);
5963 __get_user(fl->l_start, &target_fl->l_start);
5964 __get_user(fl->l_len, &target_fl->l_len);
5965 __get_user(fl->l_pid, &target_fl->l_pid);
5966 unlock_user_struct(target_fl, target_flock_addr, 0);
5967 return 0;
5970 static inline abi_long copy_to_user_flock(abi_ulong target_flock_addr,
5971 const struct flock64 *fl)
5973 struct target_flock *target_fl;
5974 short l_type;
5976 if (!lock_user_struct(VERIFY_WRITE, target_fl, target_flock_addr, 0)) {
5977 return -TARGET_EFAULT;
5980 l_type = host_to_target_flock(fl->l_type);
5981 __put_user(l_type, &target_fl->l_type);
5982 __put_user(fl->l_whence, &target_fl->l_whence);
5983 __put_user(fl->l_start, &target_fl->l_start);
5984 __put_user(fl->l_len, &target_fl->l_len);
5985 __put_user(fl->l_pid, &target_fl->l_pid);
5986 unlock_user_struct(target_fl, target_flock_addr, 1);
5987 return 0;
5990 typedef abi_long from_flock64_fn(struct flock64 *fl, abi_ulong target_addr);
5991 typedef abi_long to_flock64_fn(abi_ulong target_addr, const struct flock64 *fl);
5993 #if defined(TARGET_ARM) && TARGET_ABI_BITS == 32
5994 static inline abi_long copy_from_user_oabi_flock64(struct flock64 *fl,
5995 abi_ulong target_flock_addr)
5997 struct target_oabi_flock64 *target_fl;
5998 int l_type;
6000 if (!lock_user_struct(VERIFY_READ, target_fl, target_flock_addr, 1)) {
6001 return -TARGET_EFAULT;
6004 __get_user(l_type, &target_fl->l_type);
6005 l_type = target_to_host_flock(l_type);
6006 if (l_type < 0) {
6007 return l_type;
6009 fl->l_type = l_type;
6010 __get_user(fl->l_whence, &target_fl->l_whence);
6011 __get_user(fl->l_start, &target_fl->l_start);
6012 __get_user(fl->l_len, &target_fl->l_len);
6013 __get_user(fl->l_pid, &target_fl->l_pid);
6014 unlock_user_struct(target_fl, target_flock_addr, 0);
6015 return 0;
6018 static inline abi_long copy_to_user_oabi_flock64(abi_ulong target_flock_addr,
6019 const struct flock64 *fl)
6021 struct target_oabi_flock64 *target_fl;
6022 short l_type;
6024 if (!lock_user_struct(VERIFY_WRITE, target_fl, target_flock_addr, 0)) {
6025 return -TARGET_EFAULT;
6028 l_type = host_to_target_flock(fl->l_type);
6029 __put_user(l_type, &target_fl->l_type);
6030 __put_user(fl->l_whence, &target_fl->l_whence);
6031 __put_user(fl->l_start, &target_fl->l_start);
6032 __put_user(fl->l_len, &target_fl->l_len);
6033 __put_user(fl->l_pid, &target_fl->l_pid);
6034 unlock_user_struct(target_fl, target_flock_addr, 1);
6035 return 0;
6037 #endif
6039 static inline abi_long copy_from_user_flock64(struct flock64 *fl,
6040 abi_ulong target_flock_addr)
6042 struct target_flock64 *target_fl;
6043 int l_type;
6045 if (!lock_user_struct(VERIFY_READ, target_fl, target_flock_addr, 1)) {
6046 return -TARGET_EFAULT;
6049 __get_user(l_type, &target_fl->l_type);
6050 l_type = target_to_host_flock(l_type);
6051 if (l_type < 0) {
6052 return l_type;
6054 fl->l_type = l_type;
6055 __get_user(fl->l_whence, &target_fl->l_whence);
6056 __get_user(fl->l_start, &target_fl->l_start);
6057 __get_user(fl->l_len, &target_fl->l_len);
6058 __get_user(fl->l_pid, &target_fl->l_pid);
6059 unlock_user_struct(target_fl, target_flock_addr, 0);
6060 return 0;
6063 static inline abi_long copy_to_user_flock64(abi_ulong target_flock_addr,
6064 const struct flock64 *fl)
6066 struct target_flock64 *target_fl;
6067 short l_type;
6069 if (!lock_user_struct(VERIFY_WRITE, target_fl, target_flock_addr, 0)) {
6070 return -TARGET_EFAULT;
6073 l_type = host_to_target_flock(fl->l_type);
6074 __put_user(l_type, &target_fl->l_type);
6075 __put_user(fl->l_whence, &target_fl->l_whence);
6076 __put_user(fl->l_start, &target_fl->l_start);
6077 __put_user(fl->l_len, &target_fl->l_len);
6078 __put_user(fl->l_pid, &target_fl->l_pid);
6079 unlock_user_struct(target_fl, target_flock_addr, 1);
6080 return 0;
6083 static abi_long do_fcntl(int fd, int cmd, abi_ulong arg)
6085 struct flock64 fl64;
6086 #ifdef F_GETOWN_EX
6087 struct f_owner_ex fox;
6088 struct target_f_owner_ex *target_fox;
6089 #endif
6090 abi_long ret;
6091 int host_cmd = target_to_host_fcntl_cmd(cmd);
6093 if (host_cmd == -TARGET_EINVAL)
6094 return host_cmd;
6096 switch(cmd) {
6097 case TARGET_F_GETLK:
6098 ret = copy_from_user_flock(&fl64, arg);
6099 if (ret) {
6100 return ret;
6102 ret = get_errno(safe_fcntl(fd, host_cmd, &fl64));
6103 if (ret == 0) {
6104 ret = copy_to_user_flock(arg, &fl64);
6106 break;
6108 case TARGET_F_SETLK:
6109 case TARGET_F_SETLKW:
6110 ret = copy_from_user_flock(&fl64, arg);
6111 if (ret) {
6112 return ret;
6114 ret = get_errno(safe_fcntl(fd, host_cmd, &fl64));
6115 break;
6117 case TARGET_F_GETLK64:
6118 ret = copy_from_user_flock64(&fl64, arg);
6119 if (ret) {
6120 return ret;
6122 ret = get_errno(safe_fcntl(fd, host_cmd, &fl64));
6123 if (ret == 0) {
6124 ret = copy_to_user_flock64(arg, &fl64);
6126 break;
6127 case TARGET_F_SETLK64:
6128 case TARGET_F_SETLKW64:
6129 ret = copy_from_user_flock64(&fl64, arg);
6130 if (ret) {
6131 return ret;
6133 ret = get_errno(safe_fcntl(fd, host_cmd, &fl64));
6134 break;
6136 case TARGET_F_GETFL:
6137 ret = get_errno(safe_fcntl(fd, host_cmd, arg));
6138 if (ret >= 0) {
6139 ret = host_to_target_bitmask(ret, fcntl_flags_tbl);
6141 break;
6143 case TARGET_F_SETFL:
6144 ret = get_errno(safe_fcntl(fd, host_cmd,
6145 target_to_host_bitmask(arg,
6146 fcntl_flags_tbl)));
6147 break;
6149 #ifdef F_GETOWN_EX
6150 case TARGET_F_GETOWN_EX:
6151 ret = get_errno(safe_fcntl(fd, host_cmd, &fox));
6152 if (ret >= 0) {
6153 if (!lock_user_struct(VERIFY_WRITE, target_fox, arg, 0))
6154 return -TARGET_EFAULT;
6155 target_fox->type = tswap32(fox.type);
6156 target_fox->pid = tswap32(fox.pid);
6157 unlock_user_struct(target_fox, arg, 1);
6159 break;
6160 #endif
6162 #ifdef F_SETOWN_EX
6163 case TARGET_F_SETOWN_EX:
6164 if (!lock_user_struct(VERIFY_READ, target_fox, arg, 1))
6165 return -TARGET_EFAULT;
6166 fox.type = tswap32(target_fox->type);
6167 fox.pid = tswap32(target_fox->pid);
6168 unlock_user_struct(target_fox, arg, 0);
6169 ret = get_errno(safe_fcntl(fd, host_cmd, &fox));
6170 break;
6171 #endif
6173 case TARGET_F_SETOWN:
6174 case TARGET_F_GETOWN:
6175 case TARGET_F_SETSIG:
6176 case TARGET_F_GETSIG:
6177 case TARGET_F_SETLEASE:
6178 case TARGET_F_GETLEASE:
6179 case TARGET_F_SETPIPE_SZ:
6180 case TARGET_F_GETPIPE_SZ:
6181 ret = get_errno(safe_fcntl(fd, host_cmd, arg));
6182 break;
6184 default:
6185 ret = get_errno(safe_fcntl(fd, cmd, arg));
6186 break;
6188 return ret;
6191 #ifdef USE_UID16
6193 static inline int high2lowuid(int uid)
6195 if (uid > 65535)
6196 return 65534;
6197 else
6198 return uid;
6201 static inline int high2lowgid(int gid)
6203 if (gid > 65535)
6204 return 65534;
6205 else
6206 return gid;
6209 static inline int low2highuid(int uid)
6211 if ((int16_t)uid == -1)
6212 return -1;
6213 else
6214 return uid;
6217 static inline int low2highgid(int gid)
6219 if ((int16_t)gid == -1)
6220 return -1;
6221 else
6222 return gid;
6224 static inline int tswapid(int id)
6226 return tswap16(id);
6229 #define put_user_id(x, gaddr) put_user_u16(x, gaddr)
6231 #else /* !USE_UID16 */
6232 static inline int high2lowuid(int uid)
6234 return uid;
6236 static inline int high2lowgid(int gid)
6238 return gid;
6240 static inline int low2highuid(int uid)
6242 return uid;
6244 static inline int low2highgid(int gid)
6246 return gid;
6248 static inline int tswapid(int id)
6250 return tswap32(id);
6253 #define put_user_id(x, gaddr) put_user_u32(x, gaddr)
6255 #endif /* USE_UID16 */
6257 /* We must do direct syscalls for setting UID/GID, because we want to
6258 * implement the Linux system call semantics of "change only for this thread",
6259 * not the libc/POSIX semantics of "change for all threads in process".
6260 * (See http://ewontfix.com/17/ for more details.)
6261 * We use the 32-bit version of the syscalls if present; if it is not
6262 * then either the host architecture supports 32-bit UIDs natively with
6263 * the standard syscall, or the 16-bit UID is the best we can do.
6265 #ifdef __NR_setuid32
6266 #define __NR_sys_setuid __NR_setuid32
6267 #else
6268 #define __NR_sys_setuid __NR_setuid
6269 #endif
6270 #ifdef __NR_setgid32
6271 #define __NR_sys_setgid __NR_setgid32
6272 #else
6273 #define __NR_sys_setgid __NR_setgid
6274 #endif
6275 #ifdef __NR_setresuid32
6276 #define __NR_sys_setresuid __NR_setresuid32
6277 #else
6278 #define __NR_sys_setresuid __NR_setresuid
6279 #endif
6280 #ifdef __NR_setresgid32
6281 #define __NR_sys_setresgid __NR_setresgid32
6282 #else
6283 #define __NR_sys_setresgid __NR_setresgid
6284 #endif
6286 _syscall1(int, sys_setuid, uid_t, uid)
6287 _syscall1(int, sys_setgid, gid_t, gid)
6288 _syscall3(int, sys_setresuid, uid_t, ruid, uid_t, euid, uid_t, suid)
6289 _syscall3(int, sys_setresgid, gid_t, rgid, gid_t, egid, gid_t, sgid)
6291 void syscall_init(void)
6293 IOCTLEntry *ie;
6294 const argtype *arg_type;
6295 int size;
6296 int i;
6298 thunk_init(STRUCT_MAX);
6300 #define STRUCT(name, ...) thunk_register_struct(STRUCT_ ## name, #name, struct_ ## name ## _def);
6301 #define STRUCT_SPECIAL(name) thunk_register_struct_direct(STRUCT_ ## name, #name, &struct_ ## name ## _def);
6302 #include "syscall_types.h"
6303 #undef STRUCT
6304 #undef STRUCT_SPECIAL
6306 /* Build target_to_host_errno_table[] table from
6307 * host_to_target_errno_table[]. */
6308 for (i = 0; i < ERRNO_TABLE_SIZE; i++) {
6309 target_to_host_errno_table[host_to_target_errno_table[i]] = i;
6312 /* we patch the ioctl size if necessary. We rely on the fact that
6313 no ioctl has all the bits at '1' in the size field */
6314 ie = ioctl_entries;
6315 while (ie->target_cmd != 0) {
6316 if (((ie->target_cmd >> TARGET_IOC_SIZESHIFT) & TARGET_IOC_SIZEMASK) ==
6317 TARGET_IOC_SIZEMASK) {
6318 arg_type = ie->arg_type;
6319 if (arg_type[0] != TYPE_PTR) {
6320 fprintf(stderr, "cannot patch size for ioctl 0x%x\n",
6321 ie->target_cmd);
6322 exit(1);
6324 arg_type++;
6325 size = thunk_type_size(arg_type, 0);
6326 ie->target_cmd = (ie->target_cmd &
6327 ~(TARGET_IOC_SIZEMASK << TARGET_IOC_SIZESHIFT)) |
6328 (size << TARGET_IOC_SIZESHIFT);
6331 /* automatic consistency check if same arch */
6332 #if (defined(__i386__) && defined(TARGET_I386) && defined(TARGET_ABI32)) || \
6333 (defined(__x86_64__) && defined(TARGET_X86_64))
6334 if (unlikely(ie->target_cmd != ie->host_cmd)) {
6335 fprintf(stderr, "ERROR: ioctl(%s): target=0x%x host=0x%x\n",
6336 ie->name, ie->target_cmd, ie->host_cmd);
6338 #endif
6339 ie++;
6343 #if TARGET_ABI_BITS == 32
6344 static inline uint64_t target_offset64(uint32_t word0, uint32_t word1)
6346 #ifdef TARGET_WORDS_BIGENDIAN
6347 return ((uint64_t)word0 << 32) | word1;
6348 #else
6349 return ((uint64_t)word1 << 32) | word0;
6350 #endif
6352 #else /* TARGET_ABI_BITS == 32 */
6353 static inline uint64_t target_offset64(uint64_t word0, uint64_t word1)
6355 return word0;
6357 #endif /* TARGET_ABI_BITS != 32 */
6359 #ifdef TARGET_NR_truncate64
6360 static inline abi_long target_truncate64(void *cpu_env, const char *arg1,
6361 abi_long arg2,
6362 abi_long arg3,
6363 abi_long arg4)
6365 if (regpairs_aligned(cpu_env, TARGET_NR_truncate64)) {
6366 arg2 = arg3;
6367 arg3 = arg4;
6369 return get_errno(truncate64(arg1, target_offset64(arg2, arg3)));
6371 #endif
6373 #ifdef TARGET_NR_ftruncate64
6374 static inline abi_long target_ftruncate64(void *cpu_env, abi_long arg1,
6375 abi_long arg2,
6376 abi_long arg3,
6377 abi_long arg4)
6379 if (regpairs_aligned(cpu_env, TARGET_NR_ftruncate64)) {
6380 arg2 = arg3;
6381 arg3 = arg4;
6383 return get_errno(ftruncate64(arg1, target_offset64(arg2, arg3)));
6385 #endif
6387 static inline abi_long target_to_host_itimerspec(struct itimerspec *host_itspec,
6388 abi_ulong target_addr)
6390 struct target_itimerspec *target_itspec;
6392 if (!lock_user_struct(VERIFY_READ, target_itspec, target_addr, 1)) {
6393 return -TARGET_EFAULT;
6396 host_itspec->it_interval.tv_sec =
6397 tswapal(target_itspec->it_interval.tv_sec);
6398 host_itspec->it_interval.tv_nsec =
6399 tswapal(target_itspec->it_interval.tv_nsec);
6400 host_itspec->it_value.tv_sec = tswapal(target_itspec->it_value.tv_sec);
6401 host_itspec->it_value.tv_nsec = tswapal(target_itspec->it_value.tv_nsec);
6403 unlock_user_struct(target_itspec, target_addr, 1);
6404 return 0;
6407 static inline abi_long host_to_target_itimerspec(abi_ulong target_addr,
6408 struct itimerspec *host_its)
6410 struct target_itimerspec *target_itspec;
6412 if (!lock_user_struct(VERIFY_WRITE, target_itspec, target_addr, 0)) {
6413 return -TARGET_EFAULT;
6416 target_itspec->it_interval.tv_sec = tswapal(host_its->it_interval.tv_sec);
6417 target_itspec->it_interval.tv_nsec = tswapal(host_its->it_interval.tv_nsec);
6419 target_itspec->it_value.tv_sec = tswapal(host_its->it_value.tv_sec);
6420 target_itspec->it_value.tv_nsec = tswapal(host_its->it_value.tv_nsec);
6422 unlock_user_struct(target_itspec, target_addr, 0);
6423 return 0;
6426 static inline abi_long target_to_host_timex(struct timex *host_tx,
6427 abi_long target_addr)
6429 struct target_timex *target_tx;
6431 if (!lock_user_struct(VERIFY_READ, target_tx, target_addr, 1)) {
6432 return -TARGET_EFAULT;
6435 __get_user(host_tx->modes, &target_tx->modes);
6436 __get_user(host_tx->offset, &target_tx->offset);
6437 __get_user(host_tx->freq, &target_tx->freq);
6438 __get_user(host_tx->maxerror, &target_tx->maxerror);
6439 __get_user(host_tx->esterror, &target_tx->esterror);
6440 __get_user(host_tx->status, &target_tx->status);
6441 __get_user(host_tx->constant, &target_tx->constant);
6442 __get_user(host_tx->precision, &target_tx->precision);
6443 __get_user(host_tx->tolerance, &target_tx->tolerance);
6444 __get_user(host_tx->time.tv_sec, &target_tx->time.tv_sec);
6445 __get_user(host_tx->time.tv_usec, &target_tx->time.tv_usec);
6446 __get_user(host_tx->tick, &target_tx->tick);
6447 __get_user(host_tx->ppsfreq, &target_tx->ppsfreq);
6448 __get_user(host_tx->jitter, &target_tx->jitter);
6449 __get_user(host_tx->shift, &target_tx->shift);
6450 __get_user(host_tx->stabil, &target_tx->stabil);
6451 __get_user(host_tx->jitcnt, &target_tx->jitcnt);
6452 __get_user(host_tx->calcnt, &target_tx->calcnt);
6453 __get_user(host_tx->errcnt, &target_tx->errcnt);
6454 __get_user(host_tx->stbcnt, &target_tx->stbcnt);
6455 __get_user(host_tx->tai, &target_tx->tai);
6457 unlock_user_struct(target_tx, target_addr, 0);
6458 return 0;
6461 static inline abi_long host_to_target_timex(abi_long target_addr,
6462 struct timex *host_tx)
6464 struct target_timex *target_tx;
6466 if (!lock_user_struct(VERIFY_WRITE, target_tx, target_addr, 0)) {
6467 return -TARGET_EFAULT;
6470 __put_user(host_tx->modes, &target_tx->modes);
6471 __put_user(host_tx->offset, &target_tx->offset);
6472 __put_user(host_tx->freq, &target_tx->freq);
6473 __put_user(host_tx->maxerror, &target_tx->maxerror);
6474 __put_user(host_tx->esterror, &target_tx->esterror);
6475 __put_user(host_tx->status, &target_tx->status);
6476 __put_user(host_tx->constant, &target_tx->constant);
6477 __put_user(host_tx->precision, &target_tx->precision);
6478 __put_user(host_tx->tolerance, &target_tx->tolerance);
6479 __put_user(host_tx->time.tv_sec, &target_tx->time.tv_sec);
6480 __put_user(host_tx->time.tv_usec, &target_tx->time.tv_usec);
6481 __put_user(host_tx->tick, &target_tx->tick);
6482 __put_user(host_tx->ppsfreq, &target_tx->ppsfreq);
6483 __put_user(host_tx->jitter, &target_tx->jitter);
6484 __put_user(host_tx->shift, &target_tx->shift);
6485 __put_user(host_tx->stabil, &target_tx->stabil);
6486 __put_user(host_tx->jitcnt, &target_tx->jitcnt);
6487 __put_user(host_tx->calcnt, &target_tx->calcnt);
6488 __put_user(host_tx->errcnt, &target_tx->errcnt);
6489 __put_user(host_tx->stbcnt, &target_tx->stbcnt);
6490 __put_user(host_tx->tai, &target_tx->tai);
6492 unlock_user_struct(target_tx, target_addr, 1);
6493 return 0;
6497 static inline abi_long target_to_host_sigevent(struct sigevent *host_sevp,
6498 abi_ulong target_addr)
6500 struct target_sigevent *target_sevp;
6502 if (!lock_user_struct(VERIFY_READ, target_sevp, target_addr, 1)) {
6503 return -TARGET_EFAULT;
6506 /* This union is awkward on 64 bit systems because it has a 32 bit
6507 * integer and a pointer in it; we follow the conversion approach
6508 * used for handling sigval types in signal.c so the guest should get
6509 * the correct value back even if we did a 64 bit byteswap and it's
6510 * using the 32 bit integer.
6512 host_sevp->sigev_value.sival_ptr =
6513 (void *)(uintptr_t)tswapal(target_sevp->sigev_value.sival_ptr);
6514 host_sevp->sigev_signo =
6515 target_to_host_signal(tswap32(target_sevp->sigev_signo));
6516 host_sevp->sigev_notify = tswap32(target_sevp->sigev_notify);
6517 host_sevp->_sigev_un._tid = tswap32(target_sevp->_sigev_un._tid);
6519 unlock_user_struct(target_sevp, target_addr, 1);
6520 return 0;
6523 #if defined(TARGET_NR_mlockall)
6524 static inline int target_to_host_mlockall_arg(int arg)
6526 int result = 0;
6528 if (arg & TARGET_MLOCKALL_MCL_CURRENT) {
6529 result |= MCL_CURRENT;
6531 if (arg & TARGET_MLOCKALL_MCL_FUTURE) {
6532 result |= MCL_FUTURE;
6534 return result;
6536 #endif
6538 #if (defined(TARGET_NR_stat64) || defined(TARGET_NR_lstat64) || \
6539 defined(TARGET_NR_fstat64) || defined(TARGET_NR_fstatat64) || \
6540 defined(TARGET_NR_newfstatat))
6541 static inline abi_long host_to_target_stat64(void *cpu_env,
6542 abi_ulong target_addr,
6543 struct stat *host_st)
6545 #if defined(TARGET_ARM) && defined(TARGET_ABI32)
6546 if (((CPUARMState *)cpu_env)->eabi) {
6547 struct target_eabi_stat64 *target_st;
6549 if (!lock_user_struct(VERIFY_WRITE, target_st, target_addr, 0))
6550 return -TARGET_EFAULT;
6551 memset(target_st, 0, sizeof(struct target_eabi_stat64));
6552 __put_user(host_st->st_dev, &target_st->st_dev);
6553 __put_user(host_st->st_ino, &target_st->st_ino);
6554 #ifdef TARGET_STAT64_HAS_BROKEN_ST_INO
6555 __put_user(host_st->st_ino, &target_st->__st_ino);
6556 #endif
6557 __put_user(host_st->st_mode, &target_st->st_mode);
6558 __put_user(host_st->st_nlink, &target_st->st_nlink);
6559 __put_user(host_st->st_uid, &target_st->st_uid);
6560 __put_user(host_st->st_gid, &target_st->st_gid);
6561 __put_user(host_st->st_rdev, &target_st->st_rdev);
6562 __put_user(host_st->st_size, &target_st->st_size);
6563 __put_user(host_st->st_blksize, &target_st->st_blksize);
6564 __put_user(host_st->st_blocks, &target_st->st_blocks);
6565 __put_user(host_st->st_atime, &target_st->target_st_atime);
6566 __put_user(host_st->st_mtime, &target_st->target_st_mtime);
6567 __put_user(host_st->st_ctime, &target_st->target_st_ctime);
6568 #if _POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700
6569 __put_user(host_st->st_atim.tv_nsec, &target_st->target_st_atime_nsec);
6570 __put_user(host_st->st_mtim.tv_nsec, &target_st->target_st_mtime_nsec);
6571 __put_user(host_st->st_ctim.tv_nsec, &target_st->target_st_ctime_nsec);
6572 #endif
6573 unlock_user_struct(target_st, target_addr, 1);
6574 } else
6575 #endif
6577 #if defined(TARGET_HAS_STRUCT_STAT64)
6578 struct target_stat64 *target_st;
6579 #else
6580 struct target_stat *target_st;
6581 #endif
6583 if (!lock_user_struct(VERIFY_WRITE, target_st, target_addr, 0))
6584 return -TARGET_EFAULT;
6585 memset(target_st, 0, sizeof(*target_st));
6586 __put_user(host_st->st_dev, &target_st->st_dev);
6587 __put_user(host_st->st_ino, &target_st->st_ino);
6588 #ifdef TARGET_STAT64_HAS_BROKEN_ST_INO
6589 __put_user(host_st->st_ino, &target_st->__st_ino);
6590 #endif
6591 __put_user(host_st->st_mode, &target_st->st_mode);
6592 __put_user(host_st->st_nlink, &target_st->st_nlink);
6593 __put_user(host_st->st_uid, &target_st->st_uid);
6594 __put_user(host_st->st_gid, &target_st->st_gid);
6595 __put_user(host_st->st_rdev, &target_st->st_rdev);
6596 /* XXX: better use of kernel struct */
6597 __put_user(host_st->st_size, &target_st->st_size);
6598 __put_user(host_st->st_blksize, &target_st->st_blksize);
6599 __put_user(host_st->st_blocks, &target_st->st_blocks);
6600 __put_user(host_st->st_atime, &target_st->target_st_atime);
6601 __put_user(host_st->st_mtime, &target_st->target_st_mtime);
6602 __put_user(host_st->st_ctime, &target_st->target_st_ctime);
6603 #if _POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700
6604 __put_user(host_st->st_atim.tv_nsec, &target_st->target_st_atime_nsec);
6605 __put_user(host_st->st_mtim.tv_nsec, &target_st->target_st_mtime_nsec);
6606 __put_user(host_st->st_ctim.tv_nsec, &target_st->target_st_ctime_nsec);
6607 #endif
6608 unlock_user_struct(target_st, target_addr, 1);
6611 return 0;
6613 #endif
6615 #if defined(TARGET_NR_statx) && defined(__NR_statx)
6616 static inline abi_long host_to_target_statx(struct target_statx *host_stx,
6617 abi_ulong target_addr)
6619 struct target_statx *target_stx;
6621 if (!lock_user_struct(VERIFY_WRITE, target_stx, target_addr, 0)) {
6622 return -TARGET_EFAULT;
6624 memset(target_stx, 0, sizeof(*target_stx));
6626 __put_user(host_stx->stx_mask, &target_stx->stx_mask);
6627 __put_user(host_stx->stx_blksize, &target_stx->stx_blksize);
6628 __put_user(host_stx->stx_attributes, &target_stx->stx_attributes);
6629 __put_user(host_stx->stx_nlink, &target_stx->stx_nlink);
6630 __put_user(host_stx->stx_uid, &target_stx->stx_uid);
6631 __put_user(host_stx->stx_gid, &target_stx->stx_gid);
6632 __put_user(host_stx->stx_mode, &target_stx->stx_mode);
6633 __put_user(host_stx->stx_ino, &target_stx->stx_ino);
6634 __put_user(host_stx->stx_size, &target_stx->stx_size);
6635 __put_user(host_stx->stx_blocks, &target_stx->stx_blocks);
6636 __put_user(host_stx->stx_attributes_mask, &target_stx->stx_attributes_mask);
6637 __put_user(host_stx->stx_atime.tv_sec, &target_stx->stx_atime.tv_sec);
6638 __put_user(host_stx->stx_atime.tv_nsec, &target_stx->stx_atime.tv_nsec);
6639 __put_user(host_stx->stx_btime.tv_sec, &target_stx->stx_atime.tv_sec);
6640 __put_user(host_stx->stx_btime.tv_nsec, &target_stx->stx_atime.tv_nsec);
6641 __put_user(host_stx->stx_ctime.tv_sec, &target_stx->stx_atime.tv_sec);
6642 __put_user(host_stx->stx_ctime.tv_nsec, &target_stx->stx_atime.tv_nsec);
6643 __put_user(host_stx->stx_mtime.tv_sec, &target_stx->stx_atime.tv_sec);
6644 __put_user(host_stx->stx_mtime.tv_nsec, &target_stx->stx_atime.tv_nsec);
6645 __put_user(host_stx->stx_rdev_major, &target_stx->stx_rdev_major);
6646 __put_user(host_stx->stx_rdev_minor, &target_stx->stx_rdev_minor);
6647 __put_user(host_stx->stx_dev_major, &target_stx->stx_dev_major);
6648 __put_user(host_stx->stx_dev_minor, &target_stx->stx_dev_minor);
6650 unlock_user_struct(target_stx, target_addr, 1);
6652 return 0;
6654 #endif
6657 /* ??? Using host futex calls even when target atomic operations
6658 are not really atomic probably breaks things. However implementing
6659 futexes locally would make futexes shared between multiple processes
6660 tricky. However they're probably useless because guest atomic
6661 operations won't work either. */
6662 static int do_futex(target_ulong uaddr, int op, int val, target_ulong timeout,
6663 target_ulong uaddr2, int val3)
6665 struct timespec ts, *pts;
6666 int base_op;
6668 /* ??? We assume FUTEX_* constants are the same on both host
6669 and target. */
6670 #ifdef FUTEX_CMD_MASK
6671 base_op = op & FUTEX_CMD_MASK;
6672 #else
6673 base_op = op;
6674 #endif
6675 switch (base_op) {
6676 case FUTEX_WAIT:
6677 case FUTEX_WAIT_BITSET:
6678 if (timeout) {
6679 pts = &ts;
6680 target_to_host_timespec(pts, timeout);
6681 } else {
6682 pts = NULL;
6684 return get_errno(safe_futex(g2h(uaddr), op, tswap32(val),
6685 pts, NULL, val3));
6686 case FUTEX_WAKE:
6687 return get_errno(safe_futex(g2h(uaddr), op, val, NULL, NULL, 0));
6688 case FUTEX_FD:
6689 return get_errno(safe_futex(g2h(uaddr), op, val, NULL, NULL, 0));
6690 case FUTEX_REQUEUE:
6691 case FUTEX_CMP_REQUEUE:
6692 case FUTEX_WAKE_OP:
6693 /* For FUTEX_REQUEUE, FUTEX_CMP_REQUEUE, and FUTEX_WAKE_OP, the
6694 TIMEOUT parameter is interpreted as a uint32_t by the kernel.
6695 But the prototype takes a `struct timespec *'; insert casts
6696 to satisfy the compiler. We do not need to tswap TIMEOUT
6697 since it's not compared to guest memory. */
6698 pts = (struct timespec *)(uintptr_t) timeout;
6699 return get_errno(safe_futex(g2h(uaddr), op, val, pts,
6700 g2h(uaddr2),
6701 (base_op == FUTEX_CMP_REQUEUE
6702 ? tswap32(val3)
6703 : val3)));
6704 default:
6705 return -TARGET_ENOSYS;
6708 #if defined(TARGET_NR_name_to_handle_at) && defined(CONFIG_OPEN_BY_HANDLE)
6709 static abi_long do_name_to_handle_at(abi_long dirfd, abi_long pathname,
6710 abi_long handle, abi_long mount_id,
6711 abi_long flags)
6713 struct file_handle *target_fh;
6714 struct file_handle *fh;
6715 int mid = 0;
6716 abi_long ret;
6717 char *name;
6718 unsigned int size, total_size;
6720 if (get_user_s32(size, handle)) {
6721 return -TARGET_EFAULT;
6724 name = lock_user_string(pathname);
6725 if (!name) {
6726 return -TARGET_EFAULT;
6729 total_size = sizeof(struct file_handle) + size;
6730 target_fh = lock_user(VERIFY_WRITE, handle, total_size, 0);
6731 if (!target_fh) {
6732 unlock_user(name, pathname, 0);
6733 return -TARGET_EFAULT;
6736 fh = g_malloc0(total_size);
6737 fh->handle_bytes = size;
6739 ret = get_errno(name_to_handle_at(dirfd, path(name), fh, &mid, flags));
6740 unlock_user(name, pathname, 0);
6742 /* man name_to_handle_at(2):
6743 * Other than the use of the handle_bytes field, the caller should treat
6744 * the file_handle structure as an opaque data type
6747 memcpy(target_fh, fh, total_size);
6748 target_fh->handle_bytes = tswap32(fh->handle_bytes);
6749 target_fh->handle_type = tswap32(fh->handle_type);
6750 g_free(fh);
6751 unlock_user(target_fh, handle, total_size);
6753 if (put_user_s32(mid, mount_id)) {
6754 return -TARGET_EFAULT;
6757 return ret;
6760 #endif
6762 #if defined(TARGET_NR_open_by_handle_at) && defined(CONFIG_OPEN_BY_HANDLE)
6763 static abi_long do_open_by_handle_at(abi_long mount_fd, abi_long handle,
6764 abi_long flags)
6766 struct file_handle *target_fh;
6767 struct file_handle *fh;
6768 unsigned int size, total_size;
6769 abi_long ret;
6771 if (get_user_s32(size, handle)) {
6772 return -TARGET_EFAULT;
6775 total_size = sizeof(struct file_handle) + size;
6776 target_fh = lock_user(VERIFY_READ, handle, total_size, 1);
6777 if (!target_fh) {
6778 return -TARGET_EFAULT;
6781 fh = g_memdup(target_fh, total_size);
6782 fh->handle_bytes = size;
6783 fh->handle_type = tswap32(target_fh->handle_type);
6785 ret = get_errno(open_by_handle_at(mount_fd, fh,
6786 target_to_host_bitmask(flags, fcntl_flags_tbl)));
6788 g_free(fh);
6790 unlock_user(target_fh, handle, total_size);
6792 return ret;
6794 #endif
6796 #if defined(TARGET_NR_signalfd) || defined(TARGET_NR_signalfd4)
6798 static abi_long do_signalfd4(int fd, abi_long mask, int flags)
6800 int host_flags;
6801 target_sigset_t *target_mask;
6802 sigset_t host_mask;
6803 abi_long ret;
6805 if (flags & ~(TARGET_O_NONBLOCK | TARGET_O_CLOEXEC)) {
6806 return -TARGET_EINVAL;
6808 if (!lock_user_struct(VERIFY_READ, target_mask, mask, 1)) {
6809 return -TARGET_EFAULT;
6812 target_to_host_sigset(&host_mask, target_mask);
6814 host_flags = target_to_host_bitmask(flags, fcntl_flags_tbl);
6816 ret = get_errno(signalfd(fd, &host_mask, host_flags));
6817 if (ret >= 0) {
6818 fd_trans_register(ret, &target_signalfd_trans);
6821 unlock_user_struct(target_mask, mask, 0);
6823 return ret;
6825 #endif
6827 /* Map host to target signal numbers for the wait family of syscalls.
6828 Assume all other status bits are the same. */
6829 int host_to_target_waitstatus(int status)
6831 if (WIFSIGNALED(status)) {
6832 return host_to_target_signal(WTERMSIG(status)) | (status & ~0x7f);
6834 if (WIFSTOPPED(status)) {
6835 return (host_to_target_signal(WSTOPSIG(status)) << 8)
6836 | (status & 0xff);
6838 return status;
6841 static int open_self_cmdline(void *cpu_env, int fd)
6843 CPUState *cpu = env_cpu((CPUArchState *)cpu_env);
6844 struct linux_binprm *bprm = ((TaskState *)cpu->opaque)->bprm;
6845 int i;
6847 for (i = 0; i < bprm->argc; i++) {
6848 size_t len = strlen(bprm->argv[i]) + 1;
6850 if (write(fd, bprm->argv[i], len) != len) {
6851 return -1;
6855 return 0;
6858 static int open_self_maps(void *cpu_env, int fd)
6860 CPUState *cpu = env_cpu((CPUArchState *)cpu_env);
6861 TaskState *ts = cpu->opaque;
6862 FILE *fp;
6863 char *line = NULL;
6864 size_t len = 0;
6865 ssize_t read;
6867 fp = fopen("/proc/self/maps", "r");
6868 if (fp == NULL) {
6869 return -1;
6872 while ((read = getline(&line, &len, fp)) != -1) {
6873 int fields, dev_maj, dev_min, inode;
6874 uint64_t min, max, offset;
6875 char flag_r, flag_w, flag_x, flag_p;
6876 char path[512] = "";
6877 fields = sscanf(line, "%"PRIx64"-%"PRIx64" %c%c%c%c %"PRIx64" %x:%x %d"
6878 " %512s", &min, &max, &flag_r, &flag_w, &flag_x,
6879 &flag_p, &offset, &dev_maj, &dev_min, &inode, path);
6881 if ((fields < 10) || (fields > 11)) {
6882 continue;
6884 if (h2g_valid(min)) {
6885 int flags = page_get_flags(h2g(min));
6886 max = h2g_valid(max - 1) ? max : (uintptr_t)g2h(GUEST_ADDR_MAX) + 1;
6887 if (page_check_range(h2g(min), max - min, flags) == -1) {
6888 continue;
6890 if (h2g(min) == ts->info->stack_limit) {
6891 pstrcpy(path, sizeof(path), " [stack]");
6893 dprintf(fd, TARGET_ABI_FMT_ptr "-" TARGET_ABI_FMT_ptr
6894 " %c%c%c%c %08" PRIx64 " %02x:%02x %d %s%s\n",
6895 h2g(min), h2g(max - 1) + 1, flag_r, flag_w,
6896 flag_x, flag_p, offset, dev_maj, dev_min, inode,
6897 path[0] ? " " : "", path);
6901 free(line);
6902 fclose(fp);
6904 return 0;
6907 static int open_self_stat(void *cpu_env, int fd)
6909 CPUState *cpu = env_cpu((CPUArchState *)cpu_env);
6910 TaskState *ts = cpu->opaque;
6911 abi_ulong start_stack = ts->info->start_stack;
6912 int i;
6914 for (i = 0; i < 44; i++) {
6915 char buf[128];
6916 int len;
6917 uint64_t val = 0;
6919 if (i == 0) {
6920 /* pid */
6921 val = getpid();
6922 snprintf(buf, sizeof(buf), "%"PRId64 " ", val);
6923 } else if (i == 1) {
6924 /* app name */
6925 snprintf(buf, sizeof(buf), "(%s) ", ts->bprm->argv[0]);
6926 } else if (i == 27) {
6927 /* stack bottom */
6928 val = start_stack;
6929 snprintf(buf, sizeof(buf), "%"PRId64 " ", val);
6930 } else {
6931 /* for the rest, there is MasterCard */
6932 snprintf(buf, sizeof(buf), "0%c", i == 43 ? '\n' : ' ');
6935 len = strlen(buf);
6936 if (write(fd, buf, len) != len) {
6937 return -1;
6941 return 0;
6944 static int open_self_auxv(void *cpu_env, int fd)
6946 CPUState *cpu = env_cpu((CPUArchState *)cpu_env);
6947 TaskState *ts = cpu->opaque;
6948 abi_ulong auxv = ts->info->saved_auxv;
6949 abi_ulong len = ts->info->auxv_len;
6950 char *ptr;
6953 * Auxiliary vector is stored in target process stack.
6954 * read in whole auxv vector and copy it to file
6956 ptr = lock_user(VERIFY_READ, auxv, len, 0);
6957 if (ptr != NULL) {
6958 while (len > 0) {
6959 ssize_t r;
6960 r = write(fd, ptr, len);
6961 if (r <= 0) {
6962 break;
6964 len -= r;
6965 ptr += r;
6967 lseek(fd, 0, SEEK_SET);
6968 unlock_user(ptr, auxv, len);
6971 return 0;
6974 static int is_proc_myself(const char *filename, const char *entry)
6976 if (!strncmp(filename, "/proc/", strlen("/proc/"))) {
6977 filename += strlen("/proc/");
6978 if (!strncmp(filename, "self/", strlen("self/"))) {
6979 filename += strlen("self/");
6980 } else if (*filename >= '1' && *filename <= '9') {
6981 char myself[80];
6982 snprintf(myself, sizeof(myself), "%d/", getpid());
6983 if (!strncmp(filename, myself, strlen(myself))) {
6984 filename += strlen(myself);
6985 } else {
6986 return 0;
6988 } else {
6989 return 0;
6991 if (!strcmp(filename, entry)) {
6992 return 1;
6995 return 0;
6998 #if defined(HOST_WORDS_BIGENDIAN) != defined(TARGET_WORDS_BIGENDIAN) || \
6999 defined(TARGET_SPARC) || defined(TARGET_M68K)
7000 static int is_proc(const char *filename, const char *entry)
7002 return strcmp(filename, entry) == 0;
7004 #endif
7006 #if defined(HOST_WORDS_BIGENDIAN) != defined(TARGET_WORDS_BIGENDIAN)
7007 static int open_net_route(void *cpu_env, int fd)
7009 FILE *fp;
7010 char *line = NULL;
7011 size_t len = 0;
7012 ssize_t read;
7014 fp = fopen("/proc/net/route", "r");
7015 if (fp == NULL) {
7016 return -1;
7019 /* read header */
7021 read = getline(&line, &len, fp);
7022 dprintf(fd, "%s", line);
7024 /* read routes */
7026 while ((read = getline(&line, &len, fp)) != -1) {
7027 char iface[16];
7028 uint32_t dest, gw, mask;
7029 unsigned int flags, refcnt, use, metric, mtu, window, irtt;
7030 int fields;
7032 fields = sscanf(line,
7033 "%s\t%08x\t%08x\t%04x\t%d\t%d\t%d\t%08x\t%d\t%u\t%u\n",
7034 iface, &dest, &gw, &flags, &refcnt, &use, &metric,
7035 &mask, &mtu, &window, &irtt);
7036 if (fields != 11) {
7037 continue;
7039 dprintf(fd, "%s\t%08x\t%08x\t%04x\t%d\t%d\t%d\t%08x\t%d\t%u\t%u\n",
7040 iface, tswap32(dest), tswap32(gw), flags, refcnt, use,
7041 metric, tswap32(mask), mtu, window, irtt);
7044 free(line);
7045 fclose(fp);
7047 return 0;
7049 #endif
7051 #if defined(TARGET_SPARC)
7052 static int open_cpuinfo(void *cpu_env, int fd)
7054 dprintf(fd, "type\t\t: sun4u\n");
7055 return 0;
7057 #endif
7059 #if defined(TARGET_M68K)
7060 static int open_hardware(void *cpu_env, int fd)
7062 dprintf(fd, "Model:\t\tqemu-m68k\n");
7063 return 0;
7065 #endif
7067 static int do_openat(void *cpu_env, int dirfd, const char *pathname, int flags, mode_t mode)
7069 struct fake_open {
7070 const char *filename;
7071 int (*fill)(void *cpu_env, int fd);
7072 int (*cmp)(const char *s1, const char *s2);
7074 const struct fake_open *fake_open;
7075 static const struct fake_open fakes[] = {
7076 { "maps", open_self_maps, is_proc_myself },
7077 { "stat", open_self_stat, is_proc_myself },
7078 { "auxv", open_self_auxv, is_proc_myself },
7079 { "cmdline", open_self_cmdline, is_proc_myself },
7080 #if defined(HOST_WORDS_BIGENDIAN) != defined(TARGET_WORDS_BIGENDIAN)
7081 { "/proc/net/route", open_net_route, is_proc },
7082 #endif
7083 #if defined(TARGET_SPARC)
7084 { "/proc/cpuinfo", open_cpuinfo, is_proc },
7085 #endif
7086 #if defined(TARGET_M68K)
7087 { "/proc/hardware", open_hardware, is_proc },
7088 #endif
7089 { NULL, NULL, NULL }
7092 if (is_proc_myself(pathname, "exe")) {
7093 int execfd = qemu_getauxval(AT_EXECFD);
7094 return execfd ? execfd : safe_openat(dirfd, exec_path, flags, mode);
7097 for (fake_open = fakes; fake_open->filename; fake_open++) {
7098 if (fake_open->cmp(pathname, fake_open->filename)) {
7099 break;
7103 if (fake_open->filename) {
7104 const char *tmpdir;
7105 char filename[PATH_MAX];
7106 int fd, r;
7108 /* create temporary file to map stat to */
7109 tmpdir = getenv("TMPDIR");
7110 if (!tmpdir)
7111 tmpdir = "/tmp";
7112 snprintf(filename, sizeof(filename), "%s/qemu-open.XXXXXX", tmpdir);
7113 fd = mkstemp(filename);
7114 if (fd < 0) {
7115 return fd;
7117 unlink(filename);
7119 if ((r = fake_open->fill(cpu_env, fd))) {
7120 int e = errno;
7121 close(fd);
7122 errno = e;
7123 return r;
7125 lseek(fd, 0, SEEK_SET);
7127 return fd;
7130 return safe_openat(dirfd, path(pathname), flags, mode);
7133 #define TIMER_MAGIC 0x0caf0000
7134 #define TIMER_MAGIC_MASK 0xffff0000
7136 /* Convert QEMU provided timer ID back to internal 16bit index format */
7137 static target_timer_t get_timer_id(abi_long arg)
7139 target_timer_t timerid = arg;
7141 if ((timerid & TIMER_MAGIC_MASK) != TIMER_MAGIC) {
7142 return -TARGET_EINVAL;
7145 timerid &= 0xffff;
7147 if (timerid >= ARRAY_SIZE(g_posix_timers)) {
7148 return -TARGET_EINVAL;
7151 return timerid;
7154 static int target_to_host_cpu_mask(unsigned long *host_mask,
7155 size_t host_size,
7156 abi_ulong target_addr,
7157 size_t target_size)
7159 unsigned target_bits = sizeof(abi_ulong) * 8;
7160 unsigned host_bits = sizeof(*host_mask) * 8;
7161 abi_ulong *target_mask;
7162 unsigned i, j;
7164 assert(host_size >= target_size);
7166 target_mask = lock_user(VERIFY_READ, target_addr, target_size, 1);
7167 if (!target_mask) {
7168 return -TARGET_EFAULT;
7170 memset(host_mask, 0, host_size);
7172 for (i = 0 ; i < target_size / sizeof(abi_ulong); i++) {
7173 unsigned bit = i * target_bits;
7174 abi_ulong val;
7176 __get_user(val, &target_mask[i]);
7177 for (j = 0; j < target_bits; j++, bit++) {
7178 if (val & (1UL << j)) {
7179 host_mask[bit / host_bits] |= 1UL << (bit % host_bits);
7184 unlock_user(target_mask, target_addr, 0);
7185 return 0;
7188 static int host_to_target_cpu_mask(const unsigned long *host_mask,
7189 size_t host_size,
7190 abi_ulong target_addr,
7191 size_t target_size)
7193 unsigned target_bits = sizeof(abi_ulong) * 8;
7194 unsigned host_bits = sizeof(*host_mask) * 8;
7195 abi_ulong *target_mask;
7196 unsigned i, j;
7198 assert(host_size >= target_size);
7200 target_mask = lock_user(VERIFY_WRITE, target_addr, target_size, 0);
7201 if (!target_mask) {
7202 return -TARGET_EFAULT;
7205 for (i = 0 ; i < target_size / sizeof(abi_ulong); i++) {
7206 unsigned bit = i * target_bits;
7207 abi_ulong val = 0;
7209 for (j = 0; j < target_bits; j++, bit++) {
7210 if (host_mask[bit / host_bits] & (1UL << (bit % host_bits))) {
7211 val |= 1UL << j;
7214 __put_user(val, &target_mask[i]);
7217 unlock_user(target_mask, target_addr, target_size);
7218 return 0;
7221 /* This is an internal helper for do_syscall so that it is easier
7222 * to have a single return point, so that actions, such as logging
7223 * of syscall results, can be performed.
7224 * All errnos that do_syscall() returns must be -TARGET_<errcode>.
7226 static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
7227 abi_long arg2, abi_long arg3, abi_long arg4,
7228 abi_long arg5, abi_long arg6, abi_long arg7,
7229 abi_long arg8)
7231 CPUState *cpu = env_cpu(cpu_env);
7232 abi_long ret;
7233 #if defined(TARGET_NR_stat) || defined(TARGET_NR_stat64) \
7234 || defined(TARGET_NR_lstat) || defined(TARGET_NR_lstat64) \
7235 || defined(TARGET_NR_fstat) || defined(TARGET_NR_fstat64) \
7236 || defined(TARGET_NR_statx)
7237 struct stat st;
7238 #endif
7239 #if defined(TARGET_NR_statfs) || defined(TARGET_NR_statfs64) \
7240 || defined(TARGET_NR_fstatfs)
7241 struct statfs stfs;
7242 #endif
7243 void *p;
7245 switch(num) {
7246 case TARGET_NR_exit:
7247 /* In old applications this may be used to implement _exit(2).
7248 However in threaded applictions it is used for thread termination,
7249 and _exit_group is used for application termination.
7250 Do thread termination if we have more then one thread. */
7252 if (block_signals()) {
7253 return -TARGET_ERESTARTSYS;
7256 cpu_list_lock();
7258 if (CPU_NEXT(first_cpu)) {
7259 TaskState *ts;
7261 /* Remove the CPU from the list. */
7262 QTAILQ_REMOVE_RCU(&cpus, cpu, node);
7264 cpu_list_unlock();
7266 ts = cpu->opaque;
7267 if (ts->child_tidptr) {
7268 put_user_u32(0, ts->child_tidptr);
7269 sys_futex(g2h(ts->child_tidptr), FUTEX_WAKE, INT_MAX,
7270 NULL, NULL, 0);
7272 thread_cpu = NULL;
7273 object_unref(OBJECT(cpu));
7274 g_free(ts);
7275 rcu_unregister_thread();
7276 pthread_exit(NULL);
7279 cpu_list_unlock();
7280 preexit_cleanup(cpu_env, arg1);
7281 _exit(arg1);
7282 return 0; /* avoid warning */
7283 case TARGET_NR_read:
7284 if (arg2 == 0 && arg3 == 0) {
7285 return get_errno(safe_read(arg1, 0, 0));
7286 } else {
7287 if (!(p = lock_user(VERIFY_WRITE, arg2, arg3, 0)))
7288 return -TARGET_EFAULT;
7289 ret = get_errno(safe_read(arg1, p, arg3));
7290 if (ret >= 0 &&
7291 fd_trans_host_to_target_data(arg1)) {
7292 ret = fd_trans_host_to_target_data(arg1)(p, ret);
7294 unlock_user(p, arg2, ret);
7296 return ret;
7297 case TARGET_NR_write:
7298 if (arg2 == 0 && arg3 == 0) {
7299 return get_errno(safe_write(arg1, 0, 0));
7301 if (!(p = lock_user(VERIFY_READ, arg2, arg3, 1)))
7302 return -TARGET_EFAULT;
7303 if (fd_trans_target_to_host_data(arg1)) {
7304 void *copy = g_malloc(arg3);
7305 memcpy(copy, p, arg3);
7306 ret = fd_trans_target_to_host_data(arg1)(copy, arg3);
7307 if (ret >= 0) {
7308 ret = get_errno(safe_write(arg1, copy, ret));
7310 g_free(copy);
7311 } else {
7312 ret = get_errno(safe_write(arg1, p, arg3));
7314 unlock_user(p, arg2, 0);
7315 return ret;
7317 #ifdef TARGET_NR_open
7318 case TARGET_NR_open:
7319 if (!(p = lock_user_string(arg1)))
7320 return -TARGET_EFAULT;
7321 ret = get_errno(do_openat(cpu_env, AT_FDCWD, p,
7322 target_to_host_bitmask(arg2, fcntl_flags_tbl),
7323 arg3));
7324 fd_trans_unregister(ret);
7325 unlock_user(p, arg1, 0);
7326 return ret;
7327 #endif
7328 case TARGET_NR_openat:
7329 if (!(p = lock_user_string(arg2)))
7330 return -TARGET_EFAULT;
7331 ret = get_errno(do_openat(cpu_env, arg1, p,
7332 target_to_host_bitmask(arg3, fcntl_flags_tbl),
7333 arg4));
7334 fd_trans_unregister(ret);
7335 unlock_user(p, arg2, 0);
7336 return ret;
7337 #if defined(TARGET_NR_name_to_handle_at) && defined(CONFIG_OPEN_BY_HANDLE)
7338 case TARGET_NR_name_to_handle_at:
7339 ret = do_name_to_handle_at(arg1, arg2, arg3, arg4, arg5);
7340 return ret;
7341 #endif
7342 #if defined(TARGET_NR_open_by_handle_at) && defined(CONFIG_OPEN_BY_HANDLE)
7343 case TARGET_NR_open_by_handle_at:
7344 ret = do_open_by_handle_at(arg1, arg2, arg3);
7345 fd_trans_unregister(ret);
7346 return ret;
7347 #endif
7348 case TARGET_NR_close:
7349 fd_trans_unregister(arg1);
7350 return get_errno(close(arg1));
7352 case TARGET_NR_brk:
7353 return do_brk(arg1);
7354 #ifdef TARGET_NR_fork
7355 case TARGET_NR_fork:
7356 return get_errno(do_fork(cpu_env, TARGET_SIGCHLD, 0, 0, 0, 0));
7357 #endif
7358 #ifdef TARGET_NR_waitpid
7359 case TARGET_NR_waitpid:
7361 int status;
7362 ret = get_errno(safe_wait4(arg1, &status, arg3, 0));
7363 if (!is_error(ret) && arg2 && ret
7364 && put_user_s32(host_to_target_waitstatus(status), arg2))
7365 return -TARGET_EFAULT;
7367 return ret;
7368 #endif
7369 #ifdef TARGET_NR_waitid
7370 case TARGET_NR_waitid:
7372 siginfo_t info;
7373 info.si_pid = 0;
7374 ret = get_errno(safe_waitid(arg1, arg2, &info, arg4, NULL));
7375 if (!is_error(ret) && arg3 && info.si_pid != 0) {
7376 if (!(p = lock_user(VERIFY_WRITE, arg3, sizeof(target_siginfo_t), 0)))
7377 return -TARGET_EFAULT;
7378 host_to_target_siginfo(p, &info);
7379 unlock_user(p, arg3, sizeof(target_siginfo_t));
7382 return ret;
7383 #endif
7384 #ifdef TARGET_NR_creat /* not on alpha */
7385 case TARGET_NR_creat:
7386 if (!(p = lock_user_string(arg1)))
7387 return -TARGET_EFAULT;
7388 ret = get_errno(creat(p, arg2));
7389 fd_trans_unregister(ret);
7390 unlock_user(p, arg1, 0);
7391 return ret;
7392 #endif
7393 #ifdef TARGET_NR_link
7394 case TARGET_NR_link:
7396 void * p2;
7397 p = lock_user_string(arg1);
7398 p2 = lock_user_string(arg2);
7399 if (!p || !p2)
7400 ret = -TARGET_EFAULT;
7401 else
7402 ret = get_errno(link(p, p2));
7403 unlock_user(p2, arg2, 0);
7404 unlock_user(p, arg1, 0);
7406 return ret;
7407 #endif
7408 #if defined(TARGET_NR_linkat)
7409 case TARGET_NR_linkat:
7411 void * p2 = NULL;
7412 if (!arg2 || !arg4)
7413 return -TARGET_EFAULT;
7414 p = lock_user_string(arg2);
7415 p2 = lock_user_string(arg4);
7416 if (!p || !p2)
7417 ret = -TARGET_EFAULT;
7418 else
7419 ret = get_errno(linkat(arg1, p, arg3, p2, arg5));
7420 unlock_user(p, arg2, 0);
7421 unlock_user(p2, arg4, 0);
7423 return ret;
7424 #endif
7425 #ifdef TARGET_NR_unlink
7426 case TARGET_NR_unlink:
7427 if (!(p = lock_user_string(arg1)))
7428 return -TARGET_EFAULT;
7429 ret = get_errno(unlink(p));
7430 unlock_user(p, arg1, 0);
7431 return ret;
7432 #endif
7433 #if defined(TARGET_NR_unlinkat)
7434 case TARGET_NR_unlinkat:
7435 if (!(p = lock_user_string(arg2)))
7436 return -TARGET_EFAULT;
7437 ret = get_errno(unlinkat(arg1, p, arg3));
7438 unlock_user(p, arg2, 0);
7439 return ret;
7440 #endif
7441 case TARGET_NR_execve:
7443 char **argp, **envp;
7444 int argc, envc;
7445 abi_ulong gp;
7446 abi_ulong guest_argp;
7447 abi_ulong guest_envp;
7448 abi_ulong addr;
7449 char **q;
7450 int total_size = 0;
7452 argc = 0;
7453 guest_argp = arg2;
7454 for (gp = guest_argp; gp; gp += sizeof(abi_ulong)) {
7455 if (get_user_ual(addr, gp))
7456 return -TARGET_EFAULT;
7457 if (!addr)
7458 break;
7459 argc++;
7461 envc = 0;
7462 guest_envp = arg3;
7463 for (gp = guest_envp; gp; gp += sizeof(abi_ulong)) {
7464 if (get_user_ual(addr, gp))
7465 return -TARGET_EFAULT;
7466 if (!addr)
7467 break;
7468 envc++;
7471 argp = g_new0(char *, argc + 1);
7472 envp = g_new0(char *, envc + 1);
7474 for (gp = guest_argp, q = argp; gp;
7475 gp += sizeof(abi_ulong), q++) {
7476 if (get_user_ual(addr, gp))
7477 goto execve_efault;
7478 if (!addr)
7479 break;
7480 if (!(*q = lock_user_string(addr)))
7481 goto execve_efault;
7482 total_size += strlen(*q) + 1;
7484 *q = NULL;
7486 for (gp = guest_envp, q = envp; gp;
7487 gp += sizeof(abi_ulong), q++) {
7488 if (get_user_ual(addr, gp))
7489 goto execve_efault;
7490 if (!addr)
7491 break;
7492 if (!(*q = lock_user_string(addr)))
7493 goto execve_efault;
7494 total_size += strlen(*q) + 1;
7496 *q = NULL;
7498 if (!(p = lock_user_string(arg1)))
7499 goto execve_efault;
7500 /* Although execve() is not an interruptible syscall it is
7501 * a special case where we must use the safe_syscall wrapper:
7502 * if we allow a signal to happen before we make the host
7503 * syscall then we will 'lose' it, because at the point of
7504 * execve the process leaves QEMU's control. So we use the
7505 * safe syscall wrapper to ensure that we either take the
7506 * signal as a guest signal, or else it does not happen
7507 * before the execve completes and makes it the other
7508 * program's problem.
7510 ret = get_errno(safe_execve(p, argp, envp));
7511 unlock_user(p, arg1, 0);
7513 goto execve_end;
7515 execve_efault:
7516 ret = -TARGET_EFAULT;
7518 execve_end:
7519 for (gp = guest_argp, q = argp; *q;
7520 gp += sizeof(abi_ulong), q++) {
7521 if (get_user_ual(addr, gp)
7522 || !addr)
7523 break;
7524 unlock_user(*q, addr, 0);
7526 for (gp = guest_envp, q = envp; *q;
7527 gp += sizeof(abi_ulong), q++) {
7528 if (get_user_ual(addr, gp)
7529 || !addr)
7530 break;
7531 unlock_user(*q, addr, 0);
7534 g_free(argp);
7535 g_free(envp);
7537 return ret;
7538 case TARGET_NR_chdir:
7539 if (!(p = lock_user_string(arg1)))
7540 return -TARGET_EFAULT;
7541 ret = get_errno(chdir(p));
7542 unlock_user(p, arg1, 0);
7543 return ret;
7544 #ifdef TARGET_NR_time
7545 case TARGET_NR_time:
7547 time_t host_time;
7548 ret = get_errno(time(&host_time));
7549 if (!is_error(ret)
7550 && arg1
7551 && put_user_sal(host_time, arg1))
7552 return -TARGET_EFAULT;
7554 return ret;
7555 #endif
7556 #ifdef TARGET_NR_mknod
7557 case TARGET_NR_mknod:
7558 if (!(p = lock_user_string(arg1)))
7559 return -TARGET_EFAULT;
7560 ret = get_errno(mknod(p, arg2, arg3));
7561 unlock_user(p, arg1, 0);
7562 return ret;
7563 #endif
7564 #if defined(TARGET_NR_mknodat)
7565 case TARGET_NR_mknodat:
7566 if (!(p = lock_user_string(arg2)))
7567 return -TARGET_EFAULT;
7568 ret = get_errno(mknodat(arg1, p, arg3, arg4));
7569 unlock_user(p, arg2, 0);
7570 return ret;
7571 #endif
7572 #ifdef TARGET_NR_chmod
7573 case TARGET_NR_chmod:
7574 if (!(p = lock_user_string(arg1)))
7575 return -TARGET_EFAULT;
7576 ret = get_errno(chmod(p, arg2));
7577 unlock_user(p, arg1, 0);
7578 return ret;
7579 #endif
7580 #ifdef TARGET_NR_lseek
7581 case TARGET_NR_lseek:
7582 return get_errno(lseek(arg1, arg2, arg3));
7583 #endif
7584 #if defined(TARGET_NR_getxpid) && defined(TARGET_ALPHA)
7585 /* Alpha specific */
7586 case TARGET_NR_getxpid:
7587 ((CPUAlphaState *)cpu_env)->ir[IR_A4] = getppid();
7588 return get_errno(getpid());
7589 #endif
7590 #ifdef TARGET_NR_getpid
7591 case TARGET_NR_getpid:
7592 return get_errno(getpid());
7593 #endif
7594 case TARGET_NR_mount:
7596 /* need to look at the data field */
7597 void *p2, *p3;
7599 if (arg1) {
7600 p = lock_user_string(arg1);
7601 if (!p) {
7602 return -TARGET_EFAULT;
7604 } else {
7605 p = NULL;
7608 p2 = lock_user_string(arg2);
7609 if (!p2) {
7610 if (arg1) {
7611 unlock_user(p, arg1, 0);
7613 return -TARGET_EFAULT;
7616 if (arg3) {
7617 p3 = lock_user_string(arg3);
7618 if (!p3) {
7619 if (arg1) {
7620 unlock_user(p, arg1, 0);
7622 unlock_user(p2, arg2, 0);
7623 return -TARGET_EFAULT;
7625 } else {
7626 p3 = NULL;
7629 /* FIXME - arg5 should be locked, but it isn't clear how to
7630 * do that since it's not guaranteed to be a NULL-terminated
7631 * string.
7633 if (!arg5) {
7634 ret = mount(p, p2, p3, (unsigned long)arg4, NULL);
7635 } else {
7636 ret = mount(p, p2, p3, (unsigned long)arg4, g2h(arg5));
7638 ret = get_errno(ret);
7640 if (arg1) {
7641 unlock_user(p, arg1, 0);
7643 unlock_user(p2, arg2, 0);
7644 if (arg3) {
7645 unlock_user(p3, arg3, 0);
7648 return ret;
7649 #ifdef TARGET_NR_umount
7650 case TARGET_NR_umount:
7651 if (!(p = lock_user_string(arg1)))
7652 return -TARGET_EFAULT;
7653 ret = get_errno(umount(p));
7654 unlock_user(p, arg1, 0);
7655 return ret;
7656 #endif
7657 #ifdef TARGET_NR_stime /* not on alpha */
7658 case TARGET_NR_stime:
7660 time_t host_time;
7661 if (get_user_sal(host_time, arg1))
7662 return -TARGET_EFAULT;
7663 return get_errno(stime(&host_time));
7665 #endif
7666 #ifdef TARGET_NR_alarm /* not on alpha */
7667 case TARGET_NR_alarm:
7668 return alarm(arg1);
7669 #endif
7670 #ifdef TARGET_NR_pause /* not on alpha */
7671 case TARGET_NR_pause:
7672 if (!block_signals()) {
7673 sigsuspend(&((TaskState *)cpu->opaque)->signal_mask);
7675 return -TARGET_EINTR;
7676 #endif
7677 #ifdef TARGET_NR_utime
7678 case TARGET_NR_utime:
7680 struct utimbuf tbuf, *host_tbuf;
7681 struct target_utimbuf *target_tbuf;
7682 if (arg2) {
7683 if (!lock_user_struct(VERIFY_READ, target_tbuf, arg2, 1))
7684 return -TARGET_EFAULT;
7685 tbuf.actime = tswapal(target_tbuf->actime);
7686 tbuf.modtime = tswapal(target_tbuf->modtime);
7687 unlock_user_struct(target_tbuf, arg2, 0);
7688 host_tbuf = &tbuf;
7689 } else {
7690 host_tbuf = NULL;
7692 if (!(p = lock_user_string(arg1)))
7693 return -TARGET_EFAULT;
7694 ret = get_errno(utime(p, host_tbuf));
7695 unlock_user(p, arg1, 0);
7697 return ret;
7698 #endif
7699 #ifdef TARGET_NR_utimes
7700 case TARGET_NR_utimes:
7702 struct timeval *tvp, tv[2];
7703 if (arg2) {
7704 if (copy_from_user_timeval(&tv[0], arg2)
7705 || copy_from_user_timeval(&tv[1],
7706 arg2 + sizeof(struct target_timeval)))
7707 return -TARGET_EFAULT;
7708 tvp = tv;
7709 } else {
7710 tvp = NULL;
7712 if (!(p = lock_user_string(arg1)))
7713 return -TARGET_EFAULT;
7714 ret = get_errno(utimes(p, tvp));
7715 unlock_user(p, arg1, 0);
7717 return ret;
7718 #endif
7719 #if defined(TARGET_NR_futimesat)
7720 case TARGET_NR_futimesat:
7722 struct timeval *tvp, tv[2];
7723 if (arg3) {
7724 if (copy_from_user_timeval(&tv[0], arg3)
7725 || copy_from_user_timeval(&tv[1],
7726 arg3 + sizeof(struct target_timeval)))
7727 return -TARGET_EFAULT;
7728 tvp = tv;
7729 } else {
7730 tvp = NULL;
7732 if (!(p = lock_user_string(arg2))) {
7733 return -TARGET_EFAULT;
7735 ret = get_errno(futimesat(arg1, path(p), tvp));
7736 unlock_user(p, arg2, 0);
7738 return ret;
7739 #endif
7740 #ifdef TARGET_NR_access
7741 case TARGET_NR_access:
7742 if (!(p = lock_user_string(arg1))) {
7743 return -TARGET_EFAULT;
7745 ret = get_errno(access(path(p), arg2));
7746 unlock_user(p, arg1, 0);
7747 return ret;
7748 #endif
7749 #if defined(TARGET_NR_faccessat) && defined(__NR_faccessat)
7750 case TARGET_NR_faccessat:
7751 if (!(p = lock_user_string(arg2))) {
7752 return -TARGET_EFAULT;
7754 ret = get_errno(faccessat(arg1, p, arg3, 0));
7755 unlock_user(p, arg2, 0);
7756 return ret;
7757 #endif
7758 #ifdef TARGET_NR_nice /* not on alpha */
7759 case TARGET_NR_nice:
7760 return get_errno(nice(arg1));
7761 #endif
7762 case TARGET_NR_sync:
7763 sync();
7764 return 0;
7765 #if defined(TARGET_NR_syncfs) && defined(CONFIG_SYNCFS)
7766 case TARGET_NR_syncfs:
7767 return get_errno(syncfs(arg1));
7768 #endif
7769 case TARGET_NR_kill:
7770 return get_errno(safe_kill(arg1, target_to_host_signal(arg2)));
7771 #ifdef TARGET_NR_rename
7772 case TARGET_NR_rename:
7774 void *p2;
7775 p = lock_user_string(arg1);
7776 p2 = lock_user_string(arg2);
7777 if (!p || !p2)
7778 ret = -TARGET_EFAULT;
7779 else
7780 ret = get_errno(rename(p, p2));
7781 unlock_user(p2, arg2, 0);
7782 unlock_user(p, arg1, 0);
7784 return ret;
7785 #endif
7786 #if defined(TARGET_NR_renameat)
7787 case TARGET_NR_renameat:
7789 void *p2;
7790 p = lock_user_string(arg2);
7791 p2 = lock_user_string(arg4);
7792 if (!p || !p2)
7793 ret = -TARGET_EFAULT;
7794 else
7795 ret = get_errno(renameat(arg1, p, arg3, p2));
7796 unlock_user(p2, arg4, 0);
7797 unlock_user(p, arg2, 0);
7799 return ret;
7800 #endif
7801 #if defined(TARGET_NR_renameat2)
7802 case TARGET_NR_renameat2:
7804 void *p2;
7805 p = lock_user_string(arg2);
7806 p2 = lock_user_string(arg4);
7807 if (!p || !p2) {
7808 ret = -TARGET_EFAULT;
7809 } else {
7810 ret = get_errno(sys_renameat2(arg1, p, arg3, p2, arg5));
7812 unlock_user(p2, arg4, 0);
7813 unlock_user(p, arg2, 0);
7815 return ret;
7816 #endif
7817 #ifdef TARGET_NR_mkdir
7818 case TARGET_NR_mkdir:
7819 if (!(p = lock_user_string(arg1)))
7820 return -TARGET_EFAULT;
7821 ret = get_errno(mkdir(p, arg2));
7822 unlock_user(p, arg1, 0);
7823 return ret;
7824 #endif
7825 #if defined(TARGET_NR_mkdirat)
7826 case TARGET_NR_mkdirat:
7827 if (!(p = lock_user_string(arg2)))
7828 return -TARGET_EFAULT;
7829 ret = get_errno(mkdirat(arg1, p, arg3));
7830 unlock_user(p, arg2, 0);
7831 return ret;
7832 #endif
7833 #ifdef TARGET_NR_rmdir
7834 case TARGET_NR_rmdir:
7835 if (!(p = lock_user_string(arg1)))
7836 return -TARGET_EFAULT;
7837 ret = get_errno(rmdir(p));
7838 unlock_user(p, arg1, 0);
7839 return ret;
7840 #endif
7841 case TARGET_NR_dup:
7842 ret = get_errno(dup(arg1));
7843 if (ret >= 0) {
7844 fd_trans_dup(arg1, ret);
7846 return ret;
7847 #ifdef TARGET_NR_pipe
7848 case TARGET_NR_pipe:
7849 return do_pipe(cpu_env, arg1, 0, 0);
7850 #endif
7851 #ifdef TARGET_NR_pipe2
7852 case TARGET_NR_pipe2:
7853 return do_pipe(cpu_env, arg1,
7854 target_to_host_bitmask(arg2, fcntl_flags_tbl), 1);
7855 #endif
7856 case TARGET_NR_times:
7858 struct target_tms *tmsp;
7859 struct tms tms;
7860 ret = get_errno(times(&tms));
7861 if (arg1) {
7862 tmsp = lock_user(VERIFY_WRITE, arg1, sizeof(struct target_tms), 0);
7863 if (!tmsp)
7864 return -TARGET_EFAULT;
7865 tmsp->tms_utime = tswapal(host_to_target_clock_t(tms.tms_utime));
7866 tmsp->tms_stime = tswapal(host_to_target_clock_t(tms.tms_stime));
7867 tmsp->tms_cutime = tswapal(host_to_target_clock_t(tms.tms_cutime));
7868 tmsp->tms_cstime = tswapal(host_to_target_clock_t(tms.tms_cstime));
7870 if (!is_error(ret))
7871 ret = host_to_target_clock_t(ret);
7873 return ret;
7874 case TARGET_NR_acct:
7875 if (arg1 == 0) {
7876 ret = get_errno(acct(NULL));
7877 } else {
7878 if (!(p = lock_user_string(arg1))) {
7879 return -TARGET_EFAULT;
7881 ret = get_errno(acct(path(p)));
7882 unlock_user(p, arg1, 0);
7884 return ret;
7885 #ifdef TARGET_NR_umount2
7886 case TARGET_NR_umount2:
7887 if (!(p = lock_user_string(arg1)))
7888 return -TARGET_EFAULT;
7889 ret = get_errno(umount2(p, arg2));
7890 unlock_user(p, arg1, 0);
7891 return ret;
7892 #endif
7893 case TARGET_NR_ioctl:
7894 return do_ioctl(arg1, arg2, arg3);
7895 #ifdef TARGET_NR_fcntl
7896 case TARGET_NR_fcntl:
7897 return do_fcntl(arg1, arg2, arg3);
7898 #endif
7899 case TARGET_NR_setpgid:
7900 return get_errno(setpgid(arg1, arg2));
7901 case TARGET_NR_umask:
7902 return get_errno(umask(arg1));
7903 case TARGET_NR_chroot:
7904 if (!(p = lock_user_string(arg1)))
7905 return -TARGET_EFAULT;
7906 ret = get_errno(chroot(p));
7907 unlock_user(p, arg1, 0);
7908 return ret;
7909 #ifdef TARGET_NR_dup2
7910 case TARGET_NR_dup2:
7911 ret = get_errno(dup2(arg1, arg2));
7912 if (ret >= 0) {
7913 fd_trans_dup(arg1, arg2);
7915 return ret;
7916 #endif
7917 #if defined(CONFIG_DUP3) && defined(TARGET_NR_dup3)
7918 case TARGET_NR_dup3:
7920 int host_flags;
7922 if ((arg3 & ~TARGET_O_CLOEXEC) != 0) {
7923 return -EINVAL;
7925 host_flags = target_to_host_bitmask(arg3, fcntl_flags_tbl);
7926 ret = get_errno(dup3(arg1, arg2, host_flags));
7927 if (ret >= 0) {
7928 fd_trans_dup(arg1, arg2);
7930 return ret;
7932 #endif
7933 #ifdef TARGET_NR_getppid /* not on alpha */
7934 case TARGET_NR_getppid:
7935 return get_errno(getppid());
7936 #endif
7937 #ifdef TARGET_NR_getpgrp
7938 case TARGET_NR_getpgrp:
7939 return get_errno(getpgrp());
7940 #endif
7941 case TARGET_NR_setsid:
7942 return get_errno(setsid());
7943 #ifdef TARGET_NR_sigaction
7944 case TARGET_NR_sigaction:
7946 #if defined(TARGET_ALPHA)
7947 struct target_sigaction act, oact, *pact = 0;
7948 struct target_old_sigaction *old_act;
7949 if (arg2) {
7950 if (!lock_user_struct(VERIFY_READ, old_act, arg2, 1))
7951 return -TARGET_EFAULT;
7952 act._sa_handler = old_act->_sa_handler;
7953 target_siginitset(&act.sa_mask, old_act->sa_mask);
7954 act.sa_flags = old_act->sa_flags;
7955 act.sa_restorer = 0;
7956 unlock_user_struct(old_act, arg2, 0);
7957 pact = &act;
7959 ret = get_errno(do_sigaction(arg1, pact, &oact));
7960 if (!is_error(ret) && arg3) {
7961 if (!lock_user_struct(VERIFY_WRITE, old_act, arg3, 0))
7962 return -TARGET_EFAULT;
7963 old_act->_sa_handler = oact._sa_handler;
7964 old_act->sa_mask = oact.sa_mask.sig[0];
7965 old_act->sa_flags = oact.sa_flags;
7966 unlock_user_struct(old_act, arg3, 1);
7968 #elif defined(TARGET_MIPS)
7969 struct target_sigaction act, oact, *pact, *old_act;
7971 if (arg2) {
7972 if (!lock_user_struct(VERIFY_READ, old_act, arg2, 1))
7973 return -TARGET_EFAULT;
7974 act._sa_handler = old_act->_sa_handler;
7975 target_siginitset(&act.sa_mask, old_act->sa_mask.sig[0]);
7976 act.sa_flags = old_act->sa_flags;
7977 unlock_user_struct(old_act, arg2, 0);
7978 pact = &act;
7979 } else {
7980 pact = NULL;
7983 ret = get_errno(do_sigaction(arg1, pact, &oact));
7985 if (!is_error(ret) && arg3) {
7986 if (!lock_user_struct(VERIFY_WRITE, old_act, arg3, 0))
7987 return -TARGET_EFAULT;
7988 old_act->_sa_handler = oact._sa_handler;
7989 old_act->sa_flags = oact.sa_flags;
7990 old_act->sa_mask.sig[0] = oact.sa_mask.sig[0];
7991 old_act->sa_mask.sig[1] = 0;
7992 old_act->sa_mask.sig[2] = 0;
7993 old_act->sa_mask.sig[3] = 0;
7994 unlock_user_struct(old_act, arg3, 1);
7996 #else
7997 struct target_old_sigaction *old_act;
7998 struct target_sigaction act, oact, *pact;
7999 if (arg2) {
8000 if (!lock_user_struct(VERIFY_READ, old_act, arg2, 1))
8001 return -TARGET_EFAULT;
8002 act._sa_handler = old_act->_sa_handler;
8003 target_siginitset(&act.sa_mask, old_act->sa_mask);
8004 act.sa_flags = old_act->sa_flags;
8005 act.sa_restorer = old_act->sa_restorer;
8006 #ifdef TARGET_ARCH_HAS_KA_RESTORER
8007 act.ka_restorer = 0;
8008 #endif
8009 unlock_user_struct(old_act, arg2, 0);
8010 pact = &act;
8011 } else {
8012 pact = NULL;
8014 ret = get_errno(do_sigaction(arg1, pact, &oact));
8015 if (!is_error(ret) && arg3) {
8016 if (!lock_user_struct(VERIFY_WRITE, old_act, arg3, 0))
8017 return -TARGET_EFAULT;
8018 old_act->_sa_handler = oact._sa_handler;
8019 old_act->sa_mask = oact.sa_mask.sig[0];
8020 old_act->sa_flags = oact.sa_flags;
8021 old_act->sa_restorer = oact.sa_restorer;
8022 unlock_user_struct(old_act, arg3, 1);
8024 #endif
8026 return ret;
8027 #endif
8028 case TARGET_NR_rt_sigaction:
8030 #if defined(TARGET_ALPHA)
8031 /* For Alpha and SPARC this is a 5 argument syscall, with
8032 * a 'restorer' parameter which must be copied into the
8033 * sa_restorer field of the sigaction struct.
8034 * For Alpha that 'restorer' is arg5; for SPARC it is arg4,
8035 * and arg5 is the sigsetsize.
8036 * Alpha also has a separate rt_sigaction struct that it uses
8037 * here; SPARC uses the usual sigaction struct.
8039 struct target_rt_sigaction *rt_act;
8040 struct target_sigaction act, oact, *pact = 0;
8042 if (arg4 != sizeof(target_sigset_t)) {
8043 return -TARGET_EINVAL;
8045 if (arg2) {
8046 if (!lock_user_struct(VERIFY_READ, rt_act, arg2, 1))
8047 return -TARGET_EFAULT;
8048 act._sa_handler = rt_act->_sa_handler;
8049 act.sa_mask = rt_act->sa_mask;
8050 act.sa_flags = rt_act->sa_flags;
8051 act.sa_restorer = arg5;
8052 unlock_user_struct(rt_act, arg2, 0);
8053 pact = &act;
8055 ret = get_errno(do_sigaction(arg1, pact, &oact));
8056 if (!is_error(ret) && arg3) {
8057 if (!lock_user_struct(VERIFY_WRITE, rt_act, arg3, 0))
8058 return -TARGET_EFAULT;
8059 rt_act->_sa_handler = oact._sa_handler;
8060 rt_act->sa_mask = oact.sa_mask;
8061 rt_act->sa_flags = oact.sa_flags;
8062 unlock_user_struct(rt_act, arg3, 1);
8064 #else
8065 #ifdef TARGET_SPARC
8066 target_ulong restorer = arg4;
8067 target_ulong sigsetsize = arg5;
8068 #else
8069 target_ulong sigsetsize = arg4;
8070 #endif
8071 struct target_sigaction *act;
8072 struct target_sigaction *oact;
8074 if (sigsetsize != sizeof(target_sigset_t)) {
8075 return -TARGET_EINVAL;
8077 if (arg2) {
8078 if (!lock_user_struct(VERIFY_READ, act, arg2, 1)) {
8079 return -TARGET_EFAULT;
8081 #ifdef TARGET_ARCH_HAS_KA_RESTORER
8082 act->ka_restorer = restorer;
8083 #endif
8084 } else {
8085 act = NULL;
8087 if (arg3) {
8088 if (!lock_user_struct(VERIFY_WRITE, oact, arg3, 0)) {
8089 ret = -TARGET_EFAULT;
8090 goto rt_sigaction_fail;
8092 } else
8093 oact = NULL;
8094 ret = get_errno(do_sigaction(arg1, act, oact));
8095 rt_sigaction_fail:
8096 if (act)
8097 unlock_user_struct(act, arg2, 0);
8098 if (oact)
8099 unlock_user_struct(oact, arg3, 1);
8100 #endif
8102 return ret;
8103 #ifdef TARGET_NR_sgetmask /* not on alpha */
8104 case TARGET_NR_sgetmask:
8106 sigset_t cur_set;
8107 abi_ulong target_set;
8108 ret = do_sigprocmask(0, NULL, &cur_set);
8109 if (!ret) {
8110 host_to_target_old_sigset(&target_set, &cur_set);
8111 ret = target_set;
8114 return ret;
8115 #endif
8116 #ifdef TARGET_NR_ssetmask /* not on alpha */
8117 case TARGET_NR_ssetmask:
8119 sigset_t set, oset;
8120 abi_ulong target_set = arg1;
8121 target_to_host_old_sigset(&set, &target_set);
8122 ret = do_sigprocmask(SIG_SETMASK, &set, &oset);
8123 if (!ret) {
8124 host_to_target_old_sigset(&target_set, &oset);
8125 ret = target_set;
8128 return ret;
8129 #endif
8130 #ifdef TARGET_NR_sigprocmask
8131 case TARGET_NR_sigprocmask:
8133 #if defined(TARGET_ALPHA)
8134 sigset_t set, oldset;
8135 abi_ulong mask;
8136 int how;
8138 switch (arg1) {
8139 case TARGET_SIG_BLOCK:
8140 how = SIG_BLOCK;
8141 break;
8142 case TARGET_SIG_UNBLOCK:
8143 how = SIG_UNBLOCK;
8144 break;
8145 case TARGET_SIG_SETMASK:
8146 how = SIG_SETMASK;
8147 break;
8148 default:
8149 return -TARGET_EINVAL;
8151 mask = arg2;
8152 target_to_host_old_sigset(&set, &mask);
8154 ret = do_sigprocmask(how, &set, &oldset);
8155 if (!is_error(ret)) {
8156 host_to_target_old_sigset(&mask, &oldset);
8157 ret = mask;
8158 ((CPUAlphaState *)cpu_env)->ir[IR_V0] = 0; /* force no error */
8160 #else
8161 sigset_t set, oldset, *set_ptr;
8162 int how;
8164 if (arg2) {
8165 switch (arg1) {
8166 case TARGET_SIG_BLOCK:
8167 how = SIG_BLOCK;
8168 break;
8169 case TARGET_SIG_UNBLOCK:
8170 how = SIG_UNBLOCK;
8171 break;
8172 case TARGET_SIG_SETMASK:
8173 how = SIG_SETMASK;
8174 break;
8175 default:
8176 return -TARGET_EINVAL;
8178 if (!(p = lock_user(VERIFY_READ, arg2, sizeof(target_sigset_t), 1)))
8179 return -TARGET_EFAULT;
8180 target_to_host_old_sigset(&set, p);
8181 unlock_user(p, arg2, 0);
8182 set_ptr = &set;
8183 } else {
8184 how = 0;
8185 set_ptr = NULL;
8187 ret = do_sigprocmask(how, set_ptr, &oldset);
8188 if (!is_error(ret) && arg3) {
8189 if (!(p = lock_user(VERIFY_WRITE, arg3, sizeof(target_sigset_t), 0)))
8190 return -TARGET_EFAULT;
8191 host_to_target_old_sigset(p, &oldset);
8192 unlock_user(p, arg3, sizeof(target_sigset_t));
8194 #endif
8196 return ret;
8197 #endif
8198 case TARGET_NR_rt_sigprocmask:
8200 int how = arg1;
8201 sigset_t set, oldset, *set_ptr;
8203 if (arg4 != sizeof(target_sigset_t)) {
8204 return -TARGET_EINVAL;
8207 if (arg2) {
8208 switch(how) {
8209 case TARGET_SIG_BLOCK:
8210 how = SIG_BLOCK;
8211 break;
8212 case TARGET_SIG_UNBLOCK:
8213 how = SIG_UNBLOCK;
8214 break;
8215 case TARGET_SIG_SETMASK:
8216 how = SIG_SETMASK;
8217 break;
8218 default:
8219 return -TARGET_EINVAL;
8221 if (!(p = lock_user(VERIFY_READ, arg2, sizeof(target_sigset_t), 1)))
8222 return -TARGET_EFAULT;
8223 target_to_host_sigset(&set, p);
8224 unlock_user(p, arg2, 0);
8225 set_ptr = &set;
8226 } else {
8227 how = 0;
8228 set_ptr = NULL;
8230 ret = do_sigprocmask(how, set_ptr, &oldset);
8231 if (!is_error(ret) && arg3) {
8232 if (!(p = lock_user(VERIFY_WRITE, arg3, sizeof(target_sigset_t), 0)))
8233 return -TARGET_EFAULT;
8234 host_to_target_sigset(p, &oldset);
8235 unlock_user(p, arg3, sizeof(target_sigset_t));
8238 return ret;
8239 #ifdef TARGET_NR_sigpending
8240 case TARGET_NR_sigpending:
8242 sigset_t set;
8243 ret = get_errno(sigpending(&set));
8244 if (!is_error(ret)) {
8245 if (!(p = lock_user(VERIFY_WRITE, arg1, sizeof(target_sigset_t), 0)))
8246 return -TARGET_EFAULT;
8247 host_to_target_old_sigset(p, &set);
8248 unlock_user(p, arg1, sizeof(target_sigset_t));
8251 return ret;
8252 #endif
8253 case TARGET_NR_rt_sigpending:
8255 sigset_t set;
8257 /* Yes, this check is >, not != like most. We follow the kernel's
8258 * logic and it does it like this because it implements
8259 * NR_sigpending through the same code path, and in that case
8260 * the old_sigset_t is smaller in size.
8262 if (arg2 > sizeof(target_sigset_t)) {
8263 return -TARGET_EINVAL;
8266 ret = get_errno(sigpending(&set));
8267 if (!is_error(ret)) {
8268 if (!(p = lock_user(VERIFY_WRITE, arg1, sizeof(target_sigset_t), 0)))
8269 return -TARGET_EFAULT;
8270 host_to_target_sigset(p, &set);
8271 unlock_user(p, arg1, sizeof(target_sigset_t));
8274 return ret;
8275 #ifdef TARGET_NR_sigsuspend
8276 case TARGET_NR_sigsuspend:
8278 TaskState *ts = cpu->opaque;
8279 #if defined(TARGET_ALPHA)
8280 abi_ulong mask = arg1;
8281 target_to_host_old_sigset(&ts->sigsuspend_mask, &mask);
8282 #else
8283 if (!(p = lock_user(VERIFY_READ, arg1, sizeof(target_sigset_t), 1)))
8284 return -TARGET_EFAULT;
8285 target_to_host_old_sigset(&ts->sigsuspend_mask, p);
8286 unlock_user(p, arg1, 0);
8287 #endif
8288 ret = get_errno(safe_rt_sigsuspend(&ts->sigsuspend_mask,
8289 SIGSET_T_SIZE));
8290 if (ret != -TARGET_ERESTARTSYS) {
8291 ts->in_sigsuspend = 1;
8294 return ret;
8295 #endif
8296 case TARGET_NR_rt_sigsuspend:
8298 TaskState *ts = cpu->opaque;
8300 if (arg2 != sizeof(target_sigset_t)) {
8301 return -TARGET_EINVAL;
8303 if (!(p = lock_user(VERIFY_READ, arg1, sizeof(target_sigset_t), 1)))
8304 return -TARGET_EFAULT;
8305 target_to_host_sigset(&ts->sigsuspend_mask, p);
8306 unlock_user(p, arg1, 0);
8307 ret = get_errno(safe_rt_sigsuspend(&ts->sigsuspend_mask,
8308 SIGSET_T_SIZE));
8309 if (ret != -TARGET_ERESTARTSYS) {
8310 ts->in_sigsuspend = 1;
8313 return ret;
8314 case TARGET_NR_rt_sigtimedwait:
8316 sigset_t set;
8317 struct timespec uts, *puts;
8318 siginfo_t uinfo;
8320 if (arg4 != sizeof(target_sigset_t)) {
8321 return -TARGET_EINVAL;
8324 if (!(p = lock_user(VERIFY_READ, arg1, sizeof(target_sigset_t), 1)))
8325 return -TARGET_EFAULT;
8326 target_to_host_sigset(&set, p);
8327 unlock_user(p, arg1, 0);
8328 if (arg3) {
8329 puts = &uts;
8330 target_to_host_timespec(puts, arg3);
8331 } else {
8332 puts = NULL;
8334 ret = get_errno(safe_rt_sigtimedwait(&set, &uinfo, puts,
8335 SIGSET_T_SIZE));
8336 if (!is_error(ret)) {
8337 if (arg2) {
8338 p = lock_user(VERIFY_WRITE, arg2, sizeof(target_siginfo_t),
8340 if (!p) {
8341 return -TARGET_EFAULT;
8343 host_to_target_siginfo(p, &uinfo);
8344 unlock_user(p, arg2, sizeof(target_siginfo_t));
8346 ret = host_to_target_signal(ret);
8349 return ret;
8350 case TARGET_NR_rt_sigqueueinfo:
8352 siginfo_t uinfo;
8354 p = lock_user(VERIFY_READ, arg3, sizeof(target_siginfo_t), 1);
8355 if (!p) {
8356 return -TARGET_EFAULT;
8358 target_to_host_siginfo(&uinfo, p);
8359 unlock_user(p, arg3, 0);
8360 ret = get_errno(sys_rt_sigqueueinfo(arg1, arg2, &uinfo));
8362 return ret;
8363 case TARGET_NR_rt_tgsigqueueinfo:
8365 siginfo_t uinfo;
8367 p = lock_user(VERIFY_READ, arg4, sizeof(target_siginfo_t), 1);
8368 if (!p) {
8369 return -TARGET_EFAULT;
8371 target_to_host_siginfo(&uinfo, p);
8372 unlock_user(p, arg4, 0);
8373 ret = get_errno(sys_rt_tgsigqueueinfo(arg1, arg2, arg3, &uinfo));
8375 return ret;
8376 #ifdef TARGET_NR_sigreturn
8377 case TARGET_NR_sigreturn:
8378 if (block_signals()) {
8379 return -TARGET_ERESTARTSYS;
8381 return do_sigreturn(cpu_env);
8382 #endif
8383 case TARGET_NR_rt_sigreturn:
8384 if (block_signals()) {
8385 return -TARGET_ERESTARTSYS;
8387 return do_rt_sigreturn(cpu_env);
8388 case TARGET_NR_sethostname:
8389 if (!(p = lock_user_string(arg1)))
8390 return -TARGET_EFAULT;
8391 ret = get_errno(sethostname(p, arg2));
8392 unlock_user(p, arg1, 0);
8393 return ret;
8394 #ifdef TARGET_NR_setrlimit
8395 case TARGET_NR_setrlimit:
8397 int resource = target_to_host_resource(arg1);
8398 struct target_rlimit *target_rlim;
8399 struct rlimit rlim;
8400 if (!lock_user_struct(VERIFY_READ, target_rlim, arg2, 1))
8401 return -TARGET_EFAULT;
8402 rlim.rlim_cur = target_to_host_rlim(target_rlim->rlim_cur);
8403 rlim.rlim_max = target_to_host_rlim(target_rlim->rlim_max);
8404 unlock_user_struct(target_rlim, arg2, 0);
8406 * If we just passed through resource limit settings for memory then
8407 * they would also apply to QEMU's own allocations, and QEMU will
8408 * crash or hang or die if its allocations fail. Ideally we would
8409 * track the guest allocations in QEMU and apply the limits ourselves.
8410 * For now, just tell the guest the call succeeded but don't actually
8411 * limit anything.
8413 if (resource != RLIMIT_AS &&
8414 resource != RLIMIT_DATA &&
8415 resource != RLIMIT_STACK) {
8416 return get_errno(setrlimit(resource, &rlim));
8417 } else {
8418 return 0;
8421 #endif
8422 #ifdef TARGET_NR_getrlimit
8423 case TARGET_NR_getrlimit:
8425 int resource = target_to_host_resource(arg1);
8426 struct target_rlimit *target_rlim;
8427 struct rlimit rlim;
8429 ret = get_errno(getrlimit(resource, &rlim));
8430 if (!is_error(ret)) {
8431 if (!lock_user_struct(VERIFY_WRITE, target_rlim, arg2, 0))
8432 return -TARGET_EFAULT;
8433 target_rlim->rlim_cur = host_to_target_rlim(rlim.rlim_cur);
8434 target_rlim->rlim_max = host_to_target_rlim(rlim.rlim_max);
8435 unlock_user_struct(target_rlim, arg2, 1);
8438 return ret;
8439 #endif
8440 case TARGET_NR_getrusage:
8442 struct rusage rusage;
8443 ret = get_errno(getrusage(arg1, &rusage));
8444 if (!is_error(ret)) {
8445 ret = host_to_target_rusage(arg2, &rusage);
8448 return ret;
8449 case TARGET_NR_gettimeofday:
8451 struct timeval tv;
8452 ret = get_errno(gettimeofday(&tv, NULL));
8453 if (!is_error(ret)) {
8454 if (copy_to_user_timeval(arg1, &tv))
8455 return -TARGET_EFAULT;
8458 return ret;
8459 case TARGET_NR_settimeofday:
8461 struct timeval tv, *ptv = NULL;
8462 struct timezone tz, *ptz = NULL;
8464 if (arg1) {
8465 if (copy_from_user_timeval(&tv, arg1)) {
8466 return -TARGET_EFAULT;
8468 ptv = &tv;
8471 if (arg2) {
8472 if (copy_from_user_timezone(&tz, arg2)) {
8473 return -TARGET_EFAULT;
8475 ptz = &tz;
8478 return get_errno(settimeofday(ptv, ptz));
8480 #if defined(TARGET_NR_select)
8481 case TARGET_NR_select:
8482 #if defined(TARGET_WANT_NI_OLD_SELECT)
8483 /* some architectures used to have old_select here
8484 * but now ENOSYS it.
8486 ret = -TARGET_ENOSYS;
8487 #elif defined(TARGET_WANT_OLD_SYS_SELECT)
8488 ret = do_old_select(arg1);
8489 #else
8490 ret = do_select(arg1, arg2, arg3, arg4, arg5);
8491 #endif
8492 return ret;
8493 #endif
8494 #ifdef TARGET_NR_pselect6
8495 case TARGET_NR_pselect6:
8497 abi_long rfd_addr, wfd_addr, efd_addr, n, ts_addr;
8498 fd_set rfds, wfds, efds;
8499 fd_set *rfds_ptr, *wfds_ptr, *efds_ptr;
8500 struct timespec ts, *ts_ptr;
8503 * The 6th arg is actually two args smashed together,
8504 * so we cannot use the C library.
8506 sigset_t set;
8507 struct {
8508 sigset_t *set;
8509 size_t size;
8510 } sig, *sig_ptr;
8512 abi_ulong arg_sigset, arg_sigsize, *arg7;
8513 target_sigset_t *target_sigset;
8515 n = arg1;
8516 rfd_addr = arg2;
8517 wfd_addr = arg3;
8518 efd_addr = arg4;
8519 ts_addr = arg5;
8521 ret = copy_from_user_fdset_ptr(&rfds, &rfds_ptr, rfd_addr, n);
8522 if (ret) {
8523 return ret;
8525 ret = copy_from_user_fdset_ptr(&wfds, &wfds_ptr, wfd_addr, n);
8526 if (ret) {
8527 return ret;
8529 ret = copy_from_user_fdset_ptr(&efds, &efds_ptr, efd_addr, n);
8530 if (ret) {
8531 return ret;
8535 * This takes a timespec, and not a timeval, so we cannot
8536 * use the do_select() helper ...
8538 if (ts_addr) {
8539 if (target_to_host_timespec(&ts, ts_addr)) {
8540 return -TARGET_EFAULT;
8542 ts_ptr = &ts;
8543 } else {
8544 ts_ptr = NULL;
8547 /* Extract the two packed args for the sigset */
8548 if (arg6) {
8549 sig_ptr = &sig;
8550 sig.size = SIGSET_T_SIZE;
8552 arg7 = lock_user(VERIFY_READ, arg6, sizeof(*arg7) * 2, 1);
8553 if (!arg7) {
8554 return -TARGET_EFAULT;
8556 arg_sigset = tswapal(arg7[0]);
8557 arg_sigsize = tswapal(arg7[1]);
8558 unlock_user(arg7, arg6, 0);
8560 if (arg_sigset) {
8561 sig.set = &set;
8562 if (arg_sigsize != sizeof(*target_sigset)) {
8563 /* Like the kernel, we enforce correct size sigsets */
8564 return -TARGET_EINVAL;
8566 target_sigset = lock_user(VERIFY_READ, arg_sigset,
8567 sizeof(*target_sigset), 1);
8568 if (!target_sigset) {
8569 return -TARGET_EFAULT;
8571 target_to_host_sigset(&set, target_sigset);
8572 unlock_user(target_sigset, arg_sigset, 0);
8573 } else {
8574 sig.set = NULL;
8576 } else {
8577 sig_ptr = NULL;
8580 ret = get_errno(safe_pselect6(n, rfds_ptr, wfds_ptr, efds_ptr,
8581 ts_ptr, sig_ptr));
8583 if (!is_error(ret)) {
8584 if (rfd_addr && copy_to_user_fdset(rfd_addr, &rfds, n))
8585 return -TARGET_EFAULT;
8586 if (wfd_addr && copy_to_user_fdset(wfd_addr, &wfds, n))
8587 return -TARGET_EFAULT;
8588 if (efd_addr && copy_to_user_fdset(efd_addr, &efds, n))
8589 return -TARGET_EFAULT;
8591 if (ts_addr && host_to_target_timespec(ts_addr, &ts))
8592 return -TARGET_EFAULT;
8595 return ret;
8596 #endif
8597 #ifdef TARGET_NR_symlink
8598 case TARGET_NR_symlink:
8600 void *p2;
8601 p = lock_user_string(arg1);
8602 p2 = lock_user_string(arg2);
8603 if (!p || !p2)
8604 ret = -TARGET_EFAULT;
8605 else
8606 ret = get_errno(symlink(p, p2));
8607 unlock_user(p2, arg2, 0);
8608 unlock_user(p, arg1, 0);
8610 return ret;
8611 #endif
8612 #if defined(TARGET_NR_symlinkat)
8613 case TARGET_NR_symlinkat:
8615 void *p2;
8616 p = lock_user_string(arg1);
8617 p2 = lock_user_string(arg3);
8618 if (!p || !p2)
8619 ret = -TARGET_EFAULT;
8620 else
8621 ret = get_errno(symlinkat(p, arg2, p2));
8622 unlock_user(p2, arg3, 0);
8623 unlock_user(p, arg1, 0);
8625 return ret;
8626 #endif
8627 #ifdef TARGET_NR_readlink
8628 case TARGET_NR_readlink:
8630 void *p2;
8631 p = lock_user_string(arg1);
8632 p2 = lock_user(VERIFY_WRITE, arg2, arg3, 0);
8633 if (!p || !p2) {
8634 ret = -TARGET_EFAULT;
8635 } else if (!arg3) {
8636 /* Short circuit this for the magic exe check. */
8637 ret = -TARGET_EINVAL;
8638 } else if (is_proc_myself((const char *)p, "exe")) {
8639 char real[PATH_MAX], *temp;
8640 temp = realpath(exec_path, real);
8641 /* Return value is # of bytes that we wrote to the buffer. */
8642 if (temp == NULL) {
8643 ret = get_errno(-1);
8644 } else {
8645 /* Don't worry about sign mismatch as earlier mapping
8646 * logic would have thrown a bad address error. */
8647 ret = MIN(strlen(real), arg3);
8648 /* We cannot NUL terminate the string. */
8649 memcpy(p2, real, ret);
8651 } else {
8652 ret = get_errno(readlink(path(p), p2, arg3));
8654 unlock_user(p2, arg2, ret);
8655 unlock_user(p, arg1, 0);
8657 return ret;
8658 #endif
8659 #if defined(TARGET_NR_readlinkat)
8660 case TARGET_NR_readlinkat:
8662 void *p2;
8663 p = lock_user_string(arg2);
8664 p2 = lock_user(VERIFY_WRITE, arg3, arg4, 0);
8665 if (!p || !p2) {
8666 ret = -TARGET_EFAULT;
8667 } else if (is_proc_myself((const char *)p, "exe")) {
8668 char real[PATH_MAX], *temp;
8669 temp = realpath(exec_path, real);
8670 ret = temp == NULL ? get_errno(-1) : strlen(real) ;
8671 snprintf((char *)p2, arg4, "%s", real);
8672 } else {
8673 ret = get_errno(readlinkat(arg1, path(p), p2, arg4));
8675 unlock_user(p2, arg3, ret);
8676 unlock_user(p, arg2, 0);
8678 return ret;
8679 #endif
8680 #ifdef TARGET_NR_swapon
8681 case TARGET_NR_swapon:
8682 if (!(p = lock_user_string(arg1)))
8683 return -TARGET_EFAULT;
8684 ret = get_errno(swapon(p, arg2));
8685 unlock_user(p, arg1, 0);
8686 return ret;
8687 #endif
8688 case TARGET_NR_reboot:
8689 if (arg3 == LINUX_REBOOT_CMD_RESTART2) {
8690 /* arg4 must be ignored in all other cases */
8691 p = lock_user_string(arg4);
8692 if (!p) {
8693 return -TARGET_EFAULT;
8695 ret = get_errno(reboot(arg1, arg2, arg3, p));
8696 unlock_user(p, arg4, 0);
8697 } else {
8698 ret = get_errno(reboot(arg1, arg2, arg3, NULL));
8700 return ret;
8701 #ifdef TARGET_NR_mmap
8702 case TARGET_NR_mmap:
8703 #if (defined(TARGET_I386) && defined(TARGET_ABI32)) || \
8704 (defined(TARGET_ARM) && defined(TARGET_ABI32)) || \
8705 defined(TARGET_M68K) || defined(TARGET_CRIS) || defined(TARGET_MICROBLAZE) \
8706 || defined(TARGET_S390X)
8708 abi_ulong *v;
8709 abi_ulong v1, v2, v3, v4, v5, v6;
8710 if (!(v = lock_user(VERIFY_READ, arg1, 6 * sizeof(abi_ulong), 1)))
8711 return -TARGET_EFAULT;
8712 v1 = tswapal(v[0]);
8713 v2 = tswapal(v[1]);
8714 v3 = tswapal(v[2]);
8715 v4 = tswapal(v[3]);
8716 v5 = tswapal(v[4]);
8717 v6 = tswapal(v[5]);
8718 unlock_user(v, arg1, 0);
8719 ret = get_errno(target_mmap(v1, v2, v3,
8720 target_to_host_bitmask(v4, mmap_flags_tbl),
8721 v5, v6));
8723 #else
8724 ret = get_errno(target_mmap(arg1, arg2, arg3,
8725 target_to_host_bitmask(arg4, mmap_flags_tbl),
8726 arg5,
8727 arg6));
8728 #endif
8729 return ret;
8730 #endif
8731 #ifdef TARGET_NR_mmap2
8732 case TARGET_NR_mmap2:
8733 #ifndef MMAP_SHIFT
8734 #define MMAP_SHIFT 12
8735 #endif
8736 ret = target_mmap(arg1, arg2, arg3,
8737 target_to_host_bitmask(arg4, mmap_flags_tbl),
8738 arg5, arg6 << MMAP_SHIFT);
8739 return get_errno(ret);
8740 #endif
8741 case TARGET_NR_munmap:
8742 return get_errno(target_munmap(arg1, arg2));
8743 case TARGET_NR_mprotect:
8745 TaskState *ts = cpu->opaque;
8746 /* Special hack to detect libc making the stack executable. */
8747 if ((arg3 & PROT_GROWSDOWN)
8748 && arg1 >= ts->info->stack_limit
8749 && arg1 <= ts->info->start_stack) {
8750 arg3 &= ~PROT_GROWSDOWN;
8751 arg2 = arg2 + arg1 - ts->info->stack_limit;
8752 arg1 = ts->info->stack_limit;
8755 return get_errno(target_mprotect(arg1, arg2, arg3));
8756 #ifdef TARGET_NR_mremap
8757 case TARGET_NR_mremap:
8758 return get_errno(target_mremap(arg1, arg2, arg3, arg4, arg5));
8759 #endif
8760 /* ??? msync/mlock/munlock are broken for softmmu. */
8761 #ifdef TARGET_NR_msync
8762 case TARGET_NR_msync:
8763 return get_errno(msync(g2h(arg1), arg2, arg3));
8764 #endif
8765 #ifdef TARGET_NR_mlock
8766 case TARGET_NR_mlock:
8767 return get_errno(mlock(g2h(arg1), arg2));
8768 #endif
8769 #ifdef TARGET_NR_munlock
8770 case TARGET_NR_munlock:
8771 return get_errno(munlock(g2h(arg1), arg2));
8772 #endif
8773 #ifdef TARGET_NR_mlockall
8774 case TARGET_NR_mlockall:
8775 return get_errno(mlockall(target_to_host_mlockall_arg(arg1)));
8776 #endif
8777 #ifdef TARGET_NR_munlockall
8778 case TARGET_NR_munlockall:
8779 return get_errno(munlockall());
8780 #endif
8781 #ifdef TARGET_NR_truncate
8782 case TARGET_NR_truncate:
8783 if (!(p = lock_user_string(arg1)))
8784 return -TARGET_EFAULT;
8785 ret = get_errno(truncate(p, arg2));
8786 unlock_user(p, arg1, 0);
8787 return ret;
8788 #endif
8789 #ifdef TARGET_NR_ftruncate
8790 case TARGET_NR_ftruncate:
8791 return get_errno(ftruncate(arg1, arg2));
8792 #endif
8793 case TARGET_NR_fchmod:
8794 return get_errno(fchmod(arg1, arg2));
8795 #if defined(TARGET_NR_fchmodat)
8796 case TARGET_NR_fchmodat:
8797 if (!(p = lock_user_string(arg2)))
8798 return -TARGET_EFAULT;
8799 ret = get_errno(fchmodat(arg1, p, arg3, 0));
8800 unlock_user(p, arg2, 0);
8801 return ret;
8802 #endif
8803 case TARGET_NR_getpriority:
8804 /* Note that negative values are valid for getpriority, so we must
8805 differentiate based on errno settings. */
8806 errno = 0;
8807 ret = getpriority(arg1, arg2);
8808 if (ret == -1 && errno != 0) {
8809 return -host_to_target_errno(errno);
8811 #ifdef TARGET_ALPHA
8812 /* Return value is the unbiased priority. Signal no error. */
8813 ((CPUAlphaState *)cpu_env)->ir[IR_V0] = 0;
8814 #else
8815 /* Return value is a biased priority to avoid negative numbers. */
8816 ret = 20 - ret;
8817 #endif
8818 return ret;
8819 case TARGET_NR_setpriority:
8820 return get_errno(setpriority(arg1, arg2, arg3));
8821 #ifdef TARGET_NR_statfs
8822 case TARGET_NR_statfs:
8823 if (!(p = lock_user_string(arg1))) {
8824 return -TARGET_EFAULT;
8826 ret = get_errno(statfs(path(p), &stfs));
8827 unlock_user(p, arg1, 0);
8828 convert_statfs:
8829 if (!is_error(ret)) {
8830 struct target_statfs *target_stfs;
8832 if (!lock_user_struct(VERIFY_WRITE, target_stfs, arg2, 0))
8833 return -TARGET_EFAULT;
8834 __put_user(stfs.f_type, &target_stfs->f_type);
8835 __put_user(stfs.f_bsize, &target_stfs->f_bsize);
8836 __put_user(stfs.f_blocks, &target_stfs->f_blocks);
8837 __put_user(stfs.f_bfree, &target_stfs->f_bfree);
8838 __put_user(stfs.f_bavail, &target_stfs->f_bavail);
8839 __put_user(stfs.f_files, &target_stfs->f_files);
8840 __put_user(stfs.f_ffree, &target_stfs->f_ffree);
8841 __put_user(stfs.f_fsid.__val[0], &target_stfs->f_fsid.val[0]);
8842 __put_user(stfs.f_fsid.__val[1], &target_stfs->f_fsid.val[1]);
8843 __put_user(stfs.f_namelen, &target_stfs->f_namelen);
8844 __put_user(stfs.f_frsize, &target_stfs->f_frsize);
8845 #ifdef _STATFS_F_FLAGS
8846 __put_user(stfs.f_flags, &target_stfs->f_flags);
8847 #else
8848 __put_user(0, &target_stfs->f_flags);
8849 #endif
8850 memset(target_stfs->f_spare, 0, sizeof(target_stfs->f_spare));
8851 unlock_user_struct(target_stfs, arg2, 1);
8853 return ret;
8854 #endif
8855 #ifdef TARGET_NR_fstatfs
8856 case TARGET_NR_fstatfs:
8857 ret = get_errno(fstatfs(arg1, &stfs));
8858 goto convert_statfs;
8859 #endif
8860 #ifdef TARGET_NR_statfs64
8861 case TARGET_NR_statfs64:
8862 if (!(p = lock_user_string(arg1))) {
8863 return -TARGET_EFAULT;
8865 ret = get_errno(statfs(path(p), &stfs));
8866 unlock_user(p, arg1, 0);
8867 convert_statfs64:
8868 if (!is_error(ret)) {
8869 struct target_statfs64 *target_stfs;
8871 if (!lock_user_struct(VERIFY_WRITE, target_stfs, arg3, 0))
8872 return -TARGET_EFAULT;
8873 __put_user(stfs.f_type, &target_stfs->f_type);
8874 __put_user(stfs.f_bsize, &target_stfs->f_bsize);
8875 __put_user(stfs.f_blocks, &target_stfs->f_blocks);
8876 __put_user(stfs.f_bfree, &target_stfs->f_bfree);
8877 __put_user(stfs.f_bavail, &target_stfs->f_bavail);
8878 __put_user(stfs.f_files, &target_stfs->f_files);
8879 __put_user(stfs.f_ffree, &target_stfs->f_ffree);
8880 __put_user(stfs.f_fsid.__val[0], &target_stfs->f_fsid.val[0]);
8881 __put_user(stfs.f_fsid.__val[1], &target_stfs->f_fsid.val[1]);
8882 __put_user(stfs.f_namelen, &target_stfs->f_namelen);
8883 __put_user(stfs.f_frsize, &target_stfs->f_frsize);
8884 memset(target_stfs->f_spare, 0, sizeof(target_stfs->f_spare));
8885 unlock_user_struct(target_stfs, arg3, 1);
8887 return ret;
8888 case TARGET_NR_fstatfs64:
8889 ret = get_errno(fstatfs(arg1, &stfs));
8890 goto convert_statfs64;
8891 #endif
8892 #ifdef TARGET_NR_socketcall
8893 case TARGET_NR_socketcall:
8894 return do_socketcall(arg1, arg2);
8895 #endif
8896 #ifdef TARGET_NR_accept
8897 case TARGET_NR_accept:
8898 return do_accept4(arg1, arg2, arg3, 0);
8899 #endif
8900 #ifdef TARGET_NR_accept4
8901 case TARGET_NR_accept4:
8902 return do_accept4(arg1, arg2, arg3, arg4);
8903 #endif
8904 #ifdef TARGET_NR_bind
8905 case TARGET_NR_bind:
8906 return do_bind(arg1, arg2, arg3);
8907 #endif
8908 #ifdef TARGET_NR_connect
8909 case TARGET_NR_connect:
8910 return do_connect(arg1, arg2, arg3);
8911 #endif
8912 #ifdef TARGET_NR_getpeername
8913 case TARGET_NR_getpeername:
8914 return do_getpeername(arg1, arg2, arg3);
8915 #endif
8916 #ifdef TARGET_NR_getsockname
8917 case TARGET_NR_getsockname:
8918 return do_getsockname(arg1, arg2, arg3);
8919 #endif
8920 #ifdef TARGET_NR_getsockopt
8921 case TARGET_NR_getsockopt:
8922 return do_getsockopt(arg1, arg2, arg3, arg4, arg5);
8923 #endif
8924 #ifdef TARGET_NR_listen
8925 case TARGET_NR_listen:
8926 return get_errno(listen(arg1, arg2));
8927 #endif
8928 #ifdef TARGET_NR_recv
8929 case TARGET_NR_recv:
8930 return do_recvfrom(arg1, arg2, arg3, arg4, 0, 0);
8931 #endif
8932 #ifdef TARGET_NR_recvfrom
8933 case TARGET_NR_recvfrom:
8934 return do_recvfrom(arg1, arg2, arg3, arg4, arg5, arg6);
8935 #endif
8936 #ifdef TARGET_NR_recvmsg
8937 case TARGET_NR_recvmsg:
8938 return do_sendrecvmsg(arg1, arg2, arg3, 0);
8939 #endif
8940 #ifdef TARGET_NR_send
8941 case TARGET_NR_send:
8942 return do_sendto(arg1, arg2, arg3, arg4, 0, 0);
8943 #endif
8944 #ifdef TARGET_NR_sendmsg
8945 case TARGET_NR_sendmsg:
8946 return do_sendrecvmsg(arg1, arg2, arg3, 1);
8947 #endif
8948 #ifdef TARGET_NR_sendmmsg
8949 case TARGET_NR_sendmmsg:
8950 return do_sendrecvmmsg(arg1, arg2, arg3, arg4, 1);
8951 case TARGET_NR_recvmmsg:
8952 return do_sendrecvmmsg(arg1, arg2, arg3, arg4, 0);
8953 #endif
8954 #ifdef TARGET_NR_sendto
8955 case TARGET_NR_sendto:
8956 return do_sendto(arg1, arg2, arg3, arg4, arg5, arg6);
8957 #endif
8958 #ifdef TARGET_NR_shutdown
8959 case TARGET_NR_shutdown:
8960 return get_errno(shutdown(arg1, arg2));
8961 #endif
8962 #if defined(TARGET_NR_getrandom) && defined(__NR_getrandom)
8963 case TARGET_NR_getrandom:
8964 p = lock_user(VERIFY_WRITE, arg1, arg2, 0);
8965 if (!p) {
8966 return -TARGET_EFAULT;
8968 ret = get_errno(getrandom(p, arg2, arg3));
8969 unlock_user(p, arg1, ret);
8970 return ret;
8971 #endif
8972 #ifdef TARGET_NR_socket
8973 case TARGET_NR_socket:
8974 return do_socket(arg1, arg2, arg3);
8975 #endif
8976 #ifdef TARGET_NR_socketpair
8977 case TARGET_NR_socketpair:
8978 return do_socketpair(arg1, arg2, arg3, arg4);
8979 #endif
8980 #ifdef TARGET_NR_setsockopt
8981 case TARGET_NR_setsockopt:
8982 return do_setsockopt(arg1, arg2, arg3, arg4, (socklen_t) arg5);
8983 #endif
8984 #if defined(TARGET_NR_syslog)
8985 case TARGET_NR_syslog:
8987 int len = arg2;
8989 switch (arg1) {
8990 case TARGET_SYSLOG_ACTION_CLOSE: /* Close log */
8991 case TARGET_SYSLOG_ACTION_OPEN: /* Open log */
8992 case TARGET_SYSLOG_ACTION_CLEAR: /* Clear ring buffer */
8993 case TARGET_SYSLOG_ACTION_CONSOLE_OFF: /* Disable logging */
8994 case TARGET_SYSLOG_ACTION_CONSOLE_ON: /* Enable logging */
8995 case TARGET_SYSLOG_ACTION_CONSOLE_LEVEL: /* Set messages level */
8996 case TARGET_SYSLOG_ACTION_SIZE_UNREAD: /* Number of chars */
8997 case TARGET_SYSLOG_ACTION_SIZE_BUFFER: /* Size of the buffer */
8998 return get_errno(sys_syslog((int)arg1, NULL, (int)arg3));
8999 case TARGET_SYSLOG_ACTION_READ: /* Read from log */
9000 case TARGET_SYSLOG_ACTION_READ_CLEAR: /* Read/clear msgs */
9001 case TARGET_SYSLOG_ACTION_READ_ALL: /* Read last messages */
9003 if (len < 0) {
9004 return -TARGET_EINVAL;
9006 if (len == 0) {
9007 return 0;
9009 p = lock_user(VERIFY_WRITE, arg2, arg3, 0);
9010 if (!p) {
9011 return -TARGET_EFAULT;
9013 ret = get_errno(sys_syslog((int)arg1, p, (int)arg3));
9014 unlock_user(p, arg2, arg3);
9016 return ret;
9017 default:
9018 return -TARGET_EINVAL;
9021 break;
9022 #endif
9023 case TARGET_NR_setitimer:
9025 struct itimerval value, ovalue, *pvalue;
9027 if (arg2) {
9028 pvalue = &value;
9029 if (copy_from_user_timeval(&pvalue->it_interval, arg2)
9030 || copy_from_user_timeval(&pvalue->it_value,
9031 arg2 + sizeof(struct target_timeval)))
9032 return -TARGET_EFAULT;
9033 } else {
9034 pvalue = NULL;
9036 ret = get_errno(setitimer(arg1, pvalue, &ovalue));
9037 if (!is_error(ret) && arg3) {
9038 if (copy_to_user_timeval(arg3,
9039 &ovalue.it_interval)
9040 || copy_to_user_timeval(arg3 + sizeof(struct target_timeval),
9041 &ovalue.it_value))
9042 return -TARGET_EFAULT;
9045 return ret;
9046 case TARGET_NR_getitimer:
9048 struct itimerval value;
9050 ret = get_errno(getitimer(arg1, &value));
9051 if (!is_error(ret) && arg2) {
9052 if (copy_to_user_timeval(arg2,
9053 &value.it_interval)
9054 || copy_to_user_timeval(arg2 + sizeof(struct target_timeval),
9055 &value.it_value))
9056 return -TARGET_EFAULT;
9059 return ret;
9060 #ifdef TARGET_NR_stat
9061 case TARGET_NR_stat:
9062 if (!(p = lock_user_string(arg1))) {
9063 return -TARGET_EFAULT;
9065 ret = get_errno(stat(path(p), &st));
9066 unlock_user(p, arg1, 0);
9067 goto do_stat;
9068 #endif
9069 #ifdef TARGET_NR_lstat
9070 case TARGET_NR_lstat:
9071 if (!(p = lock_user_string(arg1))) {
9072 return -TARGET_EFAULT;
9074 ret = get_errno(lstat(path(p), &st));
9075 unlock_user(p, arg1, 0);
9076 goto do_stat;
9077 #endif
9078 #ifdef TARGET_NR_fstat
9079 case TARGET_NR_fstat:
9081 ret = get_errno(fstat(arg1, &st));
9082 #if defined(TARGET_NR_stat) || defined(TARGET_NR_lstat)
9083 do_stat:
9084 #endif
9085 if (!is_error(ret)) {
9086 struct target_stat *target_st;
9088 if (!lock_user_struct(VERIFY_WRITE, target_st, arg2, 0))
9089 return -TARGET_EFAULT;
9090 memset(target_st, 0, sizeof(*target_st));
9091 __put_user(st.st_dev, &target_st->st_dev);
9092 __put_user(st.st_ino, &target_st->st_ino);
9093 __put_user(st.st_mode, &target_st->st_mode);
9094 __put_user(st.st_uid, &target_st->st_uid);
9095 __put_user(st.st_gid, &target_st->st_gid);
9096 __put_user(st.st_nlink, &target_st->st_nlink);
9097 __put_user(st.st_rdev, &target_st->st_rdev);
9098 __put_user(st.st_size, &target_st->st_size);
9099 __put_user(st.st_blksize, &target_st->st_blksize);
9100 __put_user(st.st_blocks, &target_st->st_blocks);
9101 __put_user(st.st_atime, &target_st->target_st_atime);
9102 __put_user(st.st_mtime, &target_st->target_st_mtime);
9103 __put_user(st.st_ctime, &target_st->target_st_ctime);
9104 #if (_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700) && \
9105 defined(TARGET_STAT_HAVE_NSEC)
9106 __put_user(st.st_atim.tv_nsec,
9107 &target_st->target_st_atime_nsec);
9108 __put_user(st.st_mtim.tv_nsec,
9109 &target_st->target_st_mtime_nsec);
9110 __put_user(st.st_ctim.tv_nsec,
9111 &target_st->target_st_ctime_nsec);
9112 #endif
9113 unlock_user_struct(target_st, arg2, 1);
9116 return ret;
9117 #endif
9118 case TARGET_NR_vhangup:
9119 return get_errno(vhangup());
9120 #ifdef TARGET_NR_syscall
9121 case TARGET_NR_syscall:
9122 return do_syscall(cpu_env, arg1 & 0xffff, arg2, arg3, arg4, arg5,
9123 arg6, arg7, arg8, 0);
9124 #endif
9125 case TARGET_NR_wait4:
9127 int status;
9128 abi_long status_ptr = arg2;
9129 struct rusage rusage, *rusage_ptr;
9130 abi_ulong target_rusage = arg4;
9131 abi_long rusage_err;
9132 if (target_rusage)
9133 rusage_ptr = &rusage;
9134 else
9135 rusage_ptr = NULL;
9136 ret = get_errno(safe_wait4(arg1, &status, arg3, rusage_ptr));
9137 if (!is_error(ret)) {
9138 if (status_ptr && ret) {
9139 status = host_to_target_waitstatus(status);
9140 if (put_user_s32(status, status_ptr))
9141 return -TARGET_EFAULT;
9143 if (target_rusage) {
9144 rusage_err = host_to_target_rusage(target_rusage, &rusage);
9145 if (rusage_err) {
9146 ret = rusage_err;
9151 return ret;
9152 #ifdef TARGET_NR_swapoff
9153 case TARGET_NR_swapoff:
9154 if (!(p = lock_user_string(arg1)))
9155 return -TARGET_EFAULT;
9156 ret = get_errno(swapoff(p));
9157 unlock_user(p, arg1, 0);
9158 return ret;
9159 #endif
9160 case TARGET_NR_sysinfo:
9162 struct target_sysinfo *target_value;
9163 struct sysinfo value;
9164 ret = get_errno(sysinfo(&value));
9165 if (!is_error(ret) && arg1)
9167 if (!lock_user_struct(VERIFY_WRITE, target_value, arg1, 0))
9168 return -TARGET_EFAULT;
9169 __put_user(value.uptime, &target_value->uptime);
9170 __put_user(value.loads[0], &target_value->loads[0]);
9171 __put_user(value.loads[1], &target_value->loads[1]);
9172 __put_user(value.loads[2], &target_value->loads[2]);
9173 __put_user(value.totalram, &target_value->totalram);
9174 __put_user(value.freeram, &target_value->freeram);
9175 __put_user(value.sharedram, &target_value->sharedram);
9176 __put_user(value.bufferram, &target_value->bufferram);
9177 __put_user(value.totalswap, &target_value->totalswap);
9178 __put_user(value.freeswap, &target_value->freeswap);
9179 __put_user(value.procs, &target_value->procs);
9180 __put_user(value.totalhigh, &target_value->totalhigh);
9181 __put_user(value.freehigh, &target_value->freehigh);
9182 __put_user(value.mem_unit, &target_value->mem_unit);
9183 unlock_user_struct(target_value, arg1, 1);
9186 return ret;
9187 #ifdef TARGET_NR_ipc
9188 case TARGET_NR_ipc:
9189 return do_ipc(cpu_env, arg1, arg2, arg3, arg4, arg5, arg6);
9190 #endif
9191 #ifdef TARGET_NR_semget
9192 case TARGET_NR_semget:
9193 return get_errno(semget(arg1, arg2, arg3));
9194 #endif
9195 #ifdef TARGET_NR_semop
9196 case TARGET_NR_semop:
9197 return do_semop(arg1, arg2, arg3);
9198 #endif
9199 #ifdef TARGET_NR_semctl
9200 case TARGET_NR_semctl:
9201 return do_semctl(arg1, arg2, arg3, arg4);
9202 #endif
9203 #ifdef TARGET_NR_msgctl
9204 case TARGET_NR_msgctl:
9205 return do_msgctl(arg1, arg2, arg3);
9206 #endif
9207 #ifdef TARGET_NR_msgget
9208 case TARGET_NR_msgget:
9209 return get_errno(msgget(arg1, arg2));
9210 #endif
9211 #ifdef TARGET_NR_msgrcv
9212 case TARGET_NR_msgrcv:
9213 return do_msgrcv(arg1, arg2, arg3, arg4, arg5);
9214 #endif
9215 #ifdef TARGET_NR_msgsnd
9216 case TARGET_NR_msgsnd:
9217 return do_msgsnd(arg1, arg2, arg3, arg4);
9218 #endif
9219 #ifdef TARGET_NR_shmget
9220 case TARGET_NR_shmget:
9221 return get_errno(shmget(arg1, arg2, arg3));
9222 #endif
9223 #ifdef TARGET_NR_shmctl
9224 case TARGET_NR_shmctl:
9225 return do_shmctl(arg1, arg2, arg3);
9226 #endif
9227 #ifdef TARGET_NR_shmat
9228 case TARGET_NR_shmat:
9229 return do_shmat(cpu_env, arg1, arg2, arg3);
9230 #endif
9231 #ifdef TARGET_NR_shmdt
9232 case TARGET_NR_shmdt:
9233 return do_shmdt(arg1);
9234 #endif
9235 case TARGET_NR_fsync:
9236 return get_errno(fsync(arg1));
9237 case TARGET_NR_clone:
9238 /* Linux manages to have three different orderings for its
9239 * arguments to clone(); the BACKWARDS and BACKWARDS2 defines
9240 * match the kernel's CONFIG_CLONE_* settings.
9241 * Microblaze is further special in that it uses a sixth
9242 * implicit argument to clone for the TLS pointer.
9244 #if defined(TARGET_MICROBLAZE)
9245 ret = get_errno(do_fork(cpu_env, arg1, arg2, arg4, arg6, arg5));
9246 #elif defined(TARGET_CLONE_BACKWARDS)
9247 ret = get_errno(do_fork(cpu_env, arg1, arg2, arg3, arg4, arg5));
9248 #elif defined(TARGET_CLONE_BACKWARDS2)
9249 ret = get_errno(do_fork(cpu_env, arg2, arg1, arg3, arg5, arg4));
9250 #else
9251 ret = get_errno(do_fork(cpu_env, arg1, arg2, arg3, arg5, arg4));
9252 #endif
9253 return ret;
9254 #ifdef __NR_exit_group
9255 /* new thread calls */
9256 case TARGET_NR_exit_group:
9257 preexit_cleanup(cpu_env, arg1);
9258 return get_errno(exit_group(arg1));
9259 #endif
9260 case TARGET_NR_setdomainname:
9261 if (!(p = lock_user_string(arg1)))
9262 return -TARGET_EFAULT;
9263 ret = get_errno(setdomainname(p, arg2));
9264 unlock_user(p, arg1, 0);
9265 return ret;
9266 case TARGET_NR_uname:
9267 /* no need to transcode because we use the linux syscall */
9269 struct new_utsname * buf;
9271 if (!lock_user_struct(VERIFY_WRITE, buf, arg1, 0))
9272 return -TARGET_EFAULT;
9273 ret = get_errno(sys_uname(buf));
9274 if (!is_error(ret)) {
9275 /* Overwrite the native machine name with whatever is being
9276 emulated. */
9277 g_strlcpy(buf->machine, cpu_to_uname_machine(cpu_env),
9278 sizeof(buf->machine));
9279 /* Allow the user to override the reported release. */
9280 if (qemu_uname_release && *qemu_uname_release) {
9281 g_strlcpy(buf->release, qemu_uname_release,
9282 sizeof(buf->release));
9285 unlock_user_struct(buf, arg1, 1);
9287 return ret;
9288 #ifdef TARGET_I386
9289 case TARGET_NR_modify_ldt:
9290 return do_modify_ldt(cpu_env, arg1, arg2, arg3);
9291 #if !defined(TARGET_X86_64)
9292 case TARGET_NR_vm86:
9293 return do_vm86(cpu_env, arg1, arg2);
9294 #endif
9295 #endif
9296 case TARGET_NR_adjtimex:
9298 struct timex host_buf;
9300 if (target_to_host_timex(&host_buf, arg1) != 0) {
9301 return -TARGET_EFAULT;
9303 ret = get_errno(adjtimex(&host_buf));
9304 if (!is_error(ret)) {
9305 if (host_to_target_timex(arg1, &host_buf) != 0) {
9306 return -TARGET_EFAULT;
9310 return ret;
9311 #if defined(TARGET_NR_clock_adjtime) && defined(CONFIG_CLOCK_ADJTIME)
9312 case TARGET_NR_clock_adjtime:
9314 struct timex htx, *phtx = &htx;
9316 if (target_to_host_timex(phtx, arg2) != 0) {
9317 return -TARGET_EFAULT;
9319 ret = get_errno(clock_adjtime(arg1, phtx));
9320 if (!is_error(ret) && phtx) {
9321 if (host_to_target_timex(arg2, phtx) != 0) {
9322 return -TARGET_EFAULT;
9326 return ret;
9327 #endif
9328 case TARGET_NR_getpgid:
9329 return get_errno(getpgid(arg1));
9330 case TARGET_NR_fchdir:
9331 return get_errno(fchdir(arg1));
9332 case TARGET_NR_personality:
9333 return get_errno(personality(arg1));
9334 #ifdef TARGET_NR__llseek /* Not on alpha */
9335 case TARGET_NR__llseek:
9337 int64_t res;
9338 #if !defined(__NR_llseek)
9339 res = lseek(arg1, ((uint64_t)arg2 << 32) | (abi_ulong)arg3, arg5);
9340 if (res == -1) {
9341 ret = get_errno(res);
9342 } else {
9343 ret = 0;
9345 #else
9346 ret = get_errno(_llseek(arg1, arg2, arg3, &res, arg5));
9347 #endif
9348 if ((ret == 0) && put_user_s64(res, arg4)) {
9349 return -TARGET_EFAULT;
9352 return ret;
9353 #endif
9354 #ifdef TARGET_NR_getdents
9355 case TARGET_NR_getdents:
9356 #ifdef EMULATE_GETDENTS_WITH_GETDENTS
9357 #if TARGET_ABI_BITS == 32 && HOST_LONG_BITS == 64
9359 struct target_dirent *target_dirp;
9360 struct linux_dirent *dirp;
9361 abi_long count = arg3;
9363 dirp = g_try_malloc(count);
9364 if (!dirp) {
9365 return -TARGET_ENOMEM;
9368 ret = get_errno(sys_getdents(arg1, dirp, count));
9369 if (!is_error(ret)) {
9370 struct linux_dirent *de;
9371 struct target_dirent *tde;
9372 int len = ret;
9373 int reclen, treclen;
9374 int count1, tnamelen;
9376 count1 = 0;
9377 de = dirp;
9378 if (!(target_dirp = lock_user(VERIFY_WRITE, arg2, count, 0)))
9379 return -TARGET_EFAULT;
9380 tde = target_dirp;
9381 while (len > 0) {
9382 reclen = de->d_reclen;
9383 tnamelen = reclen - offsetof(struct linux_dirent, d_name);
9384 assert(tnamelen >= 0);
9385 treclen = tnamelen + offsetof(struct target_dirent, d_name);
9386 assert(count1 + treclen <= count);
9387 tde->d_reclen = tswap16(treclen);
9388 tde->d_ino = tswapal(de->d_ino);
9389 tde->d_off = tswapal(de->d_off);
9390 memcpy(tde->d_name, de->d_name, tnamelen);
9391 de = (struct linux_dirent *)((char *)de + reclen);
9392 len -= reclen;
9393 tde = (struct target_dirent *)((char *)tde + treclen);
9394 count1 += treclen;
9396 ret = count1;
9397 unlock_user(target_dirp, arg2, ret);
9399 g_free(dirp);
9401 #else
9403 struct linux_dirent *dirp;
9404 abi_long count = arg3;
9406 if (!(dirp = lock_user(VERIFY_WRITE, arg2, count, 0)))
9407 return -TARGET_EFAULT;
9408 ret = get_errno(sys_getdents(arg1, dirp, count));
9409 if (!is_error(ret)) {
9410 struct linux_dirent *de;
9411 int len = ret;
9412 int reclen;
9413 de = dirp;
9414 while (len > 0) {
9415 reclen = de->d_reclen;
9416 if (reclen > len)
9417 break;
9418 de->d_reclen = tswap16(reclen);
9419 tswapls(&de->d_ino);
9420 tswapls(&de->d_off);
9421 de = (struct linux_dirent *)((char *)de + reclen);
9422 len -= reclen;
9425 unlock_user(dirp, arg2, ret);
9427 #endif
9428 #else
9429 /* Implement getdents in terms of getdents64 */
9431 struct linux_dirent64 *dirp;
9432 abi_long count = arg3;
9434 dirp = lock_user(VERIFY_WRITE, arg2, count, 0);
9435 if (!dirp) {
9436 return -TARGET_EFAULT;
9438 ret = get_errno(sys_getdents64(arg1, dirp, count));
9439 if (!is_error(ret)) {
9440 /* Convert the dirent64 structs to target dirent. We do this
9441 * in-place, since we can guarantee that a target_dirent is no
9442 * larger than a dirent64; however this means we have to be
9443 * careful to read everything before writing in the new format.
9445 struct linux_dirent64 *de;
9446 struct target_dirent *tde;
9447 int len = ret;
9448 int tlen = 0;
9450 de = dirp;
9451 tde = (struct target_dirent *)dirp;
9452 while (len > 0) {
9453 int namelen, treclen;
9454 int reclen = de->d_reclen;
9455 uint64_t ino = de->d_ino;
9456 int64_t off = de->d_off;
9457 uint8_t type = de->d_type;
9459 namelen = strlen(de->d_name);
9460 treclen = offsetof(struct target_dirent, d_name)
9461 + namelen + 2;
9462 treclen = QEMU_ALIGN_UP(treclen, sizeof(abi_long));
9464 memmove(tde->d_name, de->d_name, namelen + 1);
9465 tde->d_ino = tswapal(ino);
9466 tde->d_off = tswapal(off);
9467 tde->d_reclen = tswap16(treclen);
9468 /* The target_dirent type is in what was formerly a padding
9469 * byte at the end of the structure:
9471 *(((char *)tde) + treclen - 1) = type;
9473 de = (struct linux_dirent64 *)((char *)de + reclen);
9474 tde = (struct target_dirent *)((char *)tde + treclen);
9475 len -= reclen;
9476 tlen += treclen;
9478 ret = tlen;
9480 unlock_user(dirp, arg2, ret);
9482 #endif
9483 return ret;
9484 #endif /* TARGET_NR_getdents */
9485 #if defined(TARGET_NR_getdents64) && defined(__NR_getdents64)
9486 case TARGET_NR_getdents64:
9488 struct linux_dirent64 *dirp;
9489 abi_long count = arg3;
9490 if (!(dirp = lock_user(VERIFY_WRITE, arg2, count, 0)))
9491 return -TARGET_EFAULT;
9492 ret = get_errno(sys_getdents64(arg1, dirp, count));
9493 if (!is_error(ret)) {
9494 struct linux_dirent64 *de;
9495 int len = ret;
9496 int reclen;
9497 de = dirp;
9498 while (len > 0) {
9499 reclen = de->d_reclen;
9500 if (reclen > len)
9501 break;
9502 de->d_reclen = tswap16(reclen);
9503 tswap64s((uint64_t *)&de->d_ino);
9504 tswap64s((uint64_t *)&de->d_off);
9505 de = (struct linux_dirent64 *)((char *)de + reclen);
9506 len -= reclen;
9509 unlock_user(dirp, arg2, ret);
9511 return ret;
9512 #endif /* TARGET_NR_getdents64 */
9513 #if defined(TARGET_NR__newselect)
9514 case TARGET_NR__newselect:
9515 return do_select(arg1, arg2, arg3, arg4, arg5);
9516 #endif
9517 #if defined(TARGET_NR_poll) || defined(TARGET_NR_ppoll)
9518 # ifdef TARGET_NR_poll
9519 case TARGET_NR_poll:
9520 # endif
9521 # ifdef TARGET_NR_ppoll
9522 case TARGET_NR_ppoll:
9523 # endif
9525 struct target_pollfd *target_pfd;
9526 unsigned int nfds = arg2;
9527 struct pollfd *pfd;
9528 unsigned int i;
9530 pfd = NULL;
9531 target_pfd = NULL;
9532 if (nfds) {
9533 if (nfds > (INT_MAX / sizeof(struct target_pollfd))) {
9534 return -TARGET_EINVAL;
9537 target_pfd = lock_user(VERIFY_WRITE, arg1,
9538 sizeof(struct target_pollfd) * nfds, 1);
9539 if (!target_pfd) {
9540 return -TARGET_EFAULT;
9543 pfd = alloca(sizeof(struct pollfd) * nfds);
9544 for (i = 0; i < nfds; i++) {
9545 pfd[i].fd = tswap32(target_pfd[i].fd);
9546 pfd[i].events = tswap16(target_pfd[i].events);
9550 switch (num) {
9551 # ifdef TARGET_NR_ppoll
9552 case TARGET_NR_ppoll:
9554 struct timespec _timeout_ts, *timeout_ts = &_timeout_ts;
9555 target_sigset_t *target_set;
9556 sigset_t _set, *set = &_set;
9558 if (arg3) {
9559 if (target_to_host_timespec(timeout_ts, arg3)) {
9560 unlock_user(target_pfd, arg1, 0);
9561 return -TARGET_EFAULT;
9563 } else {
9564 timeout_ts = NULL;
9567 if (arg4) {
9568 if (arg5 != sizeof(target_sigset_t)) {
9569 unlock_user(target_pfd, arg1, 0);
9570 return -TARGET_EINVAL;
9573 target_set = lock_user(VERIFY_READ, arg4, sizeof(target_sigset_t), 1);
9574 if (!target_set) {
9575 unlock_user(target_pfd, arg1, 0);
9576 return -TARGET_EFAULT;
9578 target_to_host_sigset(set, target_set);
9579 } else {
9580 set = NULL;
9583 ret = get_errno(safe_ppoll(pfd, nfds, timeout_ts,
9584 set, SIGSET_T_SIZE));
9586 if (!is_error(ret) && arg3) {
9587 host_to_target_timespec(arg3, timeout_ts);
9589 if (arg4) {
9590 unlock_user(target_set, arg4, 0);
9592 break;
9594 # endif
9595 # ifdef TARGET_NR_poll
9596 case TARGET_NR_poll:
9598 struct timespec ts, *pts;
9600 if (arg3 >= 0) {
9601 /* Convert ms to secs, ns */
9602 ts.tv_sec = arg3 / 1000;
9603 ts.tv_nsec = (arg3 % 1000) * 1000000LL;
9604 pts = &ts;
9605 } else {
9606 /* -ve poll() timeout means "infinite" */
9607 pts = NULL;
9609 ret = get_errno(safe_ppoll(pfd, nfds, pts, NULL, 0));
9610 break;
9612 # endif
9613 default:
9614 g_assert_not_reached();
9617 if (!is_error(ret)) {
9618 for(i = 0; i < nfds; i++) {
9619 target_pfd[i].revents = tswap16(pfd[i].revents);
9622 unlock_user(target_pfd, arg1, sizeof(struct target_pollfd) * nfds);
9624 return ret;
9625 #endif
9626 case TARGET_NR_flock:
9627 /* NOTE: the flock constant seems to be the same for every
9628 Linux platform */
9629 return get_errno(safe_flock(arg1, arg2));
9630 case TARGET_NR_readv:
9632 struct iovec *vec = lock_iovec(VERIFY_WRITE, arg2, arg3, 0);
9633 if (vec != NULL) {
9634 ret = get_errno(safe_readv(arg1, vec, arg3));
9635 unlock_iovec(vec, arg2, arg3, 1);
9636 } else {
9637 ret = -host_to_target_errno(errno);
9640 return ret;
9641 case TARGET_NR_writev:
9643 struct iovec *vec = lock_iovec(VERIFY_READ, arg2, arg3, 1);
9644 if (vec != NULL) {
9645 ret = get_errno(safe_writev(arg1, vec, arg3));
9646 unlock_iovec(vec, arg2, arg3, 0);
9647 } else {
9648 ret = -host_to_target_errno(errno);
9651 return ret;
9652 #if defined(TARGET_NR_preadv)
9653 case TARGET_NR_preadv:
9655 struct iovec *vec = lock_iovec(VERIFY_WRITE, arg2, arg3, 0);
9656 if (vec != NULL) {
9657 unsigned long low, high;
9659 target_to_host_low_high(arg4, arg5, &low, &high);
9660 ret = get_errno(safe_preadv(arg1, vec, arg3, low, high));
9661 unlock_iovec(vec, arg2, arg3, 1);
9662 } else {
9663 ret = -host_to_target_errno(errno);
9666 return ret;
9667 #endif
9668 #if defined(TARGET_NR_pwritev)
9669 case TARGET_NR_pwritev:
9671 struct iovec *vec = lock_iovec(VERIFY_READ, arg2, arg3, 1);
9672 if (vec != NULL) {
9673 unsigned long low, high;
9675 target_to_host_low_high(arg4, arg5, &low, &high);
9676 ret = get_errno(safe_pwritev(arg1, vec, arg3, low, high));
9677 unlock_iovec(vec, arg2, arg3, 0);
9678 } else {
9679 ret = -host_to_target_errno(errno);
9682 return ret;
9683 #endif
9684 case TARGET_NR_getsid:
9685 return get_errno(getsid(arg1));
9686 #if defined(TARGET_NR_fdatasync) /* Not on alpha (osf_datasync ?) */
9687 case TARGET_NR_fdatasync:
9688 return get_errno(fdatasync(arg1));
9689 #endif
9690 #ifdef TARGET_NR__sysctl
9691 case TARGET_NR__sysctl:
9692 /* We don't implement this, but ENOTDIR is always a safe
9693 return value. */
9694 return -TARGET_ENOTDIR;
9695 #endif
9696 case TARGET_NR_sched_getaffinity:
9698 unsigned int mask_size;
9699 unsigned long *mask;
9702 * sched_getaffinity needs multiples of ulong, so need to take
9703 * care of mismatches between target ulong and host ulong sizes.
9705 if (arg2 & (sizeof(abi_ulong) - 1)) {
9706 return -TARGET_EINVAL;
9708 mask_size = (arg2 + (sizeof(*mask) - 1)) & ~(sizeof(*mask) - 1);
9710 mask = alloca(mask_size);
9711 memset(mask, 0, mask_size);
9712 ret = get_errno(sys_sched_getaffinity(arg1, mask_size, mask));
9714 if (!is_error(ret)) {
9715 if (ret > arg2) {
9716 /* More data returned than the caller's buffer will fit.
9717 * This only happens if sizeof(abi_long) < sizeof(long)
9718 * and the caller passed us a buffer holding an odd number
9719 * of abi_longs. If the host kernel is actually using the
9720 * extra 4 bytes then fail EINVAL; otherwise we can just
9721 * ignore them and only copy the interesting part.
9723 int numcpus = sysconf(_SC_NPROCESSORS_CONF);
9724 if (numcpus > arg2 * 8) {
9725 return -TARGET_EINVAL;
9727 ret = arg2;
9730 if (host_to_target_cpu_mask(mask, mask_size, arg3, ret)) {
9731 return -TARGET_EFAULT;
9735 return ret;
9736 case TARGET_NR_sched_setaffinity:
9738 unsigned int mask_size;
9739 unsigned long *mask;
9742 * sched_setaffinity needs multiples of ulong, so need to take
9743 * care of mismatches between target ulong and host ulong sizes.
9745 if (arg2 & (sizeof(abi_ulong) - 1)) {
9746 return -TARGET_EINVAL;
9748 mask_size = (arg2 + (sizeof(*mask) - 1)) & ~(sizeof(*mask) - 1);
9749 mask = alloca(mask_size);
9751 ret = target_to_host_cpu_mask(mask, mask_size, arg3, arg2);
9752 if (ret) {
9753 return ret;
9756 return get_errno(sys_sched_setaffinity(arg1, mask_size, mask));
9758 case TARGET_NR_getcpu:
9760 unsigned cpu, node;
9761 ret = get_errno(sys_getcpu(arg1 ? &cpu : NULL,
9762 arg2 ? &node : NULL,
9763 NULL));
9764 if (is_error(ret)) {
9765 return ret;
9767 if (arg1 && put_user_u32(cpu, arg1)) {
9768 return -TARGET_EFAULT;
9770 if (arg2 && put_user_u32(node, arg2)) {
9771 return -TARGET_EFAULT;
9774 return ret;
9775 case TARGET_NR_sched_setparam:
9777 struct sched_param *target_schp;
9778 struct sched_param schp;
9780 if (arg2 == 0) {
9781 return -TARGET_EINVAL;
9783 if (!lock_user_struct(VERIFY_READ, target_schp, arg2, 1))
9784 return -TARGET_EFAULT;
9785 schp.sched_priority = tswap32(target_schp->sched_priority);
9786 unlock_user_struct(target_schp, arg2, 0);
9787 return get_errno(sched_setparam(arg1, &schp));
9789 case TARGET_NR_sched_getparam:
9791 struct sched_param *target_schp;
9792 struct sched_param schp;
9794 if (arg2 == 0) {
9795 return -TARGET_EINVAL;
9797 ret = get_errno(sched_getparam(arg1, &schp));
9798 if (!is_error(ret)) {
9799 if (!lock_user_struct(VERIFY_WRITE, target_schp, arg2, 0))
9800 return -TARGET_EFAULT;
9801 target_schp->sched_priority = tswap32(schp.sched_priority);
9802 unlock_user_struct(target_schp, arg2, 1);
9805 return ret;
9806 case TARGET_NR_sched_setscheduler:
9808 struct sched_param *target_schp;
9809 struct sched_param schp;
9810 if (arg3 == 0) {
9811 return -TARGET_EINVAL;
9813 if (!lock_user_struct(VERIFY_READ, target_schp, arg3, 1))
9814 return -TARGET_EFAULT;
9815 schp.sched_priority = tswap32(target_schp->sched_priority);
9816 unlock_user_struct(target_schp, arg3, 0);
9817 return get_errno(sched_setscheduler(arg1, arg2, &schp));
9819 case TARGET_NR_sched_getscheduler:
9820 return get_errno(sched_getscheduler(arg1));
9821 case TARGET_NR_sched_yield:
9822 return get_errno(sched_yield());
9823 case TARGET_NR_sched_get_priority_max:
9824 return get_errno(sched_get_priority_max(arg1));
9825 case TARGET_NR_sched_get_priority_min:
9826 return get_errno(sched_get_priority_min(arg1));
9827 case TARGET_NR_sched_rr_get_interval:
9829 struct timespec ts;
9830 ret = get_errno(sched_rr_get_interval(arg1, &ts));
9831 if (!is_error(ret)) {
9832 ret = host_to_target_timespec(arg2, &ts);
9835 return ret;
9836 case TARGET_NR_nanosleep:
9838 struct timespec req, rem;
9839 target_to_host_timespec(&req, arg1);
9840 ret = get_errno(safe_nanosleep(&req, &rem));
9841 if (is_error(ret) && arg2) {
9842 host_to_target_timespec(arg2, &rem);
9845 return ret;
9846 case TARGET_NR_prctl:
9847 switch (arg1) {
9848 case PR_GET_PDEATHSIG:
9850 int deathsig;
9851 ret = get_errno(prctl(arg1, &deathsig, arg3, arg4, arg5));
9852 if (!is_error(ret) && arg2
9853 && put_user_ual(deathsig, arg2)) {
9854 return -TARGET_EFAULT;
9856 return ret;
9858 #ifdef PR_GET_NAME
9859 case PR_GET_NAME:
9861 void *name = lock_user(VERIFY_WRITE, arg2, 16, 1);
9862 if (!name) {
9863 return -TARGET_EFAULT;
9865 ret = get_errno(prctl(arg1, (unsigned long)name,
9866 arg3, arg4, arg5));
9867 unlock_user(name, arg2, 16);
9868 return ret;
9870 case PR_SET_NAME:
9872 void *name = lock_user(VERIFY_READ, arg2, 16, 1);
9873 if (!name) {
9874 return -TARGET_EFAULT;
9876 ret = get_errno(prctl(arg1, (unsigned long)name,
9877 arg3, arg4, arg5));
9878 unlock_user(name, arg2, 0);
9879 return ret;
9881 #endif
9882 #ifdef TARGET_MIPS
9883 case TARGET_PR_GET_FP_MODE:
9885 CPUMIPSState *env = ((CPUMIPSState *)cpu_env);
9886 ret = 0;
9887 if (env->CP0_Status & (1 << CP0St_FR)) {
9888 ret |= TARGET_PR_FP_MODE_FR;
9890 if (env->CP0_Config5 & (1 << CP0C5_FRE)) {
9891 ret |= TARGET_PR_FP_MODE_FRE;
9893 return ret;
9895 case TARGET_PR_SET_FP_MODE:
9897 CPUMIPSState *env = ((CPUMIPSState *)cpu_env);
9898 bool old_fr = env->CP0_Status & (1 << CP0St_FR);
9899 bool old_fre = env->CP0_Config5 & (1 << CP0C5_FRE);
9900 bool new_fr = arg2 & TARGET_PR_FP_MODE_FR;
9901 bool new_fre = arg2 & TARGET_PR_FP_MODE_FRE;
9903 const unsigned int known_bits = TARGET_PR_FP_MODE_FR |
9904 TARGET_PR_FP_MODE_FRE;
9906 /* If nothing to change, return right away, successfully. */
9907 if (old_fr == new_fr && old_fre == new_fre) {
9908 return 0;
9910 /* Check the value is valid */
9911 if (arg2 & ~known_bits) {
9912 return -TARGET_EOPNOTSUPP;
9914 /* Setting FRE without FR is not supported. */
9915 if (new_fre && !new_fr) {
9916 return -TARGET_EOPNOTSUPP;
9918 if (new_fr && !(env->active_fpu.fcr0 & (1 << FCR0_F64))) {
9919 /* FR1 is not supported */
9920 return -TARGET_EOPNOTSUPP;
9922 if (!new_fr && (env->active_fpu.fcr0 & (1 << FCR0_F64))
9923 && !(env->CP0_Status_rw_bitmask & (1 << CP0St_FR))) {
9924 /* cannot set FR=0 */
9925 return -TARGET_EOPNOTSUPP;
9927 if (new_fre && !(env->active_fpu.fcr0 & (1 << FCR0_FREP))) {
9928 /* Cannot set FRE=1 */
9929 return -TARGET_EOPNOTSUPP;
9932 int i;
9933 fpr_t *fpr = env->active_fpu.fpr;
9934 for (i = 0; i < 32 ; i += 2) {
9935 if (!old_fr && new_fr) {
9936 fpr[i].w[!FP_ENDIAN_IDX] = fpr[i + 1].w[FP_ENDIAN_IDX];
9937 } else if (old_fr && !new_fr) {
9938 fpr[i + 1].w[FP_ENDIAN_IDX] = fpr[i].w[!FP_ENDIAN_IDX];
9942 if (new_fr) {
9943 env->CP0_Status |= (1 << CP0St_FR);
9944 env->hflags |= MIPS_HFLAG_F64;
9945 } else {
9946 env->CP0_Status &= ~(1 << CP0St_FR);
9947 env->hflags &= ~MIPS_HFLAG_F64;
9949 if (new_fre) {
9950 env->CP0_Config5 |= (1 << CP0C5_FRE);
9951 if (env->active_fpu.fcr0 & (1 << FCR0_FREP)) {
9952 env->hflags |= MIPS_HFLAG_FRE;
9954 } else {
9955 env->CP0_Config5 &= ~(1 << CP0C5_FRE);
9956 env->hflags &= ~MIPS_HFLAG_FRE;
9959 return 0;
9961 #endif /* MIPS */
9962 #ifdef TARGET_AARCH64
9963 case TARGET_PR_SVE_SET_VL:
9965 * We cannot support either PR_SVE_SET_VL_ONEXEC or
9966 * PR_SVE_VL_INHERIT. Note the kernel definition
9967 * of sve_vl_valid allows for VQ=512, i.e. VL=8192,
9968 * even though the current architectural maximum is VQ=16.
9970 ret = -TARGET_EINVAL;
9971 if (cpu_isar_feature(aa64_sve, env_archcpu(cpu_env))
9972 && arg2 >= 0 && arg2 <= 512 * 16 && !(arg2 & 15)) {
9973 CPUARMState *env = cpu_env;
9974 ARMCPU *cpu = env_archcpu(env);
9975 uint32_t vq, old_vq;
9977 old_vq = (env->vfp.zcr_el[1] & 0xf) + 1;
9978 vq = MAX(arg2 / 16, 1);
9979 vq = MIN(vq, cpu->sve_max_vq);
9981 if (vq < old_vq) {
9982 aarch64_sve_narrow_vq(env, vq);
9984 env->vfp.zcr_el[1] = vq - 1;
9985 ret = vq * 16;
9987 return ret;
9988 case TARGET_PR_SVE_GET_VL:
9989 ret = -TARGET_EINVAL;
9991 ARMCPU *cpu = env_archcpu(cpu_env);
9992 if (cpu_isar_feature(aa64_sve, cpu)) {
9993 ret = ((cpu->env.vfp.zcr_el[1] & 0xf) + 1) * 16;
9996 return ret;
9997 case TARGET_PR_PAC_RESET_KEYS:
9999 CPUARMState *env = cpu_env;
10000 ARMCPU *cpu = env_archcpu(env);
10002 if (arg3 || arg4 || arg5) {
10003 return -TARGET_EINVAL;
10005 if (cpu_isar_feature(aa64_pauth, cpu)) {
10006 int all = (TARGET_PR_PAC_APIAKEY | TARGET_PR_PAC_APIBKEY |
10007 TARGET_PR_PAC_APDAKEY | TARGET_PR_PAC_APDBKEY |
10008 TARGET_PR_PAC_APGAKEY);
10009 int ret = 0;
10010 Error *err = NULL;
10012 if (arg2 == 0) {
10013 arg2 = all;
10014 } else if (arg2 & ~all) {
10015 return -TARGET_EINVAL;
10017 if (arg2 & TARGET_PR_PAC_APIAKEY) {
10018 ret |= qemu_guest_getrandom(&env->keys.apia,
10019 sizeof(ARMPACKey), &err);
10021 if (arg2 & TARGET_PR_PAC_APIBKEY) {
10022 ret |= qemu_guest_getrandom(&env->keys.apib,
10023 sizeof(ARMPACKey), &err);
10025 if (arg2 & TARGET_PR_PAC_APDAKEY) {
10026 ret |= qemu_guest_getrandom(&env->keys.apda,
10027 sizeof(ARMPACKey), &err);
10029 if (arg2 & TARGET_PR_PAC_APDBKEY) {
10030 ret |= qemu_guest_getrandom(&env->keys.apdb,
10031 sizeof(ARMPACKey), &err);
10033 if (arg2 & TARGET_PR_PAC_APGAKEY) {
10034 ret |= qemu_guest_getrandom(&env->keys.apga,
10035 sizeof(ARMPACKey), &err);
10037 if (ret != 0) {
10039 * Some unknown failure in the crypto. The best
10040 * we can do is log it and fail the syscall.
10041 * The real syscall cannot fail this way.
10043 qemu_log_mask(LOG_UNIMP,
10044 "PR_PAC_RESET_KEYS: Crypto failure: %s",
10045 error_get_pretty(err));
10046 error_free(err);
10047 return -TARGET_EIO;
10049 return 0;
10052 return -TARGET_EINVAL;
10053 #endif /* AARCH64 */
10054 case PR_GET_SECCOMP:
10055 case PR_SET_SECCOMP:
10056 /* Disable seccomp to prevent the target disabling syscalls we
10057 * need. */
10058 return -TARGET_EINVAL;
10059 default:
10060 /* Most prctl options have no pointer arguments */
10061 return get_errno(prctl(arg1, arg2, arg3, arg4, arg5));
10063 break;
10064 #ifdef TARGET_NR_arch_prctl
10065 case TARGET_NR_arch_prctl:
10066 #if defined(TARGET_I386) && !defined(TARGET_ABI32)
10067 return do_arch_prctl(cpu_env, arg1, arg2);
10068 #else
10069 #error unreachable
10070 #endif
10071 #endif
10072 #ifdef TARGET_NR_pread64
10073 case TARGET_NR_pread64:
10074 if (regpairs_aligned(cpu_env, num)) {
10075 arg4 = arg5;
10076 arg5 = arg6;
10078 if (arg2 == 0 && arg3 == 0) {
10079 /* Special-case NULL buffer and zero length, which should succeed */
10080 p = 0;
10081 } else {
10082 p = lock_user(VERIFY_WRITE, arg2, arg3, 0);
10083 if (!p) {
10084 return -TARGET_EFAULT;
10087 ret = get_errno(pread64(arg1, p, arg3, target_offset64(arg4, arg5)));
10088 unlock_user(p, arg2, ret);
10089 return ret;
10090 case TARGET_NR_pwrite64:
10091 if (regpairs_aligned(cpu_env, num)) {
10092 arg4 = arg5;
10093 arg5 = arg6;
10095 if (arg2 == 0 && arg3 == 0) {
10096 /* Special-case NULL buffer and zero length, which should succeed */
10097 p = 0;
10098 } else {
10099 p = lock_user(VERIFY_READ, arg2, arg3, 1);
10100 if (!p) {
10101 return -TARGET_EFAULT;
10104 ret = get_errno(pwrite64(arg1, p, arg3, target_offset64(arg4, arg5)));
10105 unlock_user(p, arg2, 0);
10106 return ret;
10107 #endif
10108 case TARGET_NR_getcwd:
10109 if (!(p = lock_user(VERIFY_WRITE, arg1, arg2, 0)))
10110 return -TARGET_EFAULT;
10111 ret = get_errno(sys_getcwd1(p, arg2));
10112 unlock_user(p, arg1, ret);
10113 return ret;
10114 case TARGET_NR_capget:
10115 case TARGET_NR_capset:
10117 struct target_user_cap_header *target_header;
10118 struct target_user_cap_data *target_data = NULL;
10119 struct __user_cap_header_struct header;
10120 struct __user_cap_data_struct data[2];
10121 struct __user_cap_data_struct *dataptr = NULL;
10122 int i, target_datalen;
10123 int data_items = 1;
10125 if (!lock_user_struct(VERIFY_WRITE, target_header, arg1, 1)) {
10126 return -TARGET_EFAULT;
10128 header.version = tswap32(target_header->version);
10129 header.pid = tswap32(target_header->pid);
10131 if (header.version != _LINUX_CAPABILITY_VERSION) {
10132 /* Version 2 and up takes pointer to two user_data structs */
10133 data_items = 2;
10136 target_datalen = sizeof(*target_data) * data_items;
10138 if (arg2) {
10139 if (num == TARGET_NR_capget) {
10140 target_data = lock_user(VERIFY_WRITE, arg2, target_datalen, 0);
10141 } else {
10142 target_data = lock_user(VERIFY_READ, arg2, target_datalen, 1);
10144 if (!target_data) {
10145 unlock_user_struct(target_header, arg1, 0);
10146 return -TARGET_EFAULT;
10149 if (num == TARGET_NR_capset) {
10150 for (i = 0; i < data_items; i++) {
10151 data[i].effective = tswap32(target_data[i].effective);
10152 data[i].permitted = tswap32(target_data[i].permitted);
10153 data[i].inheritable = tswap32(target_data[i].inheritable);
10157 dataptr = data;
10160 if (num == TARGET_NR_capget) {
10161 ret = get_errno(capget(&header, dataptr));
10162 } else {
10163 ret = get_errno(capset(&header, dataptr));
10166 /* The kernel always updates version for both capget and capset */
10167 target_header->version = tswap32(header.version);
10168 unlock_user_struct(target_header, arg1, 1);
10170 if (arg2) {
10171 if (num == TARGET_NR_capget) {
10172 for (i = 0; i < data_items; i++) {
10173 target_data[i].effective = tswap32(data[i].effective);
10174 target_data[i].permitted = tswap32(data[i].permitted);
10175 target_data[i].inheritable = tswap32(data[i].inheritable);
10177 unlock_user(target_data, arg2, target_datalen);
10178 } else {
10179 unlock_user(target_data, arg2, 0);
10182 return ret;
10184 case TARGET_NR_sigaltstack:
10185 return do_sigaltstack(arg1, arg2,
10186 get_sp_from_cpustate((CPUArchState *)cpu_env));
10188 #ifdef CONFIG_SENDFILE
10189 #ifdef TARGET_NR_sendfile
10190 case TARGET_NR_sendfile:
10192 off_t *offp = NULL;
10193 off_t off;
10194 if (arg3) {
10195 ret = get_user_sal(off, arg3);
10196 if (is_error(ret)) {
10197 return ret;
10199 offp = &off;
10201 ret = get_errno(sendfile(arg1, arg2, offp, arg4));
10202 if (!is_error(ret) && arg3) {
10203 abi_long ret2 = put_user_sal(off, arg3);
10204 if (is_error(ret2)) {
10205 ret = ret2;
10208 return ret;
10210 #endif
10211 #ifdef TARGET_NR_sendfile64
10212 case TARGET_NR_sendfile64:
10214 off_t *offp = NULL;
10215 off_t off;
10216 if (arg3) {
10217 ret = get_user_s64(off, arg3);
10218 if (is_error(ret)) {
10219 return ret;
10221 offp = &off;
10223 ret = get_errno(sendfile(arg1, arg2, offp, arg4));
10224 if (!is_error(ret) && arg3) {
10225 abi_long ret2 = put_user_s64(off, arg3);
10226 if (is_error(ret2)) {
10227 ret = ret2;
10230 return ret;
10232 #endif
10233 #endif
10234 #ifdef TARGET_NR_vfork
10235 case TARGET_NR_vfork:
10236 return get_errno(do_fork(cpu_env,
10237 CLONE_VFORK | CLONE_VM | TARGET_SIGCHLD,
10238 0, 0, 0, 0));
10239 #endif
10240 #ifdef TARGET_NR_ugetrlimit
10241 case TARGET_NR_ugetrlimit:
10243 struct rlimit rlim;
10244 int resource = target_to_host_resource(arg1);
10245 ret = get_errno(getrlimit(resource, &rlim));
10246 if (!is_error(ret)) {
10247 struct target_rlimit *target_rlim;
10248 if (!lock_user_struct(VERIFY_WRITE, target_rlim, arg2, 0))
10249 return -TARGET_EFAULT;
10250 target_rlim->rlim_cur = host_to_target_rlim(rlim.rlim_cur);
10251 target_rlim->rlim_max = host_to_target_rlim(rlim.rlim_max);
10252 unlock_user_struct(target_rlim, arg2, 1);
10254 return ret;
10256 #endif
10257 #ifdef TARGET_NR_truncate64
10258 case TARGET_NR_truncate64:
10259 if (!(p = lock_user_string(arg1)))
10260 return -TARGET_EFAULT;
10261 ret = target_truncate64(cpu_env, p, arg2, arg3, arg4);
10262 unlock_user(p, arg1, 0);
10263 return ret;
10264 #endif
10265 #ifdef TARGET_NR_ftruncate64
10266 case TARGET_NR_ftruncate64:
10267 return target_ftruncate64(cpu_env, arg1, arg2, arg3, arg4);
10268 #endif
10269 #ifdef TARGET_NR_stat64
10270 case TARGET_NR_stat64:
10271 if (!(p = lock_user_string(arg1))) {
10272 return -TARGET_EFAULT;
10274 ret = get_errno(stat(path(p), &st));
10275 unlock_user(p, arg1, 0);
10276 if (!is_error(ret))
10277 ret = host_to_target_stat64(cpu_env, arg2, &st);
10278 return ret;
10279 #endif
10280 #ifdef TARGET_NR_lstat64
10281 case TARGET_NR_lstat64:
10282 if (!(p = lock_user_string(arg1))) {
10283 return -TARGET_EFAULT;
10285 ret = get_errno(lstat(path(p), &st));
10286 unlock_user(p, arg1, 0);
10287 if (!is_error(ret))
10288 ret = host_to_target_stat64(cpu_env, arg2, &st);
10289 return ret;
10290 #endif
10291 #ifdef TARGET_NR_fstat64
10292 case TARGET_NR_fstat64:
10293 ret = get_errno(fstat(arg1, &st));
10294 if (!is_error(ret))
10295 ret = host_to_target_stat64(cpu_env, arg2, &st);
10296 return ret;
10297 #endif
10298 #if (defined(TARGET_NR_fstatat64) || defined(TARGET_NR_newfstatat))
10299 #ifdef TARGET_NR_fstatat64
10300 case TARGET_NR_fstatat64:
10301 #endif
10302 #ifdef TARGET_NR_newfstatat
10303 case TARGET_NR_newfstatat:
10304 #endif
10305 if (!(p = lock_user_string(arg2))) {
10306 return -TARGET_EFAULT;
10308 ret = get_errno(fstatat(arg1, path(p), &st, arg4));
10309 unlock_user(p, arg2, 0);
10310 if (!is_error(ret))
10311 ret = host_to_target_stat64(cpu_env, arg3, &st);
10312 return ret;
10313 #endif
10314 #if defined(TARGET_NR_statx)
10315 case TARGET_NR_statx:
10317 struct target_statx *target_stx;
10318 int dirfd = arg1;
10319 int flags = arg3;
10321 p = lock_user_string(arg2);
10322 if (p == NULL) {
10323 return -TARGET_EFAULT;
10325 #if defined(__NR_statx)
10328 * It is assumed that struct statx is architecture independent.
10330 struct target_statx host_stx;
10331 int mask = arg4;
10333 ret = get_errno(sys_statx(dirfd, p, flags, mask, &host_stx));
10334 if (!is_error(ret)) {
10335 if (host_to_target_statx(&host_stx, arg5) != 0) {
10336 unlock_user(p, arg2, 0);
10337 return -TARGET_EFAULT;
10341 if (ret != -TARGET_ENOSYS) {
10342 unlock_user(p, arg2, 0);
10343 return ret;
10346 #endif
10347 ret = get_errno(fstatat(dirfd, path(p), &st, flags));
10348 unlock_user(p, arg2, 0);
10350 if (!is_error(ret)) {
10351 if (!lock_user_struct(VERIFY_WRITE, target_stx, arg5, 0)) {
10352 return -TARGET_EFAULT;
10354 memset(target_stx, 0, sizeof(*target_stx));
10355 __put_user(major(st.st_dev), &target_stx->stx_dev_major);
10356 __put_user(minor(st.st_dev), &target_stx->stx_dev_minor);
10357 __put_user(st.st_ino, &target_stx->stx_ino);
10358 __put_user(st.st_mode, &target_stx->stx_mode);
10359 __put_user(st.st_uid, &target_stx->stx_uid);
10360 __put_user(st.st_gid, &target_stx->stx_gid);
10361 __put_user(st.st_nlink, &target_stx->stx_nlink);
10362 __put_user(major(st.st_rdev), &target_stx->stx_rdev_major);
10363 __put_user(minor(st.st_rdev), &target_stx->stx_rdev_minor);
10364 __put_user(st.st_size, &target_stx->stx_size);
10365 __put_user(st.st_blksize, &target_stx->stx_blksize);
10366 __put_user(st.st_blocks, &target_stx->stx_blocks);
10367 __put_user(st.st_atime, &target_stx->stx_atime.tv_sec);
10368 __put_user(st.st_mtime, &target_stx->stx_mtime.tv_sec);
10369 __put_user(st.st_ctime, &target_stx->stx_ctime.tv_sec);
10370 unlock_user_struct(target_stx, arg5, 1);
10373 return ret;
10374 #endif
10375 #ifdef TARGET_NR_lchown
10376 case TARGET_NR_lchown:
10377 if (!(p = lock_user_string(arg1)))
10378 return -TARGET_EFAULT;
10379 ret = get_errno(lchown(p, low2highuid(arg2), low2highgid(arg3)));
10380 unlock_user(p, arg1, 0);
10381 return ret;
10382 #endif
10383 #ifdef TARGET_NR_getuid
10384 case TARGET_NR_getuid:
10385 return get_errno(high2lowuid(getuid()));
10386 #endif
10387 #ifdef TARGET_NR_getgid
10388 case TARGET_NR_getgid:
10389 return get_errno(high2lowgid(getgid()));
10390 #endif
10391 #ifdef TARGET_NR_geteuid
10392 case TARGET_NR_geteuid:
10393 return get_errno(high2lowuid(geteuid()));
10394 #endif
10395 #ifdef TARGET_NR_getegid
10396 case TARGET_NR_getegid:
10397 return get_errno(high2lowgid(getegid()));
10398 #endif
10399 case TARGET_NR_setreuid:
10400 return get_errno(setreuid(low2highuid(arg1), low2highuid(arg2)));
10401 case TARGET_NR_setregid:
10402 return get_errno(setregid(low2highgid(arg1), low2highgid(arg2)));
10403 case TARGET_NR_getgroups:
10405 int gidsetsize = arg1;
10406 target_id *target_grouplist;
10407 gid_t *grouplist;
10408 int i;
10410 grouplist = alloca(gidsetsize * sizeof(gid_t));
10411 ret = get_errno(getgroups(gidsetsize, grouplist));
10412 if (gidsetsize == 0)
10413 return ret;
10414 if (!is_error(ret)) {
10415 target_grouplist = lock_user(VERIFY_WRITE, arg2, gidsetsize * sizeof(target_id), 0);
10416 if (!target_grouplist)
10417 return -TARGET_EFAULT;
10418 for(i = 0;i < ret; i++)
10419 target_grouplist[i] = tswapid(high2lowgid(grouplist[i]));
10420 unlock_user(target_grouplist, arg2, gidsetsize * sizeof(target_id));
10423 return ret;
10424 case TARGET_NR_setgroups:
10426 int gidsetsize = arg1;
10427 target_id *target_grouplist;
10428 gid_t *grouplist = NULL;
10429 int i;
10430 if (gidsetsize) {
10431 grouplist = alloca(gidsetsize * sizeof(gid_t));
10432 target_grouplist = lock_user(VERIFY_READ, arg2, gidsetsize * sizeof(target_id), 1);
10433 if (!target_grouplist) {
10434 return -TARGET_EFAULT;
10436 for (i = 0; i < gidsetsize; i++) {
10437 grouplist[i] = low2highgid(tswapid(target_grouplist[i]));
10439 unlock_user(target_grouplist, arg2, 0);
10441 return get_errno(setgroups(gidsetsize, grouplist));
10443 case TARGET_NR_fchown:
10444 return get_errno(fchown(arg1, low2highuid(arg2), low2highgid(arg3)));
10445 #if defined(TARGET_NR_fchownat)
10446 case TARGET_NR_fchownat:
10447 if (!(p = lock_user_string(arg2)))
10448 return -TARGET_EFAULT;
10449 ret = get_errno(fchownat(arg1, p, low2highuid(arg3),
10450 low2highgid(arg4), arg5));
10451 unlock_user(p, arg2, 0);
10452 return ret;
10453 #endif
10454 #ifdef TARGET_NR_setresuid
10455 case TARGET_NR_setresuid:
10456 return get_errno(sys_setresuid(low2highuid(arg1),
10457 low2highuid(arg2),
10458 low2highuid(arg3)));
10459 #endif
10460 #ifdef TARGET_NR_getresuid
10461 case TARGET_NR_getresuid:
10463 uid_t ruid, euid, suid;
10464 ret = get_errno(getresuid(&ruid, &euid, &suid));
10465 if (!is_error(ret)) {
10466 if (put_user_id(high2lowuid(ruid), arg1)
10467 || put_user_id(high2lowuid(euid), arg2)
10468 || put_user_id(high2lowuid(suid), arg3))
10469 return -TARGET_EFAULT;
10472 return ret;
10473 #endif
10474 #ifdef TARGET_NR_getresgid
10475 case TARGET_NR_setresgid:
10476 return get_errno(sys_setresgid(low2highgid(arg1),
10477 low2highgid(arg2),
10478 low2highgid(arg3)));
10479 #endif
10480 #ifdef TARGET_NR_getresgid
10481 case TARGET_NR_getresgid:
10483 gid_t rgid, egid, sgid;
10484 ret = get_errno(getresgid(&rgid, &egid, &sgid));
10485 if (!is_error(ret)) {
10486 if (put_user_id(high2lowgid(rgid), arg1)
10487 || put_user_id(high2lowgid(egid), arg2)
10488 || put_user_id(high2lowgid(sgid), arg3))
10489 return -TARGET_EFAULT;
10492 return ret;
10493 #endif
10494 #ifdef TARGET_NR_chown
10495 case TARGET_NR_chown:
10496 if (!(p = lock_user_string(arg1)))
10497 return -TARGET_EFAULT;
10498 ret = get_errno(chown(p, low2highuid(arg2), low2highgid(arg3)));
10499 unlock_user(p, arg1, 0);
10500 return ret;
10501 #endif
10502 case TARGET_NR_setuid:
10503 return get_errno(sys_setuid(low2highuid(arg1)));
10504 case TARGET_NR_setgid:
10505 return get_errno(sys_setgid(low2highgid(arg1)));
10506 case TARGET_NR_setfsuid:
10507 return get_errno(setfsuid(arg1));
10508 case TARGET_NR_setfsgid:
10509 return get_errno(setfsgid(arg1));
10511 #ifdef TARGET_NR_lchown32
10512 case TARGET_NR_lchown32:
10513 if (!(p = lock_user_string(arg1)))
10514 return -TARGET_EFAULT;
10515 ret = get_errno(lchown(p, arg2, arg3));
10516 unlock_user(p, arg1, 0);
10517 return ret;
10518 #endif
10519 #ifdef TARGET_NR_getuid32
10520 case TARGET_NR_getuid32:
10521 return get_errno(getuid());
10522 #endif
10524 #if defined(TARGET_NR_getxuid) && defined(TARGET_ALPHA)
10525 /* Alpha specific */
10526 case TARGET_NR_getxuid:
10528 uid_t euid;
10529 euid=geteuid();
10530 ((CPUAlphaState *)cpu_env)->ir[IR_A4]=euid;
10532 return get_errno(getuid());
10533 #endif
10534 #if defined(TARGET_NR_getxgid) && defined(TARGET_ALPHA)
10535 /* Alpha specific */
10536 case TARGET_NR_getxgid:
10538 uid_t egid;
10539 egid=getegid();
10540 ((CPUAlphaState *)cpu_env)->ir[IR_A4]=egid;
10542 return get_errno(getgid());
10543 #endif
10544 #if defined(TARGET_NR_osf_getsysinfo) && defined(TARGET_ALPHA)
10545 /* Alpha specific */
10546 case TARGET_NR_osf_getsysinfo:
10547 ret = -TARGET_EOPNOTSUPP;
10548 switch (arg1) {
10549 case TARGET_GSI_IEEE_FP_CONTROL:
10551 uint64_t fpcr = cpu_alpha_load_fpcr(cpu_env);
10552 uint64_t swcr = ((CPUAlphaState *)cpu_env)->swcr;
10554 swcr &= ~SWCR_STATUS_MASK;
10555 swcr |= (fpcr >> 35) & SWCR_STATUS_MASK;
10557 if (put_user_u64 (swcr, arg2))
10558 return -TARGET_EFAULT;
10559 ret = 0;
10561 break;
10563 /* case GSI_IEEE_STATE_AT_SIGNAL:
10564 -- Not implemented in linux kernel.
10565 case GSI_UACPROC:
10566 -- Retrieves current unaligned access state; not much used.
10567 case GSI_PROC_TYPE:
10568 -- Retrieves implver information; surely not used.
10569 case GSI_GET_HWRPB:
10570 -- Grabs a copy of the HWRPB; surely not used.
10573 return ret;
10574 #endif
10575 #if defined(TARGET_NR_osf_setsysinfo) && defined(TARGET_ALPHA)
10576 /* Alpha specific */
10577 case TARGET_NR_osf_setsysinfo:
10578 ret = -TARGET_EOPNOTSUPP;
10579 switch (arg1) {
10580 case TARGET_SSI_IEEE_FP_CONTROL:
10582 uint64_t swcr, fpcr;
10584 if (get_user_u64 (swcr, arg2)) {
10585 return -TARGET_EFAULT;
10589 * The kernel calls swcr_update_status to update the
10590 * status bits from the fpcr at every point that it
10591 * could be queried. Therefore, we store the status
10592 * bits only in FPCR.
10594 ((CPUAlphaState *)cpu_env)->swcr
10595 = swcr & (SWCR_TRAP_ENABLE_MASK | SWCR_MAP_MASK);
10597 fpcr = cpu_alpha_load_fpcr(cpu_env);
10598 fpcr &= ((uint64_t)FPCR_DYN_MASK << 32);
10599 fpcr |= alpha_ieee_swcr_to_fpcr(swcr);
10600 cpu_alpha_store_fpcr(cpu_env, fpcr);
10601 ret = 0;
10603 break;
10605 case TARGET_SSI_IEEE_RAISE_EXCEPTION:
10607 uint64_t exc, fpcr, fex;
10609 if (get_user_u64(exc, arg2)) {
10610 return -TARGET_EFAULT;
10612 exc &= SWCR_STATUS_MASK;
10613 fpcr = cpu_alpha_load_fpcr(cpu_env);
10615 /* Old exceptions are not signaled. */
10616 fex = alpha_ieee_fpcr_to_swcr(fpcr);
10617 fex = exc & ~fex;
10618 fex >>= SWCR_STATUS_TO_EXCSUM_SHIFT;
10619 fex &= ((CPUArchState *)cpu_env)->swcr;
10621 /* Update the hardware fpcr. */
10622 fpcr |= alpha_ieee_swcr_to_fpcr(exc);
10623 cpu_alpha_store_fpcr(cpu_env, fpcr);
10625 if (fex) {
10626 int si_code = TARGET_FPE_FLTUNK;
10627 target_siginfo_t info;
10629 if (fex & SWCR_TRAP_ENABLE_DNO) {
10630 si_code = TARGET_FPE_FLTUND;
10632 if (fex & SWCR_TRAP_ENABLE_INE) {
10633 si_code = TARGET_FPE_FLTRES;
10635 if (fex & SWCR_TRAP_ENABLE_UNF) {
10636 si_code = TARGET_FPE_FLTUND;
10638 if (fex & SWCR_TRAP_ENABLE_OVF) {
10639 si_code = TARGET_FPE_FLTOVF;
10641 if (fex & SWCR_TRAP_ENABLE_DZE) {
10642 si_code = TARGET_FPE_FLTDIV;
10644 if (fex & SWCR_TRAP_ENABLE_INV) {
10645 si_code = TARGET_FPE_FLTINV;
10648 info.si_signo = SIGFPE;
10649 info.si_errno = 0;
10650 info.si_code = si_code;
10651 info._sifields._sigfault._addr
10652 = ((CPUArchState *)cpu_env)->pc;
10653 queue_signal((CPUArchState *)cpu_env, info.si_signo,
10654 QEMU_SI_FAULT, &info);
10656 ret = 0;
10658 break;
10660 /* case SSI_NVPAIRS:
10661 -- Used with SSIN_UACPROC to enable unaligned accesses.
10662 case SSI_IEEE_STATE_AT_SIGNAL:
10663 case SSI_IEEE_IGNORE_STATE_AT_SIGNAL:
10664 -- Not implemented in linux kernel
10667 return ret;
10668 #endif
10669 #ifdef TARGET_NR_osf_sigprocmask
10670 /* Alpha specific. */
10671 case TARGET_NR_osf_sigprocmask:
10673 abi_ulong mask;
10674 int how;
10675 sigset_t set, oldset;
10677 switch(arg1) {
10678 case TARGET_SIG_BLOCK:
10679 how = SIG_BLOCK;
10680 break;
10681 case TARGET_SIG_UNBLOCK:
10682 how = SIG_UNBLOCK;
10683 break;
10684 case TARGET_SIG_SETMASK:
10685 how = SIG_SETMASK;
10686 break;
10687 default:
10688 return -TARGET_EINVAL;
10690 mask = arg2;
10691 target_to_host_old_sigset(&set, &mask);
10692 ret = do_sigprocmask(how, &set, &oldset);
10693 if (!ret) {
10694 host_to_target_old_sigset(&mask, &oldset);
10695 ret = mask;
10698 return ret;
10699 #endif
10701 #ifdef TARGET_NR_getgid32
10702 case TARGET_NR_getgid32:
10703 return get_errno(getgid());
10704 #endif
10705 #ifdef TARGET_NR_geteuid32
10706 case TARGET_NR_geteuid32:
10707 return get_errno(geteuid());
10708 #endif
10709 #ifdef TARGET_NR_getegid32
10710 case TARGET_NR_getegid32:
10711 return get_errno(getegid());
10712 #endif
10713 #ifdef TARGET_NR_setreuid32
10714 case TARGET_NR_setreuid32:
10715 return get_errno(setreuid(arg1, arg2));
10716 #endif
10717 #ifdef TARGET_NR_setregid32
10718 case TARGET_NR_setregid32:
10719 return get_errno(setregid(arg1, arg2));
10720 #endif
10721 #ifdef TARGET_NR_getgroups32
10722 case TARGET_NR_getgroups32:
10724 int gidsetsize = arg1;
10725 uint32_t *target_grouplist;
10726 gid_t *grouplist;
10727 int i;
10729 grouplist = alloca(gidsetsize * sizeof(gid_t));
10730 ret = get_errno(getgroups(gidsetsize, grouplist));
10731 if (gidsetsize == 0)
10732 return ret;
10733 if (!is_error(ret)) {
10734 target_grouplist = lock_user(VERIFY_WRITE, arg2, gidsetsize * 4, 0);
10735 if (!target_grouplist) {
10736 return -TARGET_EFAULT;
10738 for(i = 0;i < ret; i++)
10739 target_grouplist[i] = tswap32(grouplist[i]);
10740 unlock_user(target_grouplist, arg2, gidsetsize * 4);
10743 return ret;
10744 #endif
10745 #ifdef TARGET_NR_setgroups32
10746 case TARGET_NR_setgroups32:
10748 int gidsetsize = arg1;
10749 uint32_t *target_grouplist;
10750 gid_t *grouplist;
10751 int i;
10753 grouplist = alloca(gidsetsize * sizeof(gid_t));
10754 target_grouplist = lock_user(VERIFY_READ, arg2, gidsetsize * 4, 1);
10755 if (!target_grouplist) {
10756 return -TARGET_EFAULT;
10758 for(i = 0;i < gidsetsize; i++)
10759 grouplist[i] = tswap32(target_grouplist[i]);
10760 unlock_user(target_grouplist, arg2, 0);
10761 return get_errno(setgroups(gidsetsize, grouplist));
10763 #endif
10764 #ifdef TARGET_NR_fchown32
10765 case TARGET_NR_fchown32:
10766 return get_errno(fchown(arg1, arg2, arg3));
10767 #endif
10768 #ifdef TARGET_NR_setresuid32
10769 case TARGET_NR_setresuid32:
10770 return get_errno(sys_setresuid(arg1, arg2, arg3));
10771 #endif
10772 #ifdef TARGET_NR_getresuid32
10773 case TARGET_NR_getresuid32:
10775 uid_t ruid, euid, suid;
10776 ret = get_errno(getresuid(&ruid, &euid, &suid));
10777 if (!is_error(ret)) {
10778 if (put_user_u32(ruid, arg1)
10779 || put_user_u32(euid, arg2)
10780 || put_user_u32(suid, arg3))
10781 return -TARGET_EFAULT;
10784 return ret;
10785 #endif
10786 #ifdef TARGET_NR_setresgid32
10787 case TARGET_NR_setresgid32:
10788 return get_errno(sys_setresgid(arg1, arg2, arg3));
10789 #endif
10790 #ifdef TARGET_NR_getresgid32
10791 case TARGET_NR_getresgid32:
10793 gid_t rgid, egid, sgid;
10794 ret = get_errno(getresgid(&rgid, &egid, &sgid));
10795 if (!is_error(ret)) {
10796 if (put_user_u32(rgid, arg1)
10797 || put_user_u32(egid, arg2)
10798 || put_user_u32(sgid, arg3))
10799 return -TARGET_EFAULT;
10802 return ret;
10803 #endif
10804 #ifdef TARGET_NR_chown32
10805 case TARGET_NR_chown32:
10806 if (!(p = lock_user_string(arg1)))
10807 return -TARGET_EFAULT;
10808 ret = get_errno(chown(p, arg2, arg3));
10809 unlock_user(p, arg1, 0);
10810 return ret;
10811 #endif
10812 #ifdef TARGET_NR_setuid32
10813 case TARGET_NR_setuid32:
10814 return get_errno(sys_setuid(arg1));
10815 #endif
10816 #ifdef TARGET_NR_setgid32
10817 case TARGET_NR_setgid32:
10818 return get_errno(sys_setgid(arg1));
10819 #endif
10820 #ifdef TARGET_NR_setfsuid32
10821 case TARGET_NR_setfsuid32:
10822 return get_errno(setfsuid(arg1));
10823 #endif
10824 #ifdef TARGET_NR_setfsgid32
10825 case TARGET_NR_setfsgid32:
10826 return get_errno(setfsgid(arg1));
10827 #endif
10828 #ifdef TARGET_NR_mincore
10829 case TARGET_NR_mincore:
10831 void *a = lock_user(VERIFY_READ, arg1, arg2, 0);
10832 if (!a) {
10833 return -TARGET_ENOMEM;
10835 p = lock_user_string(arg3);
10836 if (!p) {
10837 ret = -TARGET_EFAULT;
10838 } else {
10839 ret = get_errno(mincore(a, arg2, p));
10840 unlock_user(p, arg3, ret);
10842 unlock_user(a, arg1, 0);
10844 return ret;
10845 #endif
10846 #ifdef TARGET_NR_arm_fadvise64_64
10847 case TARGET_NR_arm_fadvise64_64:
10848 /* arm_fadvise64_64 looks like fadvise64_64 but
10849 * with different argument order: fd, advice, offset, len
10850 * rather than the usual fd, offset, len, advice.
10851 * Note that offset and len are both 64-bit so appear as
10852 * pairs of 32-bit registers.
10854 ret = posix_fadvise(arg1, target_offset64(arg3, arg4),
10855 target_offset64(arg5, arg6), arg2);
10856 return -host_to_target_errno(ret);
10857 #endif
10859 #if TARGET_ABI_BITS == 32
10861 #ifdef TARGET_NR_fadvise64_64
10862 case TARGET_NR_fadvise64_64:
10863 #if defined(TARGET_PPC) || defined(TARGET_XTENSA)
10864 /* 6 args: fd, advice, offset (high, low), len (high, low) */
10865 ret = arg2;
10866 arg2 = arg3;
10867 arg3 = arg4;
10868 arg4 = arg5;
10869 arg5 = arg6;
10870 arg6 = ret;
10871 #else
10872 /* 6 args: fd, offset (high, low), len (high, low), advice */
10873 if (regpairs_aligned(cpu_env, num)) {
10874 /* offset is in (3,4), len in (5,6) and advice in 7 */
10875 arg2 = arg3;
10876 arg3 = arg4;
10877 arg4 = arg5;
10878 arg5 = arg6;
10879 arg6 = arg7;
10881 #endif
10882 ret = posix_fadvise(arg1, target_offset64(arg2, arg3),
10883 target_offset64(arg4, arg5), arg6);
10884 return -host_to_target_errno(ret);
10885 #endif
10887 #ifdef TARGET_NR_fadvise64
10888 case TARGET_NR_fadvise64:
10889 /* 5 args: fd, offset (high, low), len, advice */
10890 if (regpairs_aligned(cpu_env, num)) {
10891 /* offset is in (3,4), len in 5 and advice in 6 */
10892 arg2 = arg3;
10893 arg3 = arg4;
10894 arg4 = arg5;
10895 arg5 = arg6;
10897 ret = posix_fadvise(arg1, target_offset64(arg2, arg3), arg4, arg5);
10898 return -host_to_target_errno(ret);
10899 #endif
10901 #else /* not a 32-bit ABI */
10902 #if defined(TARGET_NR_fadvise64_64) || defined(TARGET_NR_fadvise64)
10903 #ifdef TARGET_NR_fadvise64_64
10904 case TARGET_NR_fadvise64_64:
10905 #endif
10906 #ifdef TARGET_NR_fadvise64
10907 case TARGET_NR_fadvise64:
10908 #endif
10909 #ifdef TARGET_S390X
10910 switch (arg4) {
10911 case 4: arg4 = POSIX_FADV_NOREUSE + 1; break; /* make sure it's an invalid value */
10912 case 5: arg4 = POSIX_FADV_NOREUSE + 2; break; /* ditto */
10913 case 6: arg4 = POSIX_FADV_DONTNEED; break;
10914 case 7: arg4 = POSIX_FADV_NOREUSE; break;
10915 default: break;
10917 #endif
10918 return -host_to_target_errno(posix_fadvise(arg1, arg2, arg3, arg4));
10919 #endif
10920 #endif /* end of 64-bit ABI fadvise handling */
10922 #ifdef TARGET_NR_madvise
10923 case TARGET_NR_madvise:
10924 /* A straight passthrough may not be safe because qemu sometimes
10925 turns private file-backed mappings into anonymous mappings.
10926 This will break MADV_DONTNEED.
10927 This is a hint, so ignoring and returning success is ok. */
10928 return 0;
10929 #endif
10930 #if TARGET_ABI_BITS == 32
10931 case TARGET_NR_fcntl64:
10933 int cmd;
10934 struct flock64 fl;
10935 from_flock64_fn *copyfrom = copy_from_user_flock64;
10936 to_flock64_fn *copyto = copy_to_user_flock64;
10938 #ifdef TARGET_ARM
10939 if (!((CPUARMState *)cpu_env)->eabi) {
10940 copyfrom = copy_from_user_oabi_flock64;
10941 copyto = copy_to_user_oabi_flock64;
10943 #endif
10945 cmd = target_to_host_fcntl_cmd(arg2);
10946 if (cmd == -TARGET_EINVAL) {
10947 return cmd;
10950 switch(arg2) {
10951 case TARGET_F_GETLK64:
10952 ret = copyfrom(&fl, arg3);
10953 if (ret) {
10954 break;
10956 ret = get_errno(safe_fcntl(arg1, cmd, &fl));
10957 if (ret == 0) {
10958 ret = copyto(arg3, &fl);
10960 break;
10962 case TARGET_F_SETLK64:
10963 case TARGET_F_SETLKW64:
10964 ret = copyfrom(&fl, arg3);
10965 if (ret) {
10966 break;
10968 ret = get_errno(safe_fcntl(arg1, cmd, &fl));
10969 break;
10970 default:
10971 ret = do_fcntl(arg1, arg2, arg3);
10972 break;
10974 return ret;
10976 #endif
10977 #ifdef TARGET_NR_cacheflush
10978 case TARGET_NR_cacheflush:
10979 /* self-modifying code is handled automatically, so nothing needed */
10980 return 0;
10981 #endif
10982 #ifdef TARGET_NR_getpagesize
10983 case TARGET_NR_getpagesize:
10984 return TARGET_PAGE_SIZE;
10985 #endif
10986 case TARGET_NR_gettid:
10987 return get_errno(sys_gettid());
10988 #ifdef TARGET_NR_readahead
10989 case TARGET_NR_readahead:
10990 #if TARGET_ABI_BITS == 32
10991 if (regpairs_aligned(cpu_env, num)) {
10992 arg2 = arg3;
10993 arg3 = arg4;
10994 arg4 = arg5;
10996 ret = get_errno(readahead(arg1, target_offset64(arg2, arg3) , arg4));
10997 #else
10998 ret = get_errno(readahead(arg1, arg2, arg3));
10999 #endif
11000 return ret;
11001 #endif
11002 #ifdef CONFIG_ATTR
11003 #ifdef TARGET_NR_setxattr
11004 case TARGET_NR_listxattr:
11005 case TARGET_NR_llistxattr:
11007 void *p, *b = 0;
11008 if (arg2) {
11009 b = lock_user(VERIFY_WRITE, arg2, arg3, 0);
11010 if (!b) {
11011 return -TARGET_EFAULT;
11014 p = lock_user_string(arg1);
11015 if (p) {
11016 if (num == TARGET_NR_listxattr) {
11017 ret = get_errno(listxattr(p, b, arg3));
11018 } else {
11019 ret = get_errno(llistxattr(p, b, arg3));
11021 } else {
11022 ret = -TARGET_EFAULT;
11024 unlock_user(p, arg1, 0);
11025 unlock_user(b, arg2, arg3);
11026 return ret;
11028 case TARGET_NR_flistxattr:
11030 void *b = 0;
11031 if (arg2) {
11032 b = lock_user(VERIFY_WRITE, arg2, arg3, 0);
11033 if (!b) {
11034 return -TARGET_EFAULT;
11037 ret = get_errno(flistxattr(arg1, b, arg3));
11038 unlock_user(b, arg2, arg3);
11039 return ret;
11041 case TARGET_NR_setxattr:
11042 case TARGET_NR_lsetxattr:
11044 void *p, *n, *v = 0;
11045 if (arg3) {
11046 v = lock_user(VERIFY_READ, arg3, arg4, 1);
11047 if (!v) {
11048 return -TARGET_EFAULT;
11051 p = lock_user_string(arg1);
11052 n = lock_user_string(arg2);
11053 if (p && n) {
11054 if (num == TARGET_NR_setxattr) {
11055 ret = get_errno(setxattr(p, n, v, arg4, arg5));
11056 } else {
11057 ret = get_errno(lsetxattr(p, n, v, arg4, arg5));
11059 } else {
11060 ret = -TARGET_EFAULT;
11062 unlock_user(p, arg1, 0);
11063 unlock_user(n, arg2, 0);
11064 unlock_user(v, arg3, 0);
11066 return ret;
11067 case TARGET_NR_fsetxattr:
11069 void *n, *v = 0;
11070 if (arg3) {
11071 v = lock_user(VERIFY_READ, arg3, arg4, 1);
11072 if (!v) {
11073 return -TARGET_EFAULT;
11076 n = lock_user_string(arg2);
11077 if (n) {
11078 ret = get_errno(fsetxattr(arg1, n, v, arg4, arg5));
11079 } else {
11080 ret = -TARGET_EFAULT;
11082 unlock_user(n, arg2, 0);
11083 unlock_user(v, arg3, 0);
11085 return ret;
11086 case TARGET_NR_getxattr:
11087 case TARGET_NR_lgetxattr:
11089 void *p, *n, *v = 0;
11090 if (arg3) {
11091 v = lock_user(VERIFY_WRITE, arg3, arg4, 0);
11092 if (!v) {
11093 return -TARGET_EFAULT;
11096 p = lock_user_string(arg1);
11097 n = lock_user_string(arg2);
11098 if (p && n) {
11099 if (num == TARGET_NR_getxattr) {
11100 ret = get_errno(getxattr(p, n, v, arg4));
11101 } else {
11102 ret = get_errno(lgetxattr(p, n, v, arg4));
11104 } else {
11105 ret = -TARGET_EFAULT;
11107 unlock_user(p, arg1, 0);
11108 unlock_user(n, arg2, 0);
11109 unlock_user(v, arg3, arg4);
11111 return ret;
11112 case TARGET_NR_fgetxattr:
11114 void *n, *v = 0;
11115 if (arg3) {
11116 v = lock_user(VERIFY_WRITE, arg3, arg4, 0);
11117 if (!v) {
11118 return -TARGET_EFAULT;
11121 n = lock_user_string(arg2);
11122 if (n) {
11123 ret = get_errno(fgetxattr(arg1, n, v, arg4));
11124 } else {
11125 ret = -TARGET_EFAULT;
11127 unlock_user(n, arg2, 0);
11128 unlock_user(v, arg3, arg4);
11130 return ret;
11131 case TARGET_NR_removexattr:
11132 case TARGET_NR_lremovexattr:
11134 void *p, *n;
11135 p = lock_user_string(arg1);
11136 n = lock_user_string(arg2);
11137 if (p && n) {
11138 if (num == TARGET_NR_removexattr) {
11139 ret = get_errno(removexattr(p, n));
11140 } else {
11141 ret = get_errno(lremovexattr(p, n));
11143 } else {
11144 ret = -TARGET_EFAULT;
11146 unlock_user(p, arg1, 0);
11147 unlock_user(n, arg2, 0);
11149 return ret;
11150 case TARGET_NR_fremovexattr:
11152 void *n;
11153 n = lock_user_string(arg2);
11154 if (n) {
11155 ret = get_errno(fremovexattr(arg1, n));
11156 } else {
11157 ret = -TARGET_EFAULT;
11159 unlock_user(n, arg2, 0);
11161 return ret;
11162 #endif
11163 #endif /* CONFIG_ATTR */
11164 #ifdef TARGET_NR_set_thread_area
11165 case TARGET_NR_set_thread_area:
11166 #if defined(TARGET_MIPS)
11167 ((CPUMIPSState *) cpu_env)->active_tc.CP0_UserLocal = arg1;
11168 return 0;
11169 #elif defined(TARGET_CRIS)
11170 if (arg1 & 0xff)
11171 ret = -TARGET_EINVAL;
11172 else {
11173 ((CPUCRISState *) cpu_env)->pregs[PR_PID] = arg1;
11174 ret = 0;
11176 return ret;
11177 #elif defined(TARGET_I386) && defined(TARGET_ABI32)
11178 return do_set_thread_area(cpu_env, arg1);
11179 #elif defined(TARGET_M68K)
11181 TaskState *ts = cpu->opaque;
11182 ts->tp_value = arg1;
11183 return 0;
11185 #else
11186 return -TARGET_ENOSYS;
11187 #endif
11188 #endif
11189 #ifdef TARGET_NR_get_thread_area
11190 case TARGET_NR_get_thread_area:
11191 #if defined(TARGET_I386) && defined(TARGET_ABI32)
11192 return do_get_thread_area(cpu_env, arg1);
11193 #elif defined(TARGET_M68K)
11195 TaskState *ts = cpu->opaque;
11196 return ts->tp_value;
11198 #else
11199 return -TARGET_ENOSYS;
11200 #endif
11201 #endif
11202 #ifdef TARGET_NR_getdomainname
11203 case TARGET_NR_getdomainname:
11204 return -TARGET_ENOSYS;
11205 #endif
11207 #ifdef TARGET_NR_clock_settime
11208 case TARGET_NR_clock_settime:
11210 struct timespec ts;
11212 ret = target_to_host_timespec(&ts, arg2);
11213 if (!is_error(ret)) {
11214 ret = get_errno(clock_settime(arg1, &ts));
11216 return ret;
11218 #endif
11219 #ifdef TARGET_NR_clock_gettime
11220 case TARGET_NR_clock_gettime:
11222 struct timespec ts;
11223 ret = get_errno(clock_gettime(arg1, &ts));
11224 if (!is_error(ret)) {
11225 ret = host_to_target_timespec(arg2, &ts);
11227 return ret;
11229 #endif
11230 #ifdef TARGET_NR_clock_getres
11231 case TARGET_NR_clock_getres:
11233 struct timespec ts;
11234 ret = get_errno(clock_getres(arg1, &ts));
11235 if (!is_error(ret)) {
11236 host_to_target_timespec(arg2, &ts);
11238 return ret;
11240 #endif
11241 #ifdef TARGET_NR_clock_nanosleep
11242 case TARGET_NR_clock_nanosleep:
11244 struct timespec ts;
11245 target_to_host_timespec(&ts, arg3);
11246 ret = get_errno(safe_clock_nanosleep(arg1, arg2,
11247 &ts, arg4 ? &ts : NULL));
11248 if (arg4)
11249 host_to_target_timespec(arg4, &ts);
11251 #if defined(TARGET_PPC)
11252 /* clock_nanosleep is odd in that it returns positive errno values.
11253 * On PPC, CR0 bit 3 should be set in such a situation. */
11254 if (ret && ret != -TARGET_ERESTARTSYS) {
11255 ((CPUPPCState *)cpu_env)->crf[0] |= 1;
11257 #endif
11258 return ret;
11260 #endif
11262 #if defined(TARGET_NR_set_tid_address) && defined(__NR_set_tid_address)
11263 case TARGET_NR_set_tid_address:
11264 return get_errno(set_tid_address((int *)g2h(arg1)));
11265 #endif
11267 case TARGET_NR_tkill:
11268 return get_errno(safe_tkill((int)arg1, target_to_host_signal(arg2)));
11270 case TARGET_NR_tgkill:
11271 return get_errno(safe_tgkill((int)arg1, (int)arg2,
11272 target_to_host_signal(arg3)));
11274 #ifdef TARGET_NR_set_robust_list
11275 case TARGET_NR_set_robust_list:
11276 case TARGET_NR_get_robust_list:
11277 /* The ABI for supporting robust futexes has userspace pass
11278 * the kernel a pointer to a linked list which is updated by
11279 * userspace after the syscall; the list is walked by the kernel
11280 * when the thread exits. Since the linked list in QEMU guest
11281 * memory isn't a valid linked list for the host and we have
11282 * no way to reliably intercept the thread-death event, we can't
11283 * support these. Silently return ENOSYS so that guest userspace
11284 * falls back to a non-robust futex implementation (which should
11285 * be OK except in the corner case of the guest crashing while
11286 * holding a mutex that is shared with another process via
11287 * shared memory).
11289 return -TARGET_ENOSYS;
11290 #endif
11292 #if defined(TARGET_NR_utimensat)
11293 case TARGET_NR_utimensat:
11295 struct timespec *tsp, ts[2];
11296 if (!arg3) {
11297 tsp = NULL;
11298 } else {
11299 target_to_host_timespec(ts, arg3);
11300 target_to_host_timespec(ts+1, arg3+sizeof(struct target_timespec));
11301 tsp = ts;
11303 if (!arg2)
11304 ret = get_errno(sys_utimensat(arg1, NULL, tsp, arg4));
11305 else {
11306 if (!(p = lock_user_string(arg2))) {
11307 return -TARGET_EFAULT;
11309 ret = get_errno(sys_utimensat(arg1, path(p), tsp, arg4));
11310 unlock_user(p, arg2, 0);
11313 return ret;
11314 #endif
11315 case TARGET_NR_futex:
11316 return do_futex(arg1, arg2, arg3, arg4, arg5, arg6);
11317 #if defined(TARGET_NR_inotify_init) && defined(__NR_inotify_init)
11318 case TARGET_NR_inotify_init:
11319 ret = get_errno(sys_inotify_init());
11320 if (ret >= 0) {
11321 fd_trans_register(ret, &target_inotify_trans);
11323 return ret;
11324 #endif
11325 #ifdef CONFIG_INOTIFY1
11326 #if defined(TARGET_NR_inotify_init1) && defined(__NR_inotify_init1)
11327 case TARGET_NR_inotify_init1:
11328 ret = get_errno(sys_inotify_init1(target_to_host_bitmask(arg1,
11329 fcntl_flags_tbl)));
11330 if (ret >= 0) {
11331 fd_trans_register(ret, &target_inotify_trans);
11333 return ret;
11334 #endif
11335 #endif
11336 #if defined(TARGET_NR_inotify_add_watch) && defined(__NR_inotify_add_watch)
11337 case TARGET_NR_inotify_add_watch:
11338 p = lock_user_string(arg2);
11339 ret = get_errno(sys_inotify_add_watch(arg1, path(p), arg3));
11340 unlock_user(p, arg2, 0);
11341 return ret;
11342 #endif
11343 #if defined(TARGET_NR_inotify_rm_watch) && defined(__NR_inotify_rm_watch)
11344 case TARGET_NR_inotify_rm_watch:
11345 return get_errno(sys_inotify_rm_watch(arg1, arg2));
11346 #endif
11348 #if defined(TARGET_NR_mq_open) && defined(__NR_mq_open)
11349 case TARGET_NR_mq_open:
11351 struct mq_attr posix_mq_attr;
11352 struct mq_attr *pposix_mq_attr;
11353 int host_flags;
11355 host_flags = target_to_host_bitmask(arg2, fcntl_flags_tbl);
11356 pposix_mq_attr = NULL;
11357 if (arg4) {
11358 if (copy_from_user_mq_attr(&posix_mq_attr, arg4) != 0) {
11359 return -TARGET_EFAULT;
11361 pposix_mq_attr = &posix_mq_attr;
11363 p = lock_user_string(arg1 - 1);
11364 if (!p) {
11365 return -TARGET_EFAULT;
11367 ret = get_errno(mq_open(p, host_flags, arg3, pposix_mq_attr));
11368 unlock_user (p, arg1, 0);
11370 return ret;
11372 case TARGET_NR_mq_unlink:
11373 p = lock_user_string(arg1 - 1);
11374 if (!p) {
11375 return -TARGET_EFAULT;
11377 ret = get_errno(mq_unlink(p));
11378 unlock_user (p, arg1, 0);
11379 return ret;
11381 case TARGET_NR_mq_timedsend:
11383 struct timespec ts;
11385 p = lock_user (VERIFY_READ, arg2, arg3, 1);
11386 if (arg5 != 0) {
11387 target_to_host_timespec(&ts, arg5);
11388 ret = get_errno(safe_mq_timedsend(arg1, p, arg3, arg4, &ts));
11389 host_to_target_timespec(arg5, &ts);
11390 } else {
11391 ret = get_errno(safe_mq_timedsend(arg1, p, arg3, arg4, NULL));
11393 unlock_user (p, arg2, arg3);
11395 return ret;
11397 case TARGET_NR_mq_timedreceive:
11399 struct timespec ts;
11400 unsigned int prio;
11402 p = lock_user (VERIFY_READ, arg2, arg3, 1);
11403 if (arg5 != 0) {
11404 target_to_host_timespec(&ts, arg5);
11405 ret = get_errno(safe_mq_timedreceive(arg1, p, arg3,
11406 &prio, &ts));
11407 host_to_target_timespec(arg5, &ts);
11408 } else {
11409 ret = get_errno(safe_mq_timedreceive(arg1, p, arg3,
11410 &prio, NULL));
11412 unlock_user (p, arg2, arg3);
11413 if (arg4 != 0)
11414 put_user_u32(prio, arg4);
11416 return ret;
11418 /* Not implemented for now... */
11419 /* case TARGET_NR_mq_notify: */
11420 /* break; */
11422 case TARGET_NR_mq_getsetattr:
11424 struct mq_attr posix_mq_attr_in, posix_mq_attr_out;
11425 ret = 0;
11426 if (arg2 != 0) {
11427 copy_from_user_mq_attr(&posix_mq_attr_in, arg2);
11428 ret = get_errno(mq_setattr(arg1, &posix_mq_attr_in,
11429 &posix_mq_attr_out));
11430 } else if (arg3 != 0) {
11431 ret = get_errno(mq_getattr(arg1, &posix_mq_attr_out));
11433 if (ret == 0 && arg3 != 0) {
11434 copy_to_user_mq_attr(arg3, &posix_mq_attr_out);
11437 return ret;
11438 #endif
11440 #ifdef CONFIG_SPLICE
11441 #ifdef TARGET_NR_tee
11442 case TARGET_NR_tee:
11444 ret = get_errno(tee(arg1,arg2,arg3,arg4));
11446 return ret;
11447 #endif
11448 #ifdef TARGET_NR_splice
11449 case TARGET_NR_splice:
11451 loff_t loff_in, loff_out;
11452 loff_t *ploff_in = NULL, *ploff_out = NULL;
11453 if (arg2) {
11454 if (get_user_u64(loff_in, arg2)) {
11455 return -TARGET_EFAULT;
11457 ploff_in = &loff_in;
11459 if (arg4) {
11460 if (get_user_u64(loff_out, arg4)) {
11461 return -TARGET_EFAULT;
11463 ploff_out = &loff_out;
11465 ret = get_errno(splice(arg1, ploff_in, arg3, ploff_out, arg5, arg6));
11466 if (arg2) {
11467 if (put_user_u64(loff_in, arg2)) {
11468 return -TARGET_EFAULT;
11471 if (arg4) {
11472 if (put_user_u64(loff_out, arg4)) {
11473 return -TARGET_EFAULT;
11477 return ret;
11478 #endif
11479 #ifdef TARGET_NR_vmsplice
11480 case TARGET_NR_vmsplice:
11482 struct iovec *vec = lock_iovec(VERIFY_READ, arg2, arg3, 1);
11483 if (vec != NULL) {
11484 ret = get_errno(vmsplice(arg1, vec, arg3, arg4));
11485 unlock_iovec(vec, arg2, arg3, 0);
11486 } else {
11487 ret = -host_to_target_errno(errno);
11490 return ret;
11491 #endif
11492 #endif /* CONFIG_SPLICE */
11493 #ifdef CONFIG_EVENTFD
11494 #if defined(TARGET_NR_eventfd)
11495 case TARGET_NR_eventfd:
11496 ret = get_errno(eventfd(arg1, 0));
11497 if (ret >= 0) {
11498 fd_trans_register(ret, &target_eventfd_trans);
11500 return ret;
11501 #endif
11502 #if defined(TARGET_NR_eventfd2)
11503 case TARGET_NR_eventfd2:
11505 int host_flags = arg2 & (~(TARGET_O_NONBLOCK | TARGET_O_CLOEXEC));
11506 if (arg2 & TARGET_O_NONBLOCK) {
11507 host_flags |= O_NONBLOCK;
11509 if (arg2 & TARGET_O_CLOEXEC) {
11510 host_flags |= O_CLOEXEC;
11512 ret = get_errno(eventfd(arg1, host_flags));
11513 if (ret >= 0) {
11514 fd_trans_register(ret, &target_eventfd_trans);
11516 return ret;
11518 #endif
11519 #endif /* CONFIG_EVENTFD */
11520 #if defined(CONFIG_FALLOCATE) && defined(TARGET_NR_fallocate)
11521 case TARGET_NR_fallocate:
11522 #if TARGET_ABI_BITS == 32
11523 ret = get_errno(fallocate(arg1, arg2, target_offset64(arg3, arg4),
11524 target_offset64(arg5, arg6)));
11525 #else
11526 ret = get_errno(fallocate(arg1, arg2, arg3, arg4));
11527 #endif
11528 return ret;
11529 #endif
11530 #if defined(CONFIG_SYNC_FILE_RANGE)
11531 #if defined(TARGET_NR_sync_file_range)
11532 case TARGET_NR_sync_file_range:
11533 #if TARGET_ABI_BITS == 32
11534 #if defined(TARGET_MIPS)
11535 ret = get_errno(sync_file_range(arg1, target_offset64(arg3, arg4),
11536 target_offset64(arg5, arg6), arg7));
11537 #else
11538 ret = get_errno(sync_file_range(arg1, target_offset64(arg2, arg3),
11539 target_offset64(arg4, arg5), arg6));
11540 #endif /* !TARGET_MIPS */
11541 #else
11542 ret = get_errno(sync_file_range(arg1, arg2, arg3, arg4));
11543 #endif
11544 return ret;
11545 #endif
11546 #if defined(TARGET_NR_sync_file_range2)
11547 case TARGET_NR_sync_file_range2:
11548 /* This is like sync_file_range but the arguments are reordered */
11549 #if TARGET_ABI_BITS == 32
11550 ret = get_errno(sync_file_range(arg1, target_offset64(arg3, arg4),
11551 target_offset64(arg5, arg6), arg2));
11552 #else
11553 ret = get_errno(sync_file_range(arg1, arg3, arg4, arg2));
11554 #endif
11555 return ret;
11556 #endif
11557 #endif
11558 #if defined(TARGET_NR_signalfd4)
11559 case TARGET_NR_signalfd4:
11560 return do_signalfd4(arg1, arg2, arg4);
11561 #endif
11562 #if defined(TARGET_NR_signalfd)
11563 case TARGET_NR_signalfd:
11564 return do_signalfd4(arg1, arg2, 0);
11565 #endif
11566 #if defined(CONFIG_EPOLL)
11567 #if defined(TARGET_NR_epoll_create)
11568 case TARGET_NR_epoll_create:
11569 return get_errno(epoll_create(arg1));
11570 #endif
11571 #if defined(TARGET_NR_epoll_create1) && defined(CONFIG_EPOLL_CREATE1)
11572 case TARGET_NR_epoll_create1:
11573 return get_errno(epoll_create1(arg1));
11574 #endif
11575 #if defined(TARGET_NR_epoll_ctl)
11576 case TARGET_NR_epoll_ctl:
11578 struct epoll_event ep;
11579 struct epoll_event *epp = 0;
11580 if (arg4) {
11581 struct target_epoll_event *target_ep;
11582 if (!lock_user_struct(VERIFY_READ, target_ep, arg4, 1)) {
11583 return -TARGET_EFAULT;
11585 ep.events = tswap32(target_ep->events);
11586 /* The epoll_data_t union is just opaque data to the kernel,
11587 * so we transfer all 64 bits across and need not worry what
11588 * actual data type it is.
11590 ep.data.u64 = tswap64(target_ep->data.u64);
11591 unlock_user_struct(target_ep, arg4, 0);
11592 epp = &ep;
11594 return get_errno(epoll_ctl(arg1, arg2, arg3, epp));
11596 #endif
11598 #if defined(TARGET_NR_epoll_wait) || defined(TARGET_NR_epoll_pwait)
11599 #if defined(TARGET_NR_epoll_wait)
11600 case TARGET_NR_epoll_wait:
11601 #endif
11602 #if defined(TARGET_NR_epoll_pwait)
11603 case TARGET_NR_epoll_pwait:
11604 #endif
11606 struct target_epoll_event *target_ep;
11607 struct epoll_event *ep;
11608 int epfd = arg1;
11609 int maxevents = arg3;
11610 int timeout = arg4;
11612 if (maxevents <= 0 || maxevents > TARGET_EP_MAX_EVENTS) {
11613 return -TARGET_EINVAL;
11616 target_ep = lock_user(VERIFY_WRITE, arg2,
11617 maxevents * sizeof(struct target_epoll_event), 1);
11618 if (!target_ep) {
11619 return -TARGET_EFAULT;
11622 ep = g_try_new(struct epoll_event, maxevents);
11623 if (!ep) {
11624 unlock_user(target_ep, arg2, 0);
11625 return -TARGET_ENOMEM;
11628 switch (num) {
11629 #if defined(TARGET_NR_epoll_pwait)
11630 case TARGET_NR_epoll_pwait:
11632 target_sigset_t *target_set;
11633 sigset_t _set, *set = &_set;
11635 if (arg5) {
11636 if (arg6 != sizeof(target_sigset_t)) {
11637 ret = -TARGET_EINVAL;
11638 break;
11641 target_set = lock_user(VERIFY_READ, arg5,
11642 sizeof(target_sigset_t), 1);
11643 if (!target_set) {
11644 ret = -TARGET_EFAULT;
11645 break;
11647 target_to_host_sigset(set, target_set);
11648 unlock_user(target_set, arg5, 0);
11649 } else {
11650 set = NULL;
11653 ret = get_errno(safe_epoll_pwait(epfd, ep, maxevents, timeout,
11654 set, SIGSET_T_SIZE));
11655 break;
11657 #endif
11658 #if defined(TARGET_NR_epoll_wait)
11659 case TARGET_NR_epoll_wait:
11660 ret = get_errno(safe_epoll_pwait(epfd, ep, maxevents, timeout,
11661 NULL, 0));
11662 break;
11663 #endif
11664 default:
11665 ret = -TARGET_ENOSYS;
11667 if (!is_error(ret)) {
11668 int i;
11669 for (i = 0; i < ret; i++) {
11670 target_ep[i].events = tswap32(ep[i].events);
11671 target_ep[i].data.u64 = tswap64(ep[i].data.u64);
11673 unlock_user(target_ep, arg2,
11674 ret * sizeof(struct target_epoll_event));
11675 } else {
11676 unlock_user(target_ep, arg2, 0);
11678 g_free(ep);
11679 return ret;
11681 #endif
11682 #endif
11683 #ifdef TARGET_NR_prlimit64
11684 case TARGET_NR_prlimit64:
11686 /* args: pid, resource number, ptr to new rlimit, ptr to old rlimit */
11687 struct target_rlimit64 *target_rnew, *target_rold;
11688 struct host_rlimit64 rnew, rold, *rnewp = 0;
11689 int resource = target_to_host_resource(arg2);
11690 if (arg3) {
11691 if (!lock_user_struct(VERIFY_READ, target_rnew, arg3, 1)) {
11692 return -TARGET_EFAULT;
11694 rnew.rlim_cur = tswap64(target_rnew->rlim_cur);
11695 rnew.rlim_max = tswap64(target_rnew->rlim_max);
11696 unlock_user_struct(target_rnew, arg3, 0);
11697 rnewp = &rnew;
11700 ret = get_errno(sys_prlimit64(arg1, resource, rnewp, arg4 ? &rold : 0));
11701 if (!is_error(ret) && arg4) {
11702 if (!lock_user_struct(VERIFY_WRITE, target_rold, arg4, 1)) {
11703 return -TARGET_EFAULT;
11705 target_rold->rlim_cur = tswap64(rold.rlim_cur);
11706 target_rold->rlim_max = tswap64(rold.rlim_max);
11707 unlock_user_struct(target_rold, arg4, 1);
11709 return ret;
11711 #endif
11712 #ifdef TARGET_NR_gethostname
11713 case TARGET_NR_gethostname:
11715 char *name = lock_user(VERIFY_WRITE, arg1, arg2, 0);
11716 if (name) {
11717 ret = get_errno(gethostname(name, arg2));
11718 unlock_user(name, arg1, arg2);
11719 } else {
11720 ret = -TARGET_EFAULT;
11722 return ret;
11724 #endif
11725 #ifdef TARGET_NR_atomic_cmpxchg_32
11726 case TARGET_NR_atomic_cmpxchg_32:
11728 /* should use start_exclusive from main.c */
11729 abi_ulong mem_value;
11730 if (get_user_u32(mem_value, arg6)) {
11731 target_siginfo_t info;
11732 info.si_signo = SIGSEGV;
11733 info.si_errno = 0;
11734 info.si_code = TARGET_SEGV_MAPERR;
11735 info._sifields._sigfault._addr = arg6;
11736 queue_signal((CPUArchState *)cpu_env, info.si_signo,
11737 QEMU_SI_FAULT, &info);
11738 ret = 0xdeadbeef;
11741 if (mem_value == arg2)
11742 put_user_u32(arg1, arg6);
11743 return mem_value;
11745 #endif
11746 #ifdef TARGET_NR_atomic_barrier
11747 case TARGET_NR_atomic_barrier:
11748 /* Like the kernel implementation and the
11749 qemu arm barrier, no-op this? */
11750 return 0;
11751 #endif
11753 #ifdef TARGET_NR_timer_create
11754 case TARGET_NR_timer_create:
11756 /* args: clockid_t clockid, struct sigevent *sevp, timer_t *timerid */
11758 struct sigevent host_sevp = { {0}, }, *phost_sevp = NULL;
11760 int clkid = arg1;
11761 int timer_index = next_free_host_timer();
11763 if (timer_index < 0) {
11764 ret = -TARGET_EAGAIN;
11765 } else {
11766 timer_t *phtimer = g_posix_timers + timer_index;
11768 if (arg2) {
11769 phost_sevp = &host_sevp;
11770 ret = target_to_host_sigevent(phost_sevp, arg2);
11771 if (ret != 0) {
11772 return ret;
11776 ret = get_errno(timer_create(clkid, phost_sevp, phtimer));
11777 if (ret) {
11778 phtimer = NULL;
11779 } else {
11780 if (put_user(TIMER_MAGIC | timer_index, arg3, target_timer_t)) {
11781 return -TARGET_EFAULT;
11785 return ret;
11787 #endif
11789 #ifdef TARGET_NR_timer_settime
11790 case TARGET_NR_timer_settime:
11792 /* args: timer_t timerid, int flags, const struct itimerspec *new_value,
11793 * struct itimerspec * old_value */
11794 target_timer_t timerid = get_timer_id(arg1);
11796 if (timerid < 0) {
11797 ret = timerid;
11798 } else if (arg3 == 0) {
11799 ret = -TARGET_EINVAL;
11800 } else {
11801 timer_t htimer = g_posix_timers[timerid];
11802 struct itimerspec hspec_new = {{0},}, hspec_old = {{0},};
11804 if (target_to_host_itimerspec(&hspec_new, arg3)) {
11805 return -TARGET_EFAULT;
11807 ret = get_errno(
11808 timer_settime(htimer, arg2, &hspec_new, &hspec_old));
11809 if (arg4 && host_to_target_itimerspec(arg4, &hspec_old)) {
11810 return -TARGET_EFAULT;
11813 return ret;
11815 #endif
11817 #ifdef TARGET_NR_timer_gettime
11818 case TARGET_NR_timer_gettime:
11820 /* args: timer_t timerid, struct itimerspec *curr_value */
11821 target_timer_t timerid = get_timer_id(arg1);
11823 if (timerid < 0) {
11824 ret = timerid;
11825 } else if (!arg2) {
11826 ret = -TARGET_EFAULT;
11827 } else {
11828 timer_t htimer = g_posix_timers[timerid];
11829 struct itimerspec hspec;
11830 ret = get_errno(timer_gettime(htimer, &hspec));
11832 if (host_to_target_itimerspec(arg2, &hspec)) {
11833 ret = -TARGET_EFAULT;
11836 return ret;
11838 #endif
11840 #ifdef TARGET_NR_timer_getoverrun
11841 case TARGET_NR_timer_getoverrun:
11843 /* args: timer_t timerid */
11844 target_timer_t timerid = get_timer_id(arg1);
11846 if (timerid < 0) {
11847 ret = timerid;
11848 } else {
11849 timer_t htimer = g_posix_timers[timerid];
11850 ret = get_errno(timer_getoverrun(htimer));
11852 return ret;
11854 #endif
11856 #ifdef TARGET_NR_timer_delete
11857 case TARGET_NR_timer_delete:
11859 /* args: timer_t timerid */
11860 target_timer_t timerid = get_timer_id(arg1);
11862 if (timerid < 0) {
11863 ret = timerid;
11864 } else {
11865 timer_t htimer = g_posix_timers[timerid];
11866 ret = get_errno(timer_delete(htimer));
11867 g_posix_timers[timerid] = 0;
11869 return ret;
11871 #endif
11873 #if defined(TARGET_NR_timerfd_create) && defined(CONFIG_TIMERFD)
11874 case TARGET_NR_timerfd_create:
11875 return get_errno(timerfd_create(arg1,
11876 target_to_host_bitmask(arg2, fcntl_flags_tbl)));
11877 #endif
11879 #if defined(TARGET_NR_timerfd_gettime) && defined(CONFIG_TIMERFD)
11880 case TARGET_NR_timerfd_gettime:
11882 struct itimerspec its_curr;
11884 ret = get_errno(timerfd_gettime(arg1, &its_curr));
11886 if (arg2 && host_to_target_itimerspec(arg2, &its_curr)) {
11887 return -TARGET_EFAULT;
11890 return ret;
11891 #endif
11893 #if defined(TARGET_NR_timerfd_settime) && defined(CONFIG_TIMERFD)
11894 case TARGET_NR_timerfd_settime:
11896 struct itimerspec its_new, its_old, *p_new;
11898 if (arg3) {
11899 if (target_to_host_itimerspec(&its_new, arg3)) {
11900 return -TARGET_EFAULT;
11902 p_new = &its_new;
11903 } else {
11904 p_new = NULL;
11907 ret = get_errno(timerfd_settime(arg1, arg2, p_new, &its_old));
11909 if (arg4 && host_to_target_itimerspec(arg4, &its_old)) {
11910 return -TARGET_EFAULT;
11913 return ret;
11914 #endif
11916 #if defined(TARGET_NR_ioprio_get) && defined(__NR_ioprio_get)
11917 case TARGET_NR_ioprio_get:
11918 return get_errno(ioprio_get(arg1, arg2));
11919 #endif
11921 #if defined(TARGET_NR_ioprio_set) && defined(__NR_ioprio_set)
11922 case TARGET_NR_ioprio_set:
11923 return get_errno(ioprio_set(arg1, arg2, arg3));
11924 #endif
11926 #if defined(TARGET_NR_setns) && defined(CONFIG_SETNS)
11927 case TARGET_NR_setns:
11928 return get_errno(setns(arg1, arg2));
11929 #endif
11930 #if defined(TARGET_NR_unshare) && defined(CONFIG_SETNS)
11931 case TARGET_NR_unshare:
11932 return get_errno(unshare(arg1));
11933 #endif
11934 #if defined(TARGET_NR_kcmp) && defined(__NR_kcmp)
11935 case TARGET_NR_kcmp:
11936 return get_errno(kcmp(arg1, arg2, arg3, arg4, arg5));
11937 #endif
11938 #ifdef TARGET_NR_swapcontext
11939 case TARGET_NR_swapcontext:
11940 /* PowerPC specific. */
11941 return do_swapcontext(cpu_env, arg1, arg2, arg3);
11942 #endif
11943 #ifdef TARGET_NR_memfd_create
11944 case TARGET_NR_memfd_create:
11945 p = lock_user_string(arg1);
11946 if (!p) {
11947 return -TARGET_EFAULT;
11949 ret = get_errno(memfd_create(p, arg2));
11950 fd_trans_unregister(ret);
11951 unlock_user(p, arg1, 0);
11952 return ret;
11953 #endif
11955 default:
11956 qemu_log_mask(LOG_UNIMP, "Unsupported syscall: %d\n", num);
11957 return -TARGET_ENOSYS;
11959 return ret;
11962 abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
11963 abi_long arg2, abi_long arg3, abi_long arg4,
11964 abi_long arg5, abi_long arg6, abi_long arg7,
11965 abi_long arg8)
11967 CPUState *cpu = env_cpu(cpu_env);
11968 abi_long ret;
11970 #ifdef DEBUG_ERESTARTSYS
11971 /* Debug-only code for exercising the syscall-restart code paths
11972 * in the per-architecture cpu main loops: restart every syscall
11973 * the guest makes once before letting it through.
11976 static bool flag;
11977 flag = !flag;
11978 if (flag) {
11979 return -TARGET_ERESTARTSYS;
11982 #endif
11984 trace_guest_user_syscall(cpu, num, arg1, arg2, arg3, arg4,
11985 arg5, arg6, arg7, arg8);
11987 if (unlikely(do_strace)) {
11988 print_syscall(num, arg1, arg2, arg3, arg4, arg5, arg6);
11989 ret = do_syscall1(cpu_env, num, arg1, arg2, arg3, arg4,
11990 arg5, arg6, arg7, arg8);
11991 print_syscall_ret(num, ret);
11992 } else {
11993 ret = do_syscall1(cpu_env, num, arg1, arg2, arg3, arg4,
11994 arg5, arg6, arg7, arg8);
11997 trace_guest_user_syscall_ret(cpu, num, ret);
11998 return ret;