xref: /openbmc/qemu/linux-user/syscall.c (revision d95fd983)
1 /*
2  *  Linux syscalls
3  *
4  *  Copyright (c) 2003 Fabrice Bellard
5  *
6  *  This program is free software; you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation; either version 2 of the License, or
9  *  (at your option) any later version.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this program; if not, see <http://www.gnu.org/licenses/>.
18  */
19 #define _ATFILE_SOURCE
20 #include "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 "qemu/plugin.h"
26 #include "tcg/startup.h"
27 #include "target_mman.h"
28 #include "exec/page-protection.h"
29 #include <elf.h>
30 #include <endian.h>
31 #include <grp.h>
32 #include <sys/ipc.h>
33 #include <sys/msg.h>
34 #include <sys/wait.h>
35 #include <sys/mount.h>
36 #include <sys/file.h>
37 #include <sys/fsuid.h>
38 #include <sys/personality.h>
39 #include <sys/prctl.h>
40 #include <sys/resource.h>
41 #include <sys/swap.h>
42 #include <linux/capability.h>
43 #include <sched.h>
44 #include <sys/timex.h>
45 #include <sys/socket.h>
46 #include <linux/sockios.h>
47 #include <sys/un.h>
48 #include <sys/uio.h>
49 #include <poll.h>
50 #include <sys/times.h>
51 #include <sys/shm.h>
52 #include <sys/sem.h>
53 #include <sys/statfs.h>
54 #include <utime.h>
55 #include <sys/sysinfo.h>
56 #include <sys/signalfd.h>
57 #include <netinet/in.h>
58 #include <netinet/ip.h>
59 #include <netinet/tcp.h>
60 #include <netinet/udp.h>
61 #include <linux/wireless.h>
62 #include <linux/icmp.h>
63 #include <linux/icmpv6.h>
64 #include <linux/if_tun.h>
65 #include <linux/in6.h>
66 #include <linux/errqueue.h>
67 #include <linux/random.h>
68 #ifdef CONFIG_TIMERFD
69 #include <sys/timerfd.h>
70 #endif
71 #ifdef CONFIG_EVENTFD
72 #include <sys/eventfd.h>
73 #endif
74 #ifdef CONFIG_EPOLL
75 #include <sys/epoll.h>
76 #endif
77 #ifdef CONFIG_ATTR
78 #include "qemu/xattr.h"
79 #endif
80 #ifdef CONFIG_SENDFILE
81 #include <sys/sendfile.h>
82 #endif
83 #ifdef HAVE_SYS_KCOV_H
84 #include <sys/kcov.h>
85 #endif
86 
87 #define termios host_termios
88 #define winsize host_winsize
89 #define termio host_termio
90 #define sgttyb host_sgttyb /* same as target */
91 #define tchars host_tchars /* same as target */
92 #define ltchars host_ltchars /* same as target */
93 
94 #include <linux/termios.h>
95 #include <linux/unistd.h>
96 #include <linux/cdrom.h>
97 #include <linux/hdreg.h>
98 #include <linux/soundcard.h>
99 #include <linux/kd.h>
100 #include <linux/mtio.h>
101 #include <linux/fs.h>
102 #include <linux/fd.h>
103 #if defined(CONFIG_FIEMAP)
104 #include <linux/fiemap.h>
105 #endif
106 #include <linux/fb.h>
107 #if defined(CONFIG_USBFS)
108 #include <linux/usbdevice_fs.h>
109 #include <linux/usb/ch9.h>
110 #endif
111 #include <linux/vt.h>
112 #include <linux/dm-ioctl.h>
113 #include <linux/reboot.h>
114 #include <linux/route.h>
115 #include <linux/filter.h>
116 #include <linux/blkpg.h>
117 #include <netpacket/packet.h>
118 #include <linux/netlink.h>
119 #include <linux/if_alg.h>
120 #include <linux/rtc.h>
121 #include <sound/asound.h>
122 #ifdef HAVE_BTRFS_H
123 #include <linux/btrfs.h>
124 #endif
125 #ifdef HAVE_DRM_H
126 #include <libdrm/drm.h>
127 #include <libdrm/i915_drm.h>
128 #endif
129 #include "linux_loop.h"
130 #include "uname.h"
131 
132 #include "qemu.h"
133 #include "user-internals.h"
134 #include "strace.h"
135 #include "signal-common.h"
136 #include "loader.h"
137 #include "user-mmap.h"
138 #include "user/safe-syscall.h"
139 #include "qemu/guest-random.h"
140 #include "qemu/selfmap.h"
141 #include "user/syscall-trace.h"
142 #include "special-errno.h"
143 #include "qapi/error.h"
144 #include "fd-trans.h"
145 #include "cpu_loop-common.h"
146 
147 #ifndef CLONE_IO
148 #define CLONE_IO                0x80000000      /* Clone io context */
149 #endif
150 
151 /* We can't directly call the host clone syscall, because this will
152  * badly confuse libc (breaking mutexes, for example). So we must
153  * divide clone flags into:
154  *  * flag combinations that look like pthread_create()
155  *  * flag combinations that look like fork()
156  *  * flags we can implement within QEMU itself
157  *  * flags we can't support and will return an error for
158  */
159 /* For thread creation, all these flags must be present; for
160  * fork, none must be present.
161  */
162 #define CLONE_THREAD_FLAGS                              \
163     (CLONE_VM | CLONE_FS | CLONE_FILES |                \
164      CLONE_SIGHAND | CLONE_THREAD | CLONE_SYSVSEM)
165 
166 /* These flags are ignored:
167  * CLONE_DETACHED is now ignored by the kernel;
168  * CLONE_IO is just an optimisation hint to the I/O scheduler
169  */
170 #define CLONE_IGNORED_FLAGS                     \
171     (CLONE_DETACHED | CLONE_IO)
172 
173 #ifndef CLONE_PIDFD
174 # define CLONE_PIDFD 0x00001000
175 #endif
176 
177 /* Flags for fork which we can implement within QEMU itself */
178 #define CLONE_OPTIONAL_FORK_FLAGS               \
179     (CLONE_SETTLS | CLONE_PARENT_SETTID | CLONE_PIDFD | \
180      CLONE_CHILD_CLEARTID | CLONE_CHILD_SETTID)
181 
182 /* Flags for thread creation which we can implement within QEMU itself */
183 #define CLONE_OPTIONAL_THREAD_FLAGS                             \
184     (CLONE_SETTLS | CLONE_PARENT_SETTID |                       \
185      CLONE_CHILD_CLEARTID | CLONE_CHILD_SETTID | CLONE_PARENT)
186 
187 #define CLONE_INVALID_FORK_FLAGS                                        \
188     (~(CSIGNAL | CLONE_OPTIONAL_FORK_FLAGS | CLONE_IGNORED_FLAGS))
189 
190 #define CLONE_INVALID_THREAD_FLAGS                                      \
191     (~(CSIGNAL | CLONE_THREAD_FLAGS | CLONE_OPTIONAL_THREAD_FLAGS |     \
192        CLONE_IGNORED_FLAGS))
193 
194 /* CLONE_VFORK is special cased early in do_fork(). The other flag bits
195  * have almost all been allocated. We cannot support any of
196  * CLONE_NEWNS, CLONE_NEWCGROUP, CLONE_NEWUTS, CLONE_NEWIPC,
197  * CLONE_NEWUSER, CLONE_NEWPID, CLONE_NEWNET, CLONE_PTRACE, CLONE_UNTRACED.
198  * The checks against the invalid thread masks above will catch these.
199  * (The one remaining unallocated bit is 0x1000 which used to be CLONE_PID.)
200  */
201 
202 /* Define DEBUG_ERESTARTSYS to force every syscall to be restarted
203  * once. This exercises the codepaths for restart.
204  */
205 //#define DEBUG_ERESTARTSYS
206 
207 //#include <linux/msdos_fs.h>
208 #define VFAT_IOCTL_READDIR_BOTH \
209     _IOC(_IOC_READ, 'r', 1, (sizeof(struct linux_dirent) + 256) * 2)
210 #define VFAT_IOCTL_READDIR_SHORT \
211     _IOC(_IOC_READ, 'r', 2, (sizeof(struct linux_dirent) + 256) * 2)
212 
213 #undef _syscall0
214 #undef _syscall1
215 #undef _syscall2
216 #undef _syscall3
217 #undef _syscall4
218 #undef _syscall5
219 #undef _syscall6
220 
221 #define _syscall0(type,name)		\
222 static type name (void)			\
223 {					\
224 	return syscall(__NR_##name);	\
225 }
226 
227 #define _syscall1(type,name,type1,arg1)		\
228 static type name (type1 arg1)			\
229 {						\
230 	return syscall(__NR_##name, arg1);	\
231 }
232 
233 #define _syscall2(type,name,type1,arg1,type2,arg2)	\
234 static type name (type1 arg1,type2 arg2)		\
235 {							\
236 	return syscall(__NR_##name, arg1, arg2);	\
237 }
238 
239 #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3)	\
240 static type name (type1 arg1,type2 arg2,type3 arg3)		\
241 {								\
242 	return syscall(__NR_##name, arg1, arg2, arg3);		\
243 }
244 
245 #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4)	\
246 static type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4)			\
247 {										\
248 	return syscall(__NR_##name, arg1, arg2, arg3, arg4);			\
249 }
250 
251 #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,	\
252 		  type5,arg5)							\
253 static type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5)	\
254 {										\
255 	return syscall(__NR_##name, arg1, arg2, arg3, arg4, arg5);		\
256 }
257 
258 
259 #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,	\
260 		  type5,arg5,type6,arg6)					\
261 static type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5,	\
262                   type6 arg6)							\
263 {										\
264 	return syscall(__NR_##name, arg1, arg2, arg3, arg4, arg5, arg6);	\
265 }
266 
267 
268 #define __NR_sys_uname __NR_uname
269 #define __NR_sys_getcwd1 __NR_getcwd
270 #define __NR_sys_getdents __NR_getdents
271 #define __NR_sys_getdents64 __NR_getdents64
272 #define __NR_sys_getpriority __NR_getpriority
273 #define __NR_sys_rt_sigqueueinfo __NR_rt_sigqueueinfo
274 #define __NR_sys_rt_tgsigqueueinfo __NR_rt_tgsigqueueinfo
275 #define __NR_sys_syslog __NR_syslog
276 #if defined(__NR_futex)
277 # define __NR_sys_futex __NR_futex
278 #endif
279 #if defined(__NR_futex_time64)
280 # define __NR_sys_futex_time64 __NR_futex_time64
281 #endif
282 #define __NR_sys_statx __NR_statx
283 
284 #if defined(__alpha__) || defined(__x86_64__) || defined(__s390x__)
285 #define __NR__llseek __NR_lseek
286 #endif
287 
288 /* Newer kernel ports have llseek() instead of _llseek() */
289 #if defined(TARGET_NR_llseek) && !defined(TARGET_NR__llseek)
290 #define TARGET_NR__llseek TARGET_NR_llseek
291 #endif
292 
293 /* some platforms need to mask more bits than just TARGET_O_NONBLOCK */
294 #ifndef TARGET_O_NONBLOCK_MASK
295 #define TARGET_O_NONBLOCK_MASK TARGET_O_NONBLOCK
296 #endif
297 
298 #define __NR_sys_gettid __NR_gettid
299 _syscall0(int, sys_gettid)
300 
301 /* For the 64-bit guest on 32-bit host case we must emulate
302  * getdents using getdents64, because otherwise the host
303  * might hand us back more dirent records than we can fit
304  * into the guest buffer after structure format conversion.
305  * Otherwise we emulate getdents with getdents if the host has it.
306  */
307 #if defined(__NR_getdents) && HOST_LONG_BITS >= TARGET_ABI_BITS
308 #define EMULATE_GETDENTS_WITH_GETDENTS
309 #endif
310 
311 #if defined(TARGET_NR_getdents) && defined(EMULATE_GETDENTS_WITH_GETDENTS)
312 _syscall3(int, sys_getdents, unsigned int, fd, struct linux_dirent *, dirp, unsigned int, count);
313 #endif
314 #if (defined(TARGET_NR_getdents) && \
315       !defined(EMULATE_GETDENTS_WITH_GETDENTS)) || \
316     (defined(TARGET_NR_getdents64) && defined(__NR_getdents64))
317 _syscall3(int, sys_getdents64, unsigned int, fd, struct linux_dirent64 *, dirp, unsigned int, count);
318 #endif
319 #if defined(TARGET_NR__llseek) && defined(__NR_llseek)
320 _syscall5(int, _llseek,  unsigned int,  fd, unsigned long, hi, unsigned long, lo,
321           loff_t *, res, unsigned int, wh);
322 #endif
323 _syscall3(int, sys_rt_sigqueueinfo, pid_t, pid, int, sig, siginfo_t *, uinfo)
324 _syscall4(int, sys_rt_tgsigqueueinfo, pid_t, pid, pid_t, tid, int, sig,
325           siginfo_t *, uinfo)
326 _syscall3(int,sys_syslog,int,type,char*,bufp,int,len)
327 #ifdef __NR_exit_group
328 _syscall1(int,exit_group,int,error_code)
329 #endif
330 #if defined(__NR_close_range) && defined(TARGET_NR_close_range)
331 #define __NR_sys_close_range __NR_close_range
332 _syscall3(int,sys_close_range,int,first,int,last,int,flags)
333 #ifndef CLOSE_RANGE_CLOEXEC
334 #define CLOSE_RANGE_CLOEXEC     (1U << 2)
335 #endif
336 #endif
337 #if defined(__NR_futex)
338 _syscall6(int,sys_futex,int *,uaddr,int,op,int,val,
339           const struct timespec *,timeout,int *,uaddr2,int,val3)
340 #endif
341 #if defined(__NR_futex_time64)
342 _syscall6(int,sys_futex_time64,int *,uaddr,int,op,int,val,
343           const struct timespec *,timeout,int *,uaddr2,int,val3)
344 #endif
345 #if defined(__NR_pidfd_open) && defined(TARGET_NR_pidfd_open)
346 _syscall2(int, pidfd_open, pid_t, pid, unsigned int, flags);
347 #endif
348 #if defined(__NR_pidfd_send_signal) && defined(TARGET_NR_pidfd_send_signal)
349 _syscall4(int, pidfd_send_signal, int, pidfd, int, sig, siginfo_t *, info,
350                              unsigned int, flags);
351 #endif
352 #if defined(__NR_pidfd_getfd) && defined(TARGET_NR_pidfd_getfd)
353 _syscall3(int, pidfd_getfd, int, pidfd, int, targetfd, unsigned int, flags);
354 #endif
355 #define __NR_sys_sched_getaffinity __NR_sched_getaffinity
356 _syscall3(int, sys_sched_getaffinity, pid_t, pid, unsigned int, len,
357           unsigned long *, user_mask_ptr);
358 #define __NR_sys_sched_setaffinity __NR_sched_setaffinity
359 _syscall3(int, sys_sched_setaffinity, pid_t, pid, unsigned int, len,
360           unsigned long *, user_mask_ptr);
361 /* sched_attr is not defined in glibc */
362 struct sched_attr {
363     uint32_t size;
364     uint32_t sched_policy;
365     uint64_t sched_flags;
366     int32_t sched_nice;
367     uint32_t sched_priority;
368     uint64_t sched_runtime;
369     uint64_t sched_deadline;
370     uint64_t sched_period;
371     uint32_t sched_util_min;
372     uint32_t sched_util_max;
373 };
374 #define __NR_sys_sched_getattr __NR_sched_getattr
375 _syscall4(int, sys_sched_getattr, pid_t, pid, struct sched_attr *, attr,
376           unsigned int, size, unsigned int, flags);
377 #define __NR_sys_sched_setattr __NR_sched_setattr
378 _syscall3(int, sys_sched_setattr, pid_t, pid, struct sched_attr *, attr,
379           unsigned int, flags);
380 #define __NR_sys_sched_getscheduler __NR_sched_getscheduler
381 _syscall1(int, sys_sched_getscheduler, pid_t, pid);
382 #define __NR_sys_sched_setscheduler __NR_sched_setscheduler
383 _syscall3(int, sys_sched_setscheduler, pid_t, pid, int, policy,
384           const struct sched_param *, param);
385 #define __NR_sys_sched_getparam __NR_sched_getparam
386 _syscall2(int, sys_sched_getparam, pid_t, pid,
387           struct sched_param *, param);
388 #define __NR_sys_sched_setparam __NR_sched_setparam
389 _syscall2(int, sys_sched_setparam, pid_t, pid,
390           const struct sched_param *, param);
391 #define __NR_sys_getcpu __NR_getcpu
392 _syscall3(int, sys_getcpu, unsigned *, cpu, unsigned *, node, void *, tcache);
393 _syscall4(int, reboot, int, magic1, int, magic2, unsigned int, cmd,
394           void *, arg);
395 _syscall2(int, capget, struct __user_cap_header_struct *, header,
396           struct __user_cap_data_struct *, data);
397 _syscall2(int, capset, struct __user_cap_header_struct *, header,
398           struct __user_cap_data_struct *, data);
399 #if defined(TARGET_NR_ioprio_get) && defined(__NR_ioprio_get)
400 _syscall2(int, ioprio_get, int, which, int, who)
401 #endif
402 #if defined(TARGET_NR_ioprio_set) && defined(__NR_ioprio_set)
403 _syscall3(int, ioprio_set, int, which, int, who, int, ioprio)
404 #endif
405 #if defined(TARGET_NR_getrandom) && defined(__NR_getrandom)
406 _syscall3(int, getrandom, void *, buf, size_t, buflen, unsigned int, flags)
407 #endif
408 
409 #if defined(TARGET_NR_kcmp) && defined(__NR_kcmp)
410 _syscall5(int, kcmp, pid_t, pid1, pid_t, pid2, int, type,
411           unsigned long, idx1, unsigned long, idx2)
412 #endif
413 
414 /*
415  * It is assumed that struct statx is architecture independent.
416  */
417 #if defined(TARGET_NR_statx) && defined(__NR_statx)
418 _syscall5(int, sys_statx, int, dirfd, const char *, pathname, int, flags,
419           unsigned int, mask, struct target_statx *, statxbuf)
420 #endif
421 #if defined(TARGET_NR_membarrier) && defined(__NR_membarrier)
422 _syscall2(int, membarrier, int, cmd, int, flags)
423 #endif
424 
425 static const bitmask_transtbl fcntl_flags_tbl[] = {
426   { TARGET_O_ACCMODE,   TARGET_O_WRONLY,    O_ACCMODE,   O_WRONLY,    },
427   { TARGET_O_ACCMODE,   TARGET_O_RDWR,      O_ACCMODE,   O_RDWR,      },
428   { TARGET_O_CREAT,     TARGET_O_CREAT,     O_CREAT,     O_CREAT,     },
429   { TARGET_O_EXCL,      TARGET_O_EXCL,      O_EXCL,      O_EXCL,      },
430   { TARGET_O_NOCTTY,    TARGET_O_NOCTTY,    O_NOCTTY,    O_NOCTTY,    },
431   { TARGET_O_TRUNC,     TARGET_O_TRUNC,     O_TRUNC,     O_TRUNC,     },
432   { TARGET_O_APPEND,    TARGET_O_APPEND,    O_APPEND,    O_APPEND,    },
433   { TARGET_O_NONBLOCK,  TARGET_O_NONBLOCK,  O_NONBLOCK,  O_NONBLOCK,  },
434   { TARGET_O_SYNC,      TARGET_O_DSYNC,     O_SYNC,      O_DSYNC,     },
435   { TARGET_O_SYNC,      TARGET_O_SYNC,      O_SYNC,      O_SYNC,      },
436   { TARGET_FASYNC,      TARGET_FASYNC,      FASYNC,      FASYNC,      },
437   { TARGET_O_DIRECTORY, TARGET_O_DIRECTORY, O_DIRECTORY, O_DIRECTORY, },
438   { TARGET_O_NOFOLLOW,  TARGET_O_NOFOLLOW,  O_NOFOLLOW,  O_NOFOLLOW,  },
439 #if defined(O_DIRECT)
440   { TARGET_O_DIRECT,    TARGET_O_DIRECT,    O_DIRECT,    O_DIRECT,    },
441 #endif
442 #if defined(O_NOATIME)
443   { TARGET_O_NOATIME,   TARGET_O_NOATIME,   O_NOATIME,   O_NOATIME    },
444 #endif
445 #if defined(O_CLOEXEC)
446   { TARGET_O_CLOEXEC,   TARGET_O_CLOEXEC,   O_CLOEXEC,   O_CLOEXEC    },
447 #endif
448 #if defined(O_PATH)
449   { TARGET_O_PATH,      TARGET_O_PATH,      O_PATH,      O_PATH       },
450 #endif
451 #if defined(O_TMPFILE)
452   { TARGET_O_TMPFILE,   TARGET_O_TMPFILE,   O_TMPFILE,   O_TMPFILE    },
453 #endif
454   /* Don't terminate the list prematurely on 64-bit host+guest.  */
455 #if TARGET_O_LARGEFILE != 0 || O_LARGEFILE != 0
456   { TARGET_O_LARGEFILE, TARGET_O_LARGEFILE, O_LARGEFILE, O_LARGEFILE, },
457 #endif
458 };
459 
460 _syscall2(int, sys_getcwd1, char *, buf, size_t, size)
461 
462 #if defined(TARGET_NR_utimensat) || defined(TARGET_NR_utimensat_time64)
463 #if defined(__NR_utimensat)
464 #define __NR_sys_utimensat __NR_utimensat
465 _syscall4(int,sys_utimensat,int,dirfd,const char *,pathname,
466           const struct timespec *,tsp,int,flags)
467 #else
468 static int sys_utimensat(int dirfd, const char *pathname,
469                          const struct timespec times[2], int flags)
470 {
471     errno = ENOSYS;
472     return -1;
473 }
474 #endif
475 #endif /* TARGET_NR_utimensat */
476 
477 #ifdef TARGET_NR_renameat2
478 #if defined(__NR_renameat2)
479 #define __NR_sys_renameat2 __NR_renameat2
480 _syscall5(int, sys_renameat2, int, oldfd, const char *, old, int, newfd,
481           const char *, new, unsigned int, flags)
482 #else
483 static int sys_renameat2(int oldfd, const char *old,
484                          int newfd, const char *new, int flags)
485 {
486     if (flags == 0) {
487         return renameat(oldfd, old, newfd, new);
488     }
489     errno = ENOSYS;
490     return -1;
491 }
492 #endif
493 #endif /* TARGET_NR_renameat2 */
494 
495 #ifdef CONFIG_INOTIFY
496 #include <sys/inotify.h>
497 #else
498 /* Userspace can usually survive runtime without inotify */
499 #undef TARGET_NR_inotify_init
500 #undef TARGET_NR_inotify_init1
501 #undef TARGET_NR_inotify_add_watch
502 #undef TARGET_NR_inotify_rm_watch
503 #endif /* CONFIG_INOTIFY  */
504 
505 #if defined(TARGET_NR_prlimit64)
506 #ifndef __NR_prlimit64
507 # define __NR_prlimit64 -1
508 #endif
509 #define __NR_sys_prlimit64 __NR_prlimit64
510 /* The glibc rlimit structure may not be that used by the underlying syscall */
511 struct host_rlimit64 {
512     uint64_t rlim_cur;
513     uint64_t rlim_max;
514 };
515 _syscall4(int, sys_prlimit64, pid_t, pid, int, resource,
516           const struct host_rlimit64 *, new_limit,
517           struct host_rlimit64 *, old_limit)
518 #endif
519 
520 
521 #if defined(TARGET_NR_timer_create)
522 /* Maximum of 32 active POSIX timers allowed at any one time. */
523 #define GUEST_TIMER_MAX 32
524 static timer_t g_posix_timers[GUEST_TIMER_MAX];
525 static int g_posix_timer_allocated[GUEST_TIMER_MAX];
526 
next_free_host_timer(void)527 static inline int next_free_host_timer(void)
528 {
529     int k;
530     for (k = 0; k < ARRAY_SIZE(g_posix_timer_allocated); k++) {
531         if (qatomic_xchg(g_posix_timer_allocated + k, 1) == 0) {
532             return k;
533         }
534     }
535     return -1;
536 }
537 
free_host_timer_slot(int id)538 static inline void free_host_timer_slot(int id)
539 {
540     qatomic_store_release(g_posix_timer_allocated + id, 0);
541 }
542 #endif
543 
host_to_target_errno(int host_errno)544 static inline int host_to_target_errno(int host_errno)
545 {
546     switch (host_errno) {
547 #define E(X)  case X: return TARGET_##X;
548 #include "errnos.c.inc"
549 #undef E
550     default:
551         return host_errno;
552     }
553 }
554 
target_to_host_errno(int target_errno)555 static inline int target_to_host_errno(int target_errno)
556 {
557     switch (target_errno) {
558 #define E(X)  case TARGET_##X: return X;
559 #include "errnos.c.inc"
560 #undef E
561     default:
562         return target_errno;
563     }
564 }
565 
get_errno(abi_long ret)566 abi_long get_errno(abi_long ret)
567 {
568     if (ret == -1)
569         return -host_to_target_errno(errno);
570     else
571         return ret;
572 }
573 
target_strerror(int err)574 const char *target_strerror(int err)
575 {
576     if (err == QEMU_ERESTARTSYS) {
577         return "To be restarted";
578     }
579     if (err == QEMU_ESIGRETURN) {
580         return "Successful exit from sigreturn";
581     }
582 
583     return strerror(target_to_host_errno(err));
584 }
585 
check_zeroed_user(abi_long addr,size_t ksize,size_t usize)586 static int check_zeroed_user(abi_long addr, size_t ksize, size_t usize)
587 {
588     int i;
589     uint8_t b;
590     if (usize <= ksize) {
591         return 1;
592     }
593     for (i = ksize; i < usize; i++) {
594         if (get_user_u8(b, addr + i)) {
595             return -TARGET_EFAULT;
596         }
597         if (b != 0) {
598             return 0;
599         }
600     }
601     return 1;
602 }
603 
604 /*
605  * Copies a target struct to a host struct, in a way that guarantees
606  * backwards-compatibility for struct syscall arguments.
607  *
608  * Similar to kernels uaccess.h:copy_struct_from_user()
609  */
copy_struct_from_user(void * dst,size_t ksize,abi_ptr src,size_t usize)610 int copy_struct_from_user(void *dst, size_t ksize, abi_ptr src, size_t usize)
611 {
612     size_t size = MIN(ksize, usize);
613     size_t rest = MAX(ksize, usize) - size;
614 
615     /* Deal with trailing bytes. */
616     if (usize < ksize) {
617         memset(dst + size, 0, rest);
618     } else if (usize > ksize) {
619         int ret = check_zeroed_user(src, ksize, usize);
620         if (ret <= 0) {
621             return ret ?: -TARGET_E2BIG;
622         }
623     }
624     /* Copy the interoperable parts of the struct. */
625     if (copy_from_user(dst, src, size)) {
626         return -TARGET_EFAULT;
627     }
628     return 0;
629 }
630 
631 #define safe_syscall0(type, name) \
632 static type safe_##name(void) \
633 { \
634     return safe_syscall(__NR_##name); \
635 }
636 
637 #define safe_syscall1(type, name, type1, arg1) \
638 static type safe_##name(type1 arg1) \
639 { \
640     return safe_syscall(__NR_##name, arg1); \
641 }
642 
643 #define safe_syscall2(type, name, type1, arg1, type2, arg2) \
644 static type safe_##name(type1 arg1, type2 arg2) \
645 { \
646     return safe_syscall(__NR_##name, arg1, arg2); \
647 }
648 
649 #define safe_syscall3(type, name, type1, arg1, type2, arg2, type3, arg3) \
650 static type safe_##name(type1 arg1, type2 arg2, type3 arg3) \
651 { \
652     return safe_syscall(__NR_##name, arg1, arg2, arg3); \
653 }
654 
655 #define safe_syscall4(type, name, type1, arg1, type2, arg2, type3, arg3, \
656     type4, arg4) \
657 static type safe_##name(type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
658 { \
659     return safe_syscall(__NR_##name, arg1, arg2, arg3, arg4); \
660 }
661 
662 #define safe_syscall5(type, name, type1, arg1, type2, arg2, type3, arg3, \
663     type4, arg4, type5, arg5) \
664 static type safe_##name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \
665     type5 arg5) \
666 { \
667     return safe_syscall(__NR_##name, arg1, arg2, arg3, arg4, arg5); \
668 }
669 
670 #define safe_syscall6(type, name, type1, arg1, type2, arg2, type3, arg3, \
671     type4, arg4, type5, arg5, type6, arg6) \
672 static type safe_##name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \
673     type5 arg5, type6 arg6) \
674 { \
675     return safe_syscall(__NR_##name, arg1, arg2, arg3, arg4, arg5, arg6); \
676 }
677 
safe_syscall3(ssize_t,read,int,fd,void *,buff,size_t,count)678 safe_syscall3(ssize_t, read, int, fd, void *, buff, size_t, count)
679 safe_syscall3(ssize_t, write, int, fd, const void *, buff, size_t, count)
680 safe_syscall4(int, openat, int, dirfd, const char *, pathname, \
681               int, flags, mode_t, mode)
682 
683 safe_syscall4(int, openat2, int, dirfd, const char *, pathname, \
684               const struct open_how_ver0 *, how, size_t, size)
685 
686 #if defined(TARGET_NR_wait4) || defined(TARGET_NR_waitpid)
687 safe_syscall4(pid_t, wait4, pid_t, pid, int *, status, int, options, \
688               struct rusage *, rusage)
689 #endif
690 safe_syscall5(int, waitid, idtype_t, idtype, id_t, id, siginfo_t *, infop, \
691               int, options, struct rusage *, rusage)
692 safe_syscall3(int, execve, const char *, filename, char **, argv, char **, envp)
693 safe_syscall5(int, execveat, int, dirfd, const char *, filename,
694               char **, argv, char **, envp, int, flags)
695 #if defined(TARGET_NR_select) || defined(TARGET_NR__newselect) || \
696     defined(TARGET_NR_pselect6) || defined(TARGET_NR_pselect6_time64)
697 safe_syscall6(int, pselect6, int, nfds, fd_set *, readfds, fd_set *, writefds, \
698               fd_set *, exceptfds, struct timespec *, timeout, void *, sig)
699 #endif
700 #if defined(TARGET_NR_ppoll) || defined(TARGET_NR_ppoll_time64)
701 safe_syscall5(int, ppoll, struct pollfd *, ufds, unsigned int, nfds,
702               struct timespec *, tsp, const sigset_t *, sigmask,
703               size_t, sigsetsize)
704 #endif
705 safe_syscall6(int, epoll_pwait, int, epfd, struct epoll_event *, events,
706               int, maxevents, int, timeout, const sigset_t *, sigmask,
707               size_t, sigsetsize)
708 #if defined(__NR_futex)
709 safe_syscall6(int,futex,int *,uaddr,int,op,int,val, \
710               const struct timespec *,timeout,int *,uaddr2,int,val3)
711 #endif
712 #if defined(__NR_futex_time64)
713 safe_syscall6(int,futex_time64,int *,uaddr,int,op,int,val, \
714               const struct timespec *,timeout,int *,uaddr2,int,val3)
715 #endif
716 safe_syscall2(int, rt_sigsuspend, sigset_t *, newset, size_t, sigsetsize)
717 safe_syscall2(int, kill, pid_t, pid, int, sig)
718 safe_syscall2(int, tkill, int, tid, int, sig)
719 safe_syscall3(int, tgkill, int, tgid, int, pid, int, sig)
720 safe_syscall3(ssize_t, readv, int, fd, const struct iovec *, iov, int, iovcnt)
721 safe_syscall3(ssize_t, writev, int, fd, const struct iovec *, iov, int, iovcnt)
722 safe_syscall5(ssize_t, preadv, int, fd, const struct iovec *, iov, int, iovcnt,
723               unsigned long, pos_l, unsigned long, pos_h)
724 safe_syscall5(ssize_t, pwritev, int, fd, const struct iovec *, iov, int, iovcnt,
725               unsigned long, pos_l, unsigned long, pos_h)
726 safe_syscall3(int, connect, int, fd, const struct sockaddr *, addr,
727               socklen_t, addrlen)
728 safe_syscall6(ssize_t, sendto, int, fd, const void *, buf, size_t, len,
729               int, flags, const struct sockaddr *, addr, socklen_t, addrlen)
730 safe_syscall6(ssize_t, recvfrom, int, fd, void *, buf, size_t, len,
731               int, flags, struct sockaddr *, addr, socklen_t *, addrlen)
732 safe_syscall3(ssize_t, sendmsg, int, fd, const struct msghdr *, msg, int, flags)
733 safe_syscall3(ssize_t, recvmsg, int, fd, struct msghdr *, msg, int, flags)
734 safe_syscall2(int, flock, int, fd, int, operation)
735 #if defined(TARGET_NR_rt_sigtimedwait) || defined(TARGET_NR_rt_sigtimedwait_time64)
736 safe_syscall4(int, rt_sigtimedwait, const sigset_t *, these, siginfo_t *, uinfo,
737               const struct timespec *, uts, size_t, sigsetsize)
738 #endif
739 safe_syscall4(int, accept4, int, fd, struct sockaddr *, addr, socklen_t *, len,
740               int, flags)
741 #if defined(TARGET_NR_nanosleep)
742 safe_syscall2(int, nanosleep, const struct timespec *, req,
743               struct timespec *, rem)
744 #endif
745 #if defined(TARGET_NR_clock_nanosleep) || \
746     defined(TARGET_NR_clock_nanosleep_time64)
747 safe_syscall4(int, clock_nanosleep, const clockid_t, clock, int, flags,
748               const struct timespec *, req, struct timespec *, rem)
749 #endif
750 #ifdef __NR_ipc
751 #ifdef __s390x__
752 safe_syscall5(int, ipc, int, call, long, first, long, second, long, third,
753               void *, ptr)
754 #else
755 safe_syscall6(int, ipc, int, call, long, first, long, second, long, third,
756               void *, ptr, long, fifth)
757 #endif
758 #endif
759 #ifdef __NR_msgsnd
760 safe_syscall4(int, msgsnd, int, msgid, const void *, msgp, size_t, sz,
761               int, flags)
762 #endif
763 #ifdef __NR_msgrcv
764 safe_syscall5(int, msgrcv, int, msgid, void *, msgp, size_t, sz,
765               long, msgtype, int, flags)
766 #endif
767 #ifdef __NR_semtimedop
768 safe_syscall4(int, semtimedop, int, semid, struct sembuf *, tsops,
769               unsigned, nsops, const struct timespec *, timeout)
770 #endif
771 #if defined(TARGET_NR_mq_timedsend) || \
772     defined(TARGET_NR_mq_timedsend_time64)
773 safe_syscall5(int, mq_timedsend, int, mqdes, const char *, msg_ptr,
774               size_t, len, unsigned, prio, const struct timespec *, timeout)
775 #endif
776 #if defined(TARGET_NR_mq_timedreceive) || \
777     defined(TARGET_NR_mq_timedreceive_time64)
778 safe_syscall5(int, mq_timedreceive, int, mqdes, char *, msg_ptr,
779               size_t, len, unsigned *, prio, const struct timespec *, timeout)
780 #endif
781 #if defined(TARGET_NR_copy_file_range) && defined(__NR_copy_file_range)
782 safe_syscall6(ssize_t, copy_file_range, int, infd, loff_t *, pinoff,
783               int, outfd, loff_t *, poutoff, size_t, length,
784               unsigned int, flags)
785 #endif
786 
787 /* We do ioctl like this rather than via safe_syscall3 to preserve the
788  * "third argument might be integer or pointer or not present" behaviour of
789  * the libc function.
790  */
791 #define safe_ioctl(...) safe_syscall(__NR_ioctl, __VA_ARGS__)
792 /* Similarly for fcntl. Since we always build with LFS enabled,
793  * we should be using the 64-bit structures automatically.
794  */
795 #ifdef __NR_fcntl64
796 #define safe_fcntl(...) safe_syscall(__NR_fcntl64, __VA_ARGS__)
797 #else
798 #define safe_fcntl(...) safe_syscall(__NR_fcntl, __VA_ARGS__)
799 #endif
800 
801 static inline int host_to_target_sock_type(int host_type)
802 {
803     int target_type;
804 
805     switch (host_type & 0xf /* SOCK_TYPE_MASK */) {
806     case SOCK_DGRAM:
807         target_type = TARGET_SOCK_DGRAM;
808         break;
809     case SOCK_STREAM:
810         target_type = TARGET_SOCK_STREAM;
811         break;
812     default:
813         target_type = host_type & 0xf /* SOCK_TYPE_MASK */;
814         break;
815     }
816 
817 #if defined(SOCK_CLOEXEC)
818     if (host_type & SOCK_CLOEXEC) {
819         target_type |= TARGET_SOCK_CLOEXEC;
820     }
821 #endif
822 
823 #if defined(SOCK_NONBLOCK)
824     if (host_type & SOCK_NONBLOCK) {
825         target_type |= TARGET_SOCK_NONBLOCK;
826     }
827 #endif
828 
829     return target_type;
830 }
831 
832 static abi_ulong target_brk, initial_target_brk;
833 
target_set_brk(abi_ulong new_brk)834 void target_set_brk(abi_ulong new_brk)
835 {
836     target_brk = TARGET_PAGE_ALIGN(new_brk);
837     initial_target_brk = target_brk;
838 }
839 
840 /* do_brk() must return target values and target errnos. */
do_brk(abi_ulong brk_val)841 abi_long do_brk(abi_ulong brk_val)
842 {
843     abi_long mapped_addr;
844     abi_ulong new_brk;
845     abi_ulong old_brk;
846 
847     /* brk pointers are always untagged */
848 
849     /* do not allow to shrink below initial brk value */
850     if (brk_val < initial_target_brk) {
851         return target_brk;
852     }
853 
854     new_brk = TARGET_PAGE_ALIGN(brk_val);
855     old_brk = TARGET_PAGE_ALIGN(target_brk);
856 
857     /* new and old target_brk might be on the same page */
858     if (new_brk == old_brk) {
859         target_brk = brk_val;
860         return target_brk;
861     }
862 
863     /* Release heap if necessary */
864     if (new_brk < old_brk) {
865         target_munmap(new_brk, old_brk - new_brk);
866 
867         target_brk = brk_val;
868         return target_brk;
869     }
870 
871     mapped_addr = target_mmap(old_brk, new_brk - old_brk,
872                               PROT_READ | PROT_WRITE,
873                               MAP_FIXED_NOREPLACE | MAP_ANON | MAP_PRIVATE,
874                               -1, 0);
875 
876     if (mapped_addr == old_brk) {
877         target_brk = brk_val;
878         return target_brk;
879     }
880 
881 #if defined(TARGET_ALPHA)
882     /* We (partially) emulate OSF/1 on Alpha, which requires we
883        return a proper errno, not an unchanged brk value.  */
884     return -TARGET_ENOMEM;
885 #endif
886     /* For everything else, return the previous break. */
887     return target_brk;
888 }
889 
890 #if defined(TARGET_NR_select) || defined(TARGET_NR__newselect) || \
891     defined(TARGET_NR_pselect6) || defined(TARGET_NR_pselect6_time64)
copy_from_user_fdset(fd_set * fds,abi_ulong target_fds_addr,int n)892 static inline abi_long copy_from_user_fdset(fd_set *fds,
893                                             abi_ulong target_fds_addr,
894                                             int n)
895 {
896     int i, nw, j, k;
897     abi_ulong b, *target_fds;
898 
899     nw = DIV_ROUND_UP(n, TARGET_ABI_BITS);
900     if (!(target_fds = lock_user(VERIFY_READ,
901                                  target_fds_addr,
902                                  sizeof(abi_ulong) * nw,
903                                  1)))
904         return -TARGET_EFAULT;
905 
906     FD_ZERO(fds);
907     k = 0;
908     for (i = 0; i < nw; i++) {
909         /* grab the abi_ulong */
910         __get_user(b, &target_fds[i]);
911         for (j = 0; j < TARGET_ABI_BITS; j++) {
912             /* check the bit inside the abi_ulong */
913             if ((b >> j) & 1)
914                 FD_SET(k, fds);
915             k++;
916         }
917     }
918 
919     unlock_user(target_fds, target_fds_addr, 0);
920 
921     return 0;
922 }
923 
copy_from_user_fdset_ptr(fd_set * fds,fd_set ** fds_ptr,abi_ulong target_fds_addr,int n)924 static inline abi_ulong copy_from_user_fdset_ptr(fd_set *fds, fd_set **fds_ptr,
925                                                  abi_ulong target_fds_addr,
926                                                  int n)
927 {
928     if (target_fds_addr) {
929         if (copy_from_user_fdset(fds, target_fds_addr, n))
930             return -TARGET_EFAULT;
931         *fds_ptr = fds;
932     } else {
933         *fds_ptr = NULL;
934     }
935     return 0;
936 }
937 
copy_to_user_fdset(abi_ulong target_fds_addr,const fd_set * fds,int n)938 static inline abi_long copy_to_user_fdset(abi_ulong target_fds_addr,
939                                           const fd_set *fds,
940                                           int n)
941 {
942     int i, nw, j, k;
943     abi_long v;
944     abi_ulong *target_fds;
945 
946     nw = DIV_ROUND_UP(n, TARGET_ABI_BITS);
947     if (!(target_fds = lock_user(VERIFY_WRITE,
948                                  target_fds_addr,
949                                  sizeof(abi_ulong) * nw,
950                                  0)))
951         return -TARGET_EFAULT;
952 
953     k = 0;
954     for (i = 0; i < nw; i++) {
955         v = 0;
956         for (j = 0; j < TARGET_ABI_BITS; j++) {
957             v |= ((abi_ulong)(FD_ISSET(k, fds) != 0) << j);
958             k++;
959         }
960         __put_user(v, &target_fds[i]);
961     }
962 
963     unlock_user(target_fds, target_fds_addr, sizeof(abi_ulong) * nw);
964 
965     return 0;
966 }
967 #endif
968 
969 #if defined(__alpha__)
970 #define HOST_HZ 1024
971 #else
972 #define HOST_HZ 100
973 #endif
974 
host_to_target_clock_t(long ticks)975 static inline abi_long host_to_target_clock_t(long ticks)
976 {
977 #if HOST_HZ == TARGET_HZ
978     return ticks;
979 #else
980     return ((int64_t)ticks * TARGET_HZ) / HOST_HZ;
981 #endif
982 }
983 
host_to_target_rusage(abi_ulong target_addr,const struct rusage * rusage)984 static inline abi_long host_to_target_rusage(abi_ulong target_addr,
985                                              const struct rusage *rusage)
986 {
987     struct target_rusage *target_rusage;
988 
989     if (!lock_user_struct(VERIFY_WRITE, target_rusage, target_addr, 0))
990         return -TARGET_EFAULT;
991     target_rusage->ru_utime.tv_sec = tswapal(rusage->ru_utime.tv_sec);
992     target_rusage->ru_utime.tv_usec = tswapal(rusage->ru_utime.tv_usec);
993     target_rusage->ru_stime.tv_sec = tswapal(rusage->ru_stime.tv_sec);
994     target_rusage->ru_stime.tv_usec = tswapal(rusage->ru_stime.tv_usec);
995     target_rusage->ru_maxrss = tswapal(rusage->ru_maxrss);
996     target_rusage->ru_ixrss = tswapal(rusage->ru_ixrss);
997     target_rusage->ru_idrss = tswapal(rusage->ru_idrss);
998     target_rusage->ru_isrss = tswapal(rusage->ru_isrss);
999     target_rusage->ru_minflt = tswapal(rusage->ru_minflt);
1000     target_rusage->ru_majflt = tswapal(rusage->ru_majflt);
1001     target_rusage->ru_nswap = tswapal(rusage->ru_nswap);
1002     target_rusage->ru_inblock = tswapal(rusage->ru_inblock);
1003     target_rusage->ru_oublock = tswapal(rusage->ru_oublock);
1004     target_rusage->ru_msgsnd = tswapal(rusage->ru_msgsnd);
1005     target_rusage->ru_msgrcv = tswapal(rusage->ru_msgrcv);
1006     target_rusage->ru_nsignals = tswapal(rusage->ru_nsignals);
1007     target_rusage->ru_nvcsw = tswapal(rusage->ru_nvcsw);
1008     target_rusage->ru_nivcsw = tswapal(rusage->ru_nivcsw);
1009     unlock_user_struct(target_rusage, target_addr, 1);
1010 
1011     return 0;
1012 }
1013 
1014 #ifdef TARGET_NR_setrlimit
target_to_host_rlim(abi_ulong target_rlim)1015 static inline rlim_t target_to_host_rlim(abi_ulong target_rlim)
1016 {
1017     abi_ulong target_rlim_swap;
1018     rlim_t result;
1019 
1020     target_rlim_swap = tswapal(target_rlim);
1021     if (target_rlim_swap == TARGET_RLIM_INFINITY)
1022         return RLIM_INFINITY;
1023 
1024     result = target_rlim_swap;
1025     if (target_rlim_swap != (rlim_t)result)
1026         return RLIM_INFINITY;
1027 
1028     return result;
1029 }
1030 #endif
1031 
1032 #if defined(TARGET_NR_getrlimit) || defined(TARGET_NR_ugetrlimit)
host_to_target_rlim(rlim_t rlim)1033 static inline abi_ulong host_to_target_rlim(rlim_t rlim)
1034 {
1035     abi_ulong target_rlim_swap;
1036     abi_ulong result;
1037 
1038     if (rlim == RLIM_INFINITY || rlim != (abi_long)rlim)
1039         target_rlim_swap = TARGET_RLIM_INFINITY;
1040     else
1041         target_rlim_swap = rlim;
1042     result = tswapal(target_rlim_swap);
1043 
1044     return result;
1045 }
1046 #endif
1047 
target_to_host_resource(int code)1048 static inline int target_to_host_resource(int code)
1049 {
1050     switch (code) {
1051     case TARGET_RLIMIT_AS:
1052         return RLIMIT_AS;
1053     case TARGET_RLIMIT_CORE:
1054         return RLIMIT_CORE;
1055     case TARGET_RLIMIT_CPU:
1056         return RLIMIT_CPU;
1057     case TARGET_RLIMIT_DATA:
1058         return RLIMIT_DATA;
1059     case TARGET_RLIMIT_FSIZE:
1060         return RLIMIT_FSIZE;
1061     case TARGET_RLIMIT_LOCKS:
1062         return RLIMIT_LOCKS;
1063     case TARGET_RLIMIT_MEMLOCK:
1064         return RLIMIT_MEMLOCK;
1065     case TARGET_RLIMIT_MSGQUEUE:
1066         return RLIMIT_MSGQUEUE;
1067     case TARGET_RLIMIT_NICE:
1068         return RLIMIT_NICE;
1069     case TARGET_RLIMIT_NOFILE:
1070         return RLIMIT_NOFILE;
1071     case TARGET_RLIMIT_NPROC:
1072         return RLIMIT_NPROC;
1073     case TARGET_RLIMIT_RSS:
1074         return RLIMIT_RSS;
1075     case TARGET_RLIMIT_RTPRIO:
1076         return RLIMIT_RTPRIO;
1077 #ifdef RLIMIT_RTTIME
1078     case TARGET_RLIMIT_RTTIME:
1079         return RLIMIT_RTTIME;
1080 #endif
1081     case TARGET_RLIMIT_SIGPENDING:
1082         return RLIMIT_SIGPENDING;
1083     case TARGET_RLIMIT_STACK:
1084         return RLIMIT_STACK;
1085     default:
1086         return code;
1087     }
1088 }
1089 
copy_from_user_timeval(struct timeval * tv,abi_ulong target_tv_addr)1090 static inline abi_long copy_from_user_timeval(struct timeval *tv,
1091                                               abi_ulong target_tv_addr)
1092 {
1093     struct target_timeval *target_tv;
1094 
1095     if (!lock_user_struct(VERIFY_READ, target_tv, target_tv_addr, 1)) {
1096         return -TARGET_EFAULT;
1097     }
1098 
1099     __get_user(tv->tv_sec, &target_tv->tv_sec);
1100     __get_user(tv->tv_usec, &target_tv->tv_usec);
1101 
1102     unlock_user_struct(target_tv, target_tv_addr, 0);
1103 
1104     return 0;
1105 }
1106 
copy_to_user_timeval(abi_ulong target_tv_addr,const struct timeval * tv)1107 static inline abi_long copy_to_user_timeval(abi_ulong target_tv_addr,
1108                                             const struct timeval *tv)
1109 {
1110     struct target_timeval *target_tv;
1111 
1112     if (!lock_user_struct(VERIFY_WRITE, target_tv, target_tv_addr, 0)) {
1113         return -TARGET_EFAULT;
1114     }
1115 
1116     __put_user(tv->tv_sec, &target_tv->tv_sec);
1117     __put_user(tv->tv_usec, &target_tv->tv_usec);
1118 
1119     unlock_user_struct(target_tv, target_tv_addr, 1);
1120 
1121     return 0;
1122 }
1123 
1124 #if defined(TARGET_NR_clock_adjtime64) && defined(CONFIG_CLOCK_ADJTIME)
copy_from_user_timeval64(struct timeval * tv,abi_ulong target_tv_addr)1125 static inline abi_long copy_from_user_timeval64(struct timeval *tv,
1126                                                 abi_ulong target_tv_addr)
1127 {
1128     struct target__kernel_sock_timeval *target_tv;
1129 
1130     if (!lock_user_struct(VERIFY_READ, target_tv, target_tv_addr, 1)) {
1131         return -TARGET_EFAULT;
1132     }
1133 
1134     __get_user(tv->tv_sec, &target_tv->tv_sec);
1135     __get_user(tv->tv_usec, &target_tv->tv_usec);
1136 
1137     unlock_user_struct(target_tv, target_tv_addr, 0);
1138 
1139     return 0;
1140 }
1141 #endif
1142 
copy_to_user_timeval64(abi_ulong target_tv_addr,const struct timeval * tv)1143 static inline abi_long copy_to_user_timeval64(abi_ulong target_tv_addr,
1144                                               const struct timeval *tv)
1145 {
1146     struct target__kernel_sock_timeval *target_tv;
1147 
1148     if (!lock_user_struct(VERIFY_WRITE, target_tv, target_tv_addr, 0)) {
1149         return -TARGET_EFAULT;
1150     }
1151 
1152     __put_user(tv->tv_sec, &target_tv->tv_sec);
1153     __put_user(tv->tv_usec, &target_tv->tv_usec);
1154 
1155     unlock_user_struct(target_tv, target_tv_addr, 1);
1156 
1157     return 0;
1158 }
1159 
1160 #if defined(TARGET_NR_futex) || \
1161     defined(TARGET_NR_rt_sigtimedwait) || \
1162     defined(TARGET_NR_pselect6) || defined(TARGET_NR_pselect6) || \
1163     defined(TARGET_NR_nanosleep) || defined(TARGET_NR_clock_settime) || \
1164     defined(TARGET_NR_utimensat) || defined(TARGET_NR_mq_timedsend) || \
1165     defined(TARGET_NR_mq_timedreceive) || defined(TARGET_NR_ipc) || \
1166     defined(TARGET_NR_semop) || defined(TARGET_NR_semtimedop) || \
1167     defined(TARGET_NR_timer_settime) || \
1168     (defined(TARGET_NR_timerfd_settime) && defined(CONFIG_TIMERFD))
target_to_host_timespec(struct timespec * host_ts,abi_ulong target_addr)1169 static inline abi_long target_to_host_timespec(struct timespec *host_ts,
1170                                                abi_ulong target_addr)
1171 {
1172     struct target_timespec *target_ts;
1173 
1174     if (!lock_user_struct(VERIFY_READ, target_ts, target_addr, 1)) {
1175         return -TARGET_EFAULT;
1176     }
1177     __get_user(host_ts->tv_sec, &target_ts->tv_sec);
1178     __get_user(host_ts->tv_nsec, &target_ts->tv_nsec);
1179     unlock_user_struct(target_ts, target_addr, 0);
1180     return 0;
1181 }
1182 #endif
1183 
1184 #if defined(TARGET_NR_clock_settime64) || defined(TARGET_NR_futex_time64) || \
1185     defined(TARGET_NR_timer_settime64) || \
1186     defined(TARGET_NR_mq_timedsend_time64) || \
1187     defined(TARGET_NR_mq_timedreceive_time64) || \
1188     (defined(TARGET_NR_timerfd_settime64) && defined(CONFIG_TIMERFD)) || \
1189     defined(TARGET_NR_clock_nanosleep_time64) || \
1190     defined(TARGET_NR_rt_sigtimedwait_time64) || \
1191     defined(TARGET_NR_utimensat) || \
1192     defined(TARGET_NR_utimensat_time64) || \
1193     defined(TARGET_NR_semtimedop_time64) || \
1194     defined(TARGET_NR_pselect6_time64) || defined(TARGET_NR_ppoll_time64)
target_to_host_timespec64(struct timespec * host_ts,abi_ulong target_addr)1195 static inline abi_long target_to_host_timespec64(struct timespec *host_ts,
1196                                                  abi_ulong target_addr)
1197 {
1198     struct target__kernel_timespec *target_ts;
1199 
1200     if (!lock_user_struct(VERIFY_READ, target_ts, target_addr, 1)) {
1201         return -TARGET_EFAULT;
1202     }
1203     __get_user(host_ts->tv_sec, &target_ts->tv_sec);
1204     __get_user(host_ts->tv_nsec, &target_ts->tv_nsec);
1205     /* in 32bit mode, this drops the padding */
1206     host_ts->tv_nsec = (long)(abi_long)host_ts->tv_nsec;
1207     unlock_user_struct(target_ts, target_addr, 0);
1208     return 0;
1209 }
1210 #endif
1211 
host_to_target_timespec(abi_ulong target_addr,struct timespec * host_ts)1212 static inline abi_long host_to_target_timespec(abi_ulong target_addr,
1213                                                struct timespec *host_ts)
1214 {
1215     struct target_timespec *target_ts;
1216 
1217     if (!lock_user_struct(VERIFY_WRITE, target_ts, target_addr, 0)) {
1218         return -TARGET_EFAULT;
1219     }
1220     __put_user(host_ts->tv_sec, &target_ts->tv_sec);
1221     __put_user(host_ts->tv_nsec, &target_ts->tv_nsec);
1222     unlock_user_struct(target_ts, target_addr, 1);
1223     return 0;
1224 }
1225 
host_to_target_timespec64(abi_ulong target_addr,struct timespec * host_ts)1226 static inline abi_long host_to_target_timespec64(abi_ulong target_addr,
1227                                                  struct timespec *host_ts)
1228 {
1229     struct target__kernel_timespec *target_ts;
1230 
1231     if (!lock_user_struct(VERIFY_WRITE, target_ts, target_addr, 0)) {
1232         return -TARGET_EFAULT;
1233     }
1234     __put_user(host_ts->tv_sec, &target_ts->tv_sec);
1235     __put_user(host_ts->tv_nsec, &target_ts->tv_nsec);
1236     unlock_user_struct(target_ts, target_addr, 1);
1237     return 0;
1238 }
1239 
1240 #if defined(TARGET_NR_gettimeofday)
copy_to_user_timezone(abi_ulong target_tz_addr,struct timezone * tz)1241 static inline abi_long copy_to_user_timezone(abi_ulong target_tz_addr,
1242                                              struct timezone *tz)
1243 {
1244     struct target_timezone *target_tz;
1245 
1246     if (!lock_user_struct(VERIFY_WRITE, target_tz, target_tz_addr, 1)) {
1247         return -TARGET_EFAULT;
1248     }
1249 
1250     __put_user(tz->tz_minuteswest, &target_tz->tz_minuteswest);
1251     __put_user(tz->tz_dsttime, &target_tz->tz_dsttime);
1252 
1253     unlock_user_struct(target_tz, target_tz_addr, 1);
1254 
1255     return 0;
1256 }
1257 #endif
1258 
1259 #if defined(TARGET_NR_settimeofday)
copy_from_user_timezone(struct timezone * tz,abi_ulong target_tz_addr)1260 static inline abi_long copy_from_user_timezone(struct timezone *tz,
1261                                                abi_ulong target_tz_addr)
1262 {
1263     struct target_timezone *target_tz;
1264 
1265     if (!lock_user_struct(VERIFY_READ, target_tz, target_tz_addr, 1)) {
1266         return -TARGET_EFAULT;
1267     }
1268 
1269     __get_user(tz->tz_minuteswest, &target_tz->tz_minuteswest);
1270     __get_user(tz->tz_dsttime, &target_tz->tz_dsttime);
1271 
1272     unlock_user_struct(target_tz, target_tz_addr, 0);
1273 
1274     return 0;
1275 }
1276 #endif
1277 
1278 #if defined(TARGET_NR_mq_open) && defined(__NR_mq_open)
1279 #include <mqueue.h>
1280 
copy_from_user_mq_attr(struct mq_attr * attr,abi_ulong target_mq_attr_addr)1281 static inline abi_long copy_from_user_mq_attr(struct mq_attr *attr,
1282                                               abi_ulong target_mq_attr_addr)
1283 {
1284     struct target_mq_attr *target_mq_attr;
1285 
1286     if (!lock_user_struct(VERIFY_READ, target_mq_attr,
1287                           target_mq_attr_addr, 1))
1288         return -TARGET_EFAULT;
1289 
1290     __get_user(attr->mq_flags, &target_mq_attr->mq_flags);
1291     __get_user(attr->mq_maxmsg, &target_mq_attr->mq_maxmsg);
1292     __get_user(attr->mq_msgsize, &target_mq_attr->mq_msgsize);
1293     __get_user(attr->mq_curmsgs, &target_mq_attr->mq_curmsgs);
1294 
1295     unlock_user_struct(target_mq_attr, target_mq_attr_addr, 0);
1296 
1297     return 0;
1298 }
1299 
copy_to_user_mq_attr(abi_ulong target_mq_attr_addr,const struct mq_attr * attr)1300 static inline abi_long copy_to_user_mq_attr(abi_ulong target_mq_attr_addr,
1301                                             const struct mq_attr *attr)
1302 {
1303     struct target_mq_attr *target_mq_attr;
1304 
1305     if (!lock_user_struct(VERIFY_WRITE, target_mq_attr,
1306                           target_mq_attr_addr, 0))
1307         return -TARGET_EFAULT;
1308 
1309     __put_user(attr->mq_flags, &target_mq_attr->mq_flags);
1310     __put_user(attr->mq_maxmsg, &target_mq_attr->mq_maxmsg);
1311     __put_user(attr->mq_msgsize, &target_mq_attr->mq_msgsize);
1312     __put_user(attr->mq_curmsgs, &target_mq_attr->mq_curmsgs);
1313 
1314     unlock_user_struct(target_mq_attr, target_mq_attr_addr, 1);
1315 
1316     return 0;
1317 }
1318 #endif
1319 
1320 #if defined(TARGET_NR_select) || defined(TARGET_NR__newselect)
1321 /* do_select() must return target values and target errnos. */
do_select(int n,abi_ulong rfd_addr,abi_ulong wfd_addr,abi_ulong efd_addr,abi_ulong target_tv_addr)1322 static abi_long do_select(int n,
1323                           abi_ulong rfd_addr, abi_ulong wfd_addr,
1324                           abi_ulong efd_addr, abi_ulong target_tv_addr)
1325 {
1326     fd_set rfds, wfds, efds;
1327     fd_set *rfds_ptr, *wfds_ptr, *efds_ptr;
1328     struct timeval tv;
1329     struct timespec ts, *ts_ptr;
1330     abi_long ret;
1331 
1332     ret = copy_from_user_fdset_ptr(&rfds, &rfds_ptr, rfd_addr, n);
1333     if (ret) {
1334         return ret;
1335     }
1336     ret = copy_from_user_fdset_ptr(&wfds, &wfds_ptr, wfd_addr, n);
1337     if (ret) {
1338         return ret;
1339     }
1340     ret = copy_from_user_fdset_ptr(&efds, &efds_ptr, efd_addr, n);
1341     if (ret) {
1342         return ret;
1343     }
1344 
1345     if (target_tv_addr) {
1346         if (copy_from_user_timeval(&tv, target_tv_addr))
1347             return -TARGET_EFAULT;
1348         ts.tv_sec = tv.tv_sec;
1349         ts.tv_nsec = tv.tv_usec * 1000;
1350         ts_ptr = &ts;
1351     } else {
1352         ts_ptr = NULL;
1353     }
1354 
1355     ret = get_errno(safe_pselect6(n, rfds_ptr, wfds_ptr, efds_ptr,
1356                                   ts_ptr, NULL));
1357 
1358     if (!is_error(ret)) {
1359         if (rfd_addr && copy_to_user_fdset(rfd_addr, &rfds, n))
1360             return -TARGET_EFAULT;
1361         if (wfd_addr && copy_to_user_fdset(wfd_addr, &wfds, n))
1362             return -TARGET_EFAULT;
1363         if (efd_addr && copy_to_user_fdset(efd_addr, &efds, n))
1364             return -TARGET_EFAULT;
1365 
1366         if (target_tv_addr) {
1367             tv.tv_sec = ts.tv_sec;
1368             tv.tv_usec = ts.tv_nsec / 1000;
1369             if (copy_to_user_timeval(target_tv_addr, &tv)) {
1370                 return -TARGET_EFAULT;
1371             }
1372         }
1373     }
1374 
1375     return ret;
1376 }
1377 
1378 #if defined(TARGET_WANT_OLD_SYS_SELECT)
do_old_select(abi_ulong arg1)1379 static abi_long do_old_select(abi_ulong arg1)
1380 {
1381     struct target_sel_arg_struct *sel;
1382     abi_ulong inp, outp, exp, tvp;
1383     long nsel;
1384 
1385     if (!lock_user_struct(VERIFY_READ, sel, arg1, 1)) {
1386         return -TARGET_EFAULT;
1387     }
1388 
1389     nsel = tswapal(sel->n);
1390     inp = tswapal(sel->inp);
1391     outp = tswapal(sel->outp);
1392     exp = tswapal(sel->exp);
1393     tvp = tswapal(sel->tvp);
1394 
1395     unlock_user_struct(sel, arg1, 0);
1396 
1397     return do_select(nsel, inp, outp, exp, tvp);
1398 }
1399 #endif
1400 #endif
1401 
1402 #if defined(TARGET_NR_pselect6) || defined(TARGET_NR_pselect6_time64)
do_pselect6(abi_long arg1,abi_long arg2,abi_long arg3,abi_long arg4,abi_long arg5,abi_long arg6,bool time64)1403 static abi_long do_pselect6(abi_long arg1, abi_long arg2, abi_long arg3,
1404                             abi_long arg4, abi_long arg5, abi_long arg6,
1405                             bool time64)
1406 {
1407     abi_long rfd_addr, wfd_addr, efd_addr, n, ts_addr;
1408     fd_set rfds, wfds, efds;
1409     fd_set *rfds_ptr, *wfds_ptr, *efds_ptr;
1410     struct timespec ts, *ts_ptr;
1411     abi_long ret;
1412 
1413     /*
1414      * The 6th arg is actually two args smashed together,
1415      * so we cannot use the C library.
1416      */
1417     struct {
1418         sigset_t *set;
1419         size_t size;
1420     } sig, *sig_ptr;
1421 
1422     abi_ulong arg_sigset, arg_sigsize, *arg7;
1423 
1424     n = arg1;
1425     rfd_addr = arg2;
1426     wfd_addr = arg3;
1427     efd_addr = arg4;
1428     ts_addr = arg5;
1429 
1430     ret = copy_from_user_fdset_ptr(&rfds, &rfds_ptr, rfd_addr, n);
1431     if (ret) {
1432         return ret;
1433     }
1434     ret = copy_from_user_fdset_ptr(&wfds, &wfds_ptr, wfd_addr, n);
1435     if (ret) {
1436         return ret;
1437     }
1438     ret = copy_from_user_fdset_ptr(&efds, &efds_ptr, efd_addr, n);
1439     if (ret) {
1440         return ret;
1441     }
1442 
1443     /*
1444      * This takes a timespec, and not a timeval, so we cannot
1445      * use the do_select() helper ...
1446      */
1447     if (ts_addr) {
1448         if (time64) {
1449             if (target_to_host_timespec64(&ts, ts_addr)) {
1450                 return -TARGET_EFAULT;
1451             }
1452         } else {
1453             if (target_to_host_timespec(&ts, ts_addr)) {
1454                 return -TARGET_EFAULT;
1455             }
1456         }
1457             ts_ptr = &ts;
1458     } else {
1459         ts_ptr = NULL;
1460     }
1461 
1462     /* Extract the two packed args for the sigset */
1463     sig_ptr = NULL;
1464     if (arg6) {
1465         arg7 = lock_user(VERIFY_READ, arg6, sizeof(*arg7) * 2, 1);
1466         if (!arg7) {
1467             return -TARGET_EFAULT;
1468         }
1469         arg_sigset = tswapal(arg7[0]);
1470         arg_sigsize = tswapal(arg7[1]);
1471         unlock_user(arg7, arg6, 0);
1472 
1473         if (arg_sigset) {
1474             ret = process_sigsuspend_mask(&sig.set, arg_sigset, arg_sigsize);
1475             if (ret != 0) {
1476                 return ret;
1477             }
1478             sig_ptr = &sig;
1479             sig.size = SIGSET_T_SIZE;
1480         }
1481     }
1482 
1483     ret = get_errno(safe_pselect6(n, rfds_ptr, wfds_ptr, efds_ptr,
1484                                   ts_ptr, sig_ptr));
1485 
1486     if (sig_ptr) {
1487         finish_sigsuspend_mask(ret);
1488     }
1489 
1490     if (!is_error(ret)) {
1491         if (rfd_addr && copy_to_user_fdset(rfd_addr, &rfds, n)) {
1492             return -TARGET_EFAULT;
1493         }
1494         if (wfd_addr && copy_to_user_fdset(wfd_addr, &wfds, n)) {
1495             return -TARGET_EFAULT;
1496         }
1497         if (efd_addr && copy_to_user_fdset(efd_addr, &efds, n)) {
1498             return -TARGET_EFAULT;
1499         }
1500         if (time64) {
1501             if (ts_addr && host_to_target_timespec64(ts_addr, &ts)) {
1502                 return -TARGET_EFAULT;
1503             }
1504         } else {
1505             if (ts_addr && host_to_target_timespec(ts_addr, &ts)) {
1506                 return -TARGET_EFAULT;
1507             }
1508         }
1509     }
1510     return ret;
1511 }
1512 #endif
1513 
1514 #if defined(TARGET_NR_poll) || defined(TARGET_NR_ppoll) || \
1515     defined(TARGET_NR_ppoll_time64)
do_ppoll(abi_long arg1,abi_long arg2,abi_long arg3,abi_long arg4,abi_long arg5,bool ppoll,bool time64)1516 static abi_long do_ppoll(abi_long arg1, abi_long arg2, abi_long arg3,
1517                          abi_long arg4, abi_long arg5, bool ppoll, bool time64)
1518 {
1519     struct target_pollfd *target_pfd;
1520     unsigned int nfds = arg2;
1521     struct pollfd *pfd;
1522     unsigned int i;
1523     abi_long ret;
1524 
1525     pfd = NULL;
1526     target_pfd = NULL;
1527     if (nfds) {
1528         if (nfds > (INT_MAX / sizeof(struct target_pollfd))) {
1529             return -TARGET_EINVAL;
1530         }
1531         target_pfd = lock_user(VERIFY_WRITE, arg1,
1532                                sizeof(struct target_pollfd) * nfds, 1);
1533         if (!target_pfd) {
1534             return -TARGET_EFAULT;
1535         }
1536 
1537         pfd = alloca(sizeof(struct pollfd) * nfds);
1538         for (i = 0; i < nfds; i++) {
1539             pfd[i].fd = tswap32(target_pfd[i].fd);
1540             pfd[i].events = tswap16(target_pfd[i].events);
1541         }
1542     }
1543     if (ppoll) {
1544         struct timespec _timeout_ts, *timeout_ts = &_timeout_ts;
1545         sigset_t *set = NULL;
1546 
1547         if (arg3) {
1548             if (time64) {
1549                 if (target_to_host_timespec64(timeout_ts, arg3)) {
1550                     unlock_user(target_pfd, arg1, 0);
1551                     return -TARGET_EFAULT;
1552                 }
1553             } else {
1554                 if (target_to_host_timespec(timeout_ts, arg3)) {
1555                     unlock_user(target_pfd, arg1, 0);
1556                     return -TARGET_EFAULT;
1557                 }
1558             }
1559         } else {
1560             timeout_ts = NULL;
1561         }
1562 
1563         if (arg4) {
1564             ret = process_sigsuspend_mask(&set, arg4, arg5);
1565             if (ret != 0) {
1566                 unlock_user(target_pfd, arg1, 0);
1567                 return ret;
1568             }
1569         }
1570 
1571         ret = get_errno(safe_ppoll(pfd, nfds, timeout_ts,
1572                                    set, SIGSET_T_SIZE));
1573 
1574         if (set) {
1575             finish_sigsuspend_mask(ret);
1576         }
1577         if (!is_error(ret) && arg3) {
1578             if (time64) {
1579                 if (host_to_target_timespec64(arg3, timeout_ts)) {
1580                     return -TARGET_EFAULT;
1581                 }
1582             } else {
1583                 if (host_to_target_timespec(arg3, timeout_ts)) {
1584                     return -TARGET_EFAULT;
1585                 }
1586             }
1587         }
1588     } else {
1589           struct timespec ts, *pts;
1590 
1591           if (arg3 >= 0) {
1592               /* Convert ms to secs, ns */
1593               ts.tv_sec = arg3 / 1000;
1594               ts.tv_nsec = (arg3 % 1000) * 1000000LL;
1595               pts = &ts;
1596           } else {
1597               /* -ve poll() timeout means "infinite" */
1598               pts = NULL;
1599           }
1600           ret = get_errno(safe_ppoll(pfd, nfds, pts, NULL, 0));
1601     }
1602 
1603     if (!is_error(ret)) {
1604         for (i = 0; i < nfds; i++) {
1605             target_pfd[i].revents = tswap16(pfd[i].revents);
1606         }
1607     }
1608     unlock_user(target_pfd, arg1, sizeof(struct target_pollfd) * nfds);
1609     return ret;
1610 }
1611 #endif
1612 
do_pipe(CPUArchState * cpu_env,abi_ulong pipedes,int flags,int is_pipe2)1613 static abi_long do_pipe(CPUArchState *cpu_env, abi_ulong pipedes,
1614                         int flags, int is_pipe2)
1615 {
1616     int host_pipe[2];
1617     abi_long ret;
1618     ret = pipe2(host_pipe, flags);
1619 
1620     if (is_error(ret))
1621         return get_errno(ret);
1622 
1623     /* Several targets have special calling conventions for the original
1624        pipe syscall, but didn't replicate this into the pipe2 syscall.  */
1625     if (!is_pipe2) {
1626 #if defined(TARGET_ALPHA)
1627         cpu_env->ir[IR_A4] = host_pipe[1];
1628         return host_pipe[0];
1629 #elif defined(TARGET_MIPS)
1630         cpu_env->active_tc.gpr[3] = host_pipe[1];
1631         return host_pipe[0];
1632 #elif defined(TARGET_SH4)
1633         cpu_env->gregs[1] = host_pipe[1];
1634         return host_pipe[0];
1635 #elif defined(TARGET_SPARC)
1636         cpu_env->regwptr[1] = host_pipe[1];
1637         return host_pipe[0];
1638 #endif
1639     }
1640 
1641     if (put_user_s32(host_pipe[0], pipedes)
1642         || put_user_s32(host_pipe[1], pipedes + sizeof(abi_int)))
1643         return -TARGET_EFAULT;
1644     return get_errno(ret);
1645 }
1646 
target_to_host_sockaddr(int fd,struct sockaddr * addr,abi_ulong target_addr,socklen_t len)1647 static inline abi_long target_to_host_sockaddr(int fd, struct sockaddr *addr,
1648                                                abi_ulong target_addr,
1649                                                socklen_t len)
1650 {
1651     const socklen_t unix_maxlen = sizeof (struct sockaddr_un);
1652     sa_family_t sa_family;
1653     struct target_sockaddr *target_saddr;
1654 
1655     if (fd_trans_target_to_host_addr(fd)) {
1656         return fd_trans_target_to_host_addr(fd)(addr, target_addr, len);
1657     }
1658 
1659     target_saddr = lock_user(VERIFY_READ, target_addr, len, 1);
1660     if (!target_saddr)
1661         return -TARGET_EFAULT;
1662 
1663     sa_family = tswap16(target_saddr->sa_family);
1664 
1665     /* Oops. The caller might send a incomplete sun_path; sun_path
1666      * must be terminated by \0 (see the manual page), but
1667      * unfortunately it is quite common to specify sockaddr_un
1668      * length as "strlen(x->sun_path)" while it should be
1669      * "strlen(...) + 1". We'll fix that here if needed.
1670      * Linux kernel has a similar feature.
1671      */
1672 
1673     if (sa_family == AF_UNIX) {
1674         if (len < unix_maxlen && len > 0) {
1675             char *cp = (char*)target_saddr;
1676 
1677             if ( cp[len-1] && !cp[len] )
1678                 len++;
1679         }
1680         if (len > unix_maxlen)
1681             len = unix_maxlen;
1682     }
1683 
1684     memcpy(addr, target_saddr, len);
1685     addr->sa_family = sa_family;
1686     if (sa_family == AF_NETLINK) {
1687         struct sockaddr_nl *nladdr;
1688 
1689         nladdr = (struct sockaddr_nl *)addr;
1690         nladdr->nl_pid = tswap32(nladdr->nl_pid);
1691         nladdr->nl_groups = tswap32(nladdr->nl_groups);
1692     } else if (sa_family == AF_PACKET) {
1693 	struct target_sockaddr_ll *lladdr;
1694 
1695 	lladdr = (struct target_sockaddr_ll *)addr;
1696 	lladdr->sll_ifindex = tswap32(lladdr->sll_ifindex);
1697 	lladdr->sll_hatype = tswap16(lladdr->sll_hatype);
1698     } else if (sa_family == AF_INET6) {
1699         struct sockaddr_in6 *in6addr;
1700 
1701         in6addr = (struct sockaddr_in6 *)addr;
1702         in6addr->sin6_scope_id = tswap32(in6addr->sin6_scope_id);
1703     }
1704     unlock_user(target_saddr, target_addr, 0);
1705 
1706     return 0;
1707 }
1708 
host_to_target_sockaddr(abi_ulong target_addr,struct sockaddr * addr,socklen_t len)1709 static inline abi_long host_to_target_sockaddr(abi_ulong target_addr,
1710                                                struct sockaddr *addr,
1711                                                socklen_t len)
1712 {
1713     struct target_sockaddr *target_saddr;
1714 
1715     if (len == 0) {
1716         return 0;
1717     }
1718     assert(addr);
1719 
1720     target_saddr = lock_user(VERIFY_WRITE, target_addr, len, 0);
1721     if (!target_saddr)
1722         return -TARGET_EFAULT;
1723     memcpy(target_saddr, addr, len);
1724     if (len >= offsetof(struct target_sockaddr, sa_family) +
1725         sizeof(target_saddr->sa_family)) {
1726         target_saddr->sa_family = tswap16(addr->sa_family);
1727     }
1728     if (addr->sa_family == AF_NETLINK &&
1729         len >= sizeof(struct target_sockaddr_nl)) {
1730         struct target_sockaddr_nl *target_nl =
1731                (struct target_sockaddr_nl *)target_saddr;
1732         target_nl->nl_pid = tswap32(target_nl->nl_pid);
1733         target_nl->nl_groups = tswap32(target_nl->nl_groups);
1734     } else if (addr->sa_family == AF_PACKET) {
1735         struct sockaddr_ll *target_ll = (struct sockaddr_ll *)target_saddr;
1736         target_ll->sll_ifindex = tswap32(target_ll->sll_ifindex);
1737         target_ll->sll_hatype = tswap16(target_ll->sll_hatype);
1738     } else if (addr->sa_family == AF_INET6 &&
1739                len >= sizeof(struct target_sockaddr_in6)) {
1740         struct target_sockaddr_in6 *target_in6 =
1741                (struct target_sockaddr_in6 *)target_saddr;
1742         target_in6->sin6_scope_id = tswap16(target_in6->sin6_scope_id);
1743     }
1744     unlock_user(target_saddr, target_addr, len);
1745 
1746     return 0;
1747 }
1748 
target_to_host_cmsg(struct msghdr * msgh,struct target_msghdr * target_msgh)1749 static inline abi_long target_to_host_cmsg(struct msghdr *msgh,
1750                                            struct target_msghdr *target_msgh)
1751 {
1752     struct cmsghdr *cmsg = CMSG_FIRSTHDR(msgh);
1753     abi_long msg_controllen;
1754     abi_ulong target_cmsg_addr;
1755     struct target_cmsghdr *target_cmsg, *target_cmsg_start;
1756     socklen_t space = 0;
1757 
1758     msg_controllen = tswapal(target_msgh->msg_controllen);
1759     if (msg_controllen < sizeof (struct target_cmsghdr))
1760         goto the_end;
1761     target_cmsg_addr = tswapal(target_msgh->msg_control);
1762     target_cmsg = lock_user(VERIFY_READ, target_cmsg_addr, msg_controllen, 1);
1763     target_cmsg_start = target_cmsg;
1764     if (!target_cmsg)
1765         return -TARGET_EFAULT;
1766 
1767     while (cmsg && target_cmsg) {
1768         void *data = CMSG_DATA(cmsg);
1769         void *target_data = TARGET_CMSG_DATA(target_cmsg);
1770 
1771         int len = tswapal(target_cmsg->cmsg_len)
1772             - sizeof(struct target_cmsghdr);
1773 
1774         space += CMSG_SPACE(len);
1775         if (space > msgh->msg_controllen) {
1776             space -= CMSG_SPACE(len);
1777             /* This is a QEMU bug, since we allocated the payload
1778              * area ourselves (unlike overflow in host-to-target
1779              * conversion, which is just the guest giving us a buffer
1780              * that's too small). It can't happen for the payload types
1781              * we currently support; if it becomes an issue in future
1782              * we would need to improve our allocation strategy to
1783              * something more intelligent than "twice the size of the
1784              * target buffer we're reading from".
1785              */
1786             qemu_log_mask(LOG_UNIMP,
1787                           ("Unsupported ancillary data %d/%d: "
1788                            "unhandled msg size\n"),
1789                           tswap32(target_cmsg->cmsg_level),
1790                           tswap32(target_cmsg->cmsg_type));
1791             break;
1792         }
1793 
1794         if (tswap32(target_cmsg->cmsg_level) == TARGET_SOL_SOCKET) {
1795             cmsg->cmsg_level = SOL_SOCKET;
1796         } else {
1797             cmsg->cmsg_level = tswap32(target_cmsg->cmsg_level);
1798         }
1799         cmsg->cmsg_type = tswap32(target_cmsg->cmsg_type);
1800         cmsg->cmsg_len = CMSG_LEN(len);
1801 
1802         if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_RIGHTS) {
1803             int *fd = (int *)data;
1804             int *target_fd = (int *)target_data;
1805             int i, numfds = len / sizeof(int);
1806 
1807             for (i = 0; i < numfds; i++) {
1808                 __get_user(fd[i], target_fd + i);
1809             }
1810         } else if (cmsg->cmsg_level == SOL_SOCKET
1811                &&  cmsg->cmsg_type == SCM_CREDENTIALS) {
1812             struct ucred *cred = (struct ucred *)data;
1813             struct target_ucred *target_cred =
1814                 (struct target_ucred *)target_data;
1815 
1816             __get_user(cred->pid, &target_cred->pid);
1817             __get_user(cred->uid, &target_cred->uid);
1818             __get_user(cred->gid, &target_cred->gid);
1819         } else if (cmsg->cmsg_level == SOL_ALG) {
1820             uint32_t *dst = (uint32_t *)data;
1821 
1822             memcpy(dst, target_data, len);
1823             /* fix endianness of first 32-bit word */
1824             if (len >= sizeof(uint32_t)) {
1825                 *dst = tswap32(*dst);
1826             }
1827         } else {
1828             qemu_log_mask(LOG_UNIMP, "Unsupported ancillary data: %d/%d\n",
1829                           cmsg->cmsg_level, cmsg->cmsg_type);
1830             memcpy(data, target_data, len);
1831         }
1832 
1833         cmsg = CMSG_NXTHDR(msgh, cmsg);
1834         target_cmsg = TARGET_CMSG_NXTHDR(target_msgh, target_cmsg,
1835                                          target_cmsg_start);
1836     }
1837     unlock_user(target_cmsg, target_cmsg_addr, 0);
1838  the_end:
1839     msgh->msg_controllen = space;
1840     return 0;
1841 }
1842 
host_to_target_cmsg(struct target_msghdr * target_msgh,struct msghdr * msgh)1843 static inline abi_long host_to_target_cmsg(struct target_msghdr *target_msgh,
1844                                            struct msghdr *msgh)
1845 {
1846     struct cmsghdr *cmsg = CMSG_FIRSTHDR(msgh);
1847     abi_long msg_controllen;
1848     abi_ulong target_cmsg_addr;
1849     struct target_cmsghdr *target_cmsg, *target_cmsg_start;
1850     socklen_t space = 0;
1851 
1852     msg_controllen = tswapal(target_msgh->msg_controllen);
1853     if (msg_controllen < sizeof (struct target_cmsghdr))
1854         goto the_end;
1855     target_cmsg_addr = tswapal(target_msgh->msg_control);
1856     target_cmsg = lock_user(VERIFY_WRITE, target_cmsg_addr, msg_controllen, 0);
1857     target_cmsg_start = target_cmsg;
1858     if (!target_cmsg)
1859         return -TARGET_EFAULT;
1860 
1861     while (cmsg && target_cmsg) {
1862         void *data = CMSG_DATA(cmsg);
1863         void *target_data = TARGET_CMSG_DATA(target_cmsg);
1864 
1865         int len = cmsg->cmsg_len - sizeof(struct cmsghdr);
1866         int tgt_len, tgt_space;
1867 
1868         /* We never copy a half-header but may copy half-data;
1869          * this is Linux's behaviour in put_cmsg(). Note that
1870          * truncation here is a guest problem (which we report
1871          * to the guest via the CTRUNC bit), unlike truncation
1872          * in target_to_host_cmsg, which is a QEMU bug.
1873          */
1874         if (msg_controllen < sizeof(struct target_cmsghdr)) {
1875             target_msgh->msg_flags |= tswap32(MSG_CTRUNC);
1876             break;
1877         }
1878 
1879         if (cmsg->cmsg_level == SOL_SOCKET) {
1880             target_cmsg->cmsg_level = tswap32(TARGET_SOL_SOCKET);
1881         } else {
1882             target_cmsg->cmsg_level = tswap32(cmsg->cmsg_level);
1883         }
1884         target_cmsg->cmsg_type = tswap32(cmsg->cmsg_type);
1885 
1886         /* Payload types which need a different size of payload on
1887          * the target must adjust tgt_len here.
1888          */
1889         tgt_len = len;
1890         switch (cmsg->cmsg_level) {
1891         case SOL_SOCKET:
1892             switch (cmsg->cmsg_type) {
1893             case SO_TIMESTAMP:
1894                 tgt_len = sizeof(struct target_timeval);
1895                 break;
1896             default:
1897                 break;
1898             }
1899             break;
1900         default:
1901             break;
1902         }
1903 
1904         if (msg_controllen < TARGET_CMSG_LEN(tgt_len)) {
1905             target_msgh->msg_flags |= tswap32(MSG_CTRUNC);
1906             tgt_len = msg_controllen - sizeof(struct target_cmsghdr);
1907         }
1908 
1909         /* We must now copy-and-convert len bytes of payload
1910          * into tgt_len bytes of destination space. Bear in mind
1911          * that in both source and destination we may be dealing
1912          * with a truncated value!
1913          */
1914         switch (cmsg->cmsg_level) {
1915         case SOL_SOCKET:
1916             switch (cmsg->cmsg_type) {
1917             case SCM_RIGHTS:
1918             {
1919                 int *fd = (int *)data;
1920                 int *target_fd = (int *)target_data;
1921                 int i, numfds = tgt_len / sizeof(int);
1922 
1923                 for (i = 0; i < numfds; i++) {
1924                     __put_user(fd[i], target_fd + i);
1925                 }
1926                 break;
1927             }
1928             case SO_TIMESTAMP:
1929             {
1930                 struct timeval *tv = (struct timeval *)data;
1931                 struct target_timeval *target_tv =
1932                     (struct target_timeval *)target_data;
1933 
1934                 if (len != sizeof(struct timeval) ||
1935                     tgt_len != sizeof(struct target_timeval)) {
1936                     goto unimplemented;
1937                 }
1938 
1939                 /* copy struct timeval to target */
1940                 __put_user(tv->tv_sec, &target_tv->tv_sec);
1941                 __put_user(tv->tv_usec, &target_tv->tv_usec);
1942                 break;
1943             }
1944             case SCM_CREDENTIALS:
1945             {
1946                 struct ucred *cred = (struct ucred *)data;
1947                 struct target_ucred *target_cred =
1948                     (struct target_ucred *)target_data;
1949 
1950                 __put_user(cred->pid, &target_cred->pid);
1951                 __put_user(cred->uid, &target_cred->uid);
1952                 __put_user(cred->gid, &target_cred->gid);
1953                 break;
1954             }
1955             default:
1956                 goto unimplemented;
1957             }
1958             break;
1959 
1960         case SOL_IP:
1961             switch (cmsg->cmsg_type) {
1962             case IP_TTL:
1963             {
1964                 uint32_t *v = (uint32_t *)data;
1965                 uint32_t *t_int = (uint32_t *)target_data;
1966 
1967                 if (len != sizeof(uint32_t) ||
1968                     tgt_len != sizeof(uint32_t)) {
1969                     goto unimplemented;
1970                 }
1971                 __put_user(*v, t_int);
1972                 break;
1973             }
1974             case IP_RECVERR:
1975             {
1976                 struct errhdr_t {
1977                    struct sock_extended_err ee;
1978                    struct sockaddr_in offender;
1979                 };
1980                 struct errhdr_t *errh = (struct errhdr_t *)data;
1981                 struct errhdr_t *target_errh =
1982                     (struct errhdr_t *)target_data;
1983 
1984                 if (len != sizeof(struct errhdr_t) ||
1985                     tgt_len != sizeof(struct errhdr_t)) {
1986                     goto unimplemented;
1987                 }
1988                 __put_user(errh->ee.ee_errno, &target_errh->ee.ee_errno);
1989                 __put_user(errh->ee.ee_origin, &target_errh->ee.ee_origin);
1990                 __put_user(errh->ee.ee_type,  &target_errh->ee.ee_type);
1991                 __put_user(errh->ee.ee_code, &target_errh->ee.ee_code);
1992                 __put_user(errh->ee.ee_pad, &target_errh->ee.ee_pad);
1993                 __put_user(errh->ee.ee_info, &target_errh->ee.ee_info);
1994                 __put_user(errh->ee.ee_data, &target_errh->ee.ee_data);
1995                 host_to_target_sockaddr((unsigned long) &target_errh->offender,
1996                     (void *) &errh->offender, sizeof(errh->offender));
1997                 break;
1998             }
1999             default:
2000                 goto unimplemented;
2001             }
2002             break;
2003 
2004         case SOL_IPV6:
2005             switch (cmsg->cmsg_type) {
2006             case IPV6_HOPLIMIT:
2007             {
2008                 uint32_t *v = (uint32_t *)data;
2009                 uint32_t *t_int = (uint32_t *)target_data;
2010 
2011                 if (len != sizeof(uint32_t) ||
2012                     tgt_len != sizeof(uint32_t)) {
2013                     goto unimplemented;
2014                 }
2015                 __put_user(*v, t_int);
2016                 break;
2017             }
2018             case IPV6_RECVERR:
2019             {
2020                 struct errhdr6_t {
2021                    struct sock_extended_err ee;
2022                    struct sockaddr_in6 offender;
2023                 };
2024                 struct errhdr6_t *errh = (struct errhdr6_t *)data;
2025                 struct errhdr6_t *target_errh =
2026                     (struct errhdr6_t *)target_data;
2027 
2028                 if (len != sizeof(struct errhdr6_t) ||
2029                     tgt_len != sizeof(struct errhdr6_t)) {
2030                     goto unimplemented;
2031                 }
2032                 __put_user(errh->ee.ee_errno, &target_errh->ee.ee_errno);
2033                 __put_user(errh->ee.ee_origin, &target_errh->ee.ee_origin);
2034                 __put_user(errh->ee.ee_type,  &target_errh->ee.ee_type);
2035                 __put_user(errh->ee.ee_code, &target_errh->ee.ee_code);
2036                 __put_user(errh->ee.ee_pad, &target_errh->ee.ee_pad);
2037                 __put_user(errh->ee.ee_info, &target_errh->ee.ee_info);
2038                 __put_user(errh->ee.ee_data, &target_errh->ee.ee_data);
2039                 host_to_target_sockaddr((unsigned long) &target_errh->offender,
2040                     (void *) &errh->offender, sizeof(errh->offender));
2041                 break;
2042             }
2043             default:
2044                 goto unimplemented;
2045             }
2046             break;
2047 
2048         default:
2049         unimplemented:
2050             qemu_log_mask(LOG_UNIMP, "Unsupported ancillary data: %d/%d\n",
2051                           cmsg->cmsg_level, cmsg->cmsg_type);
2052             memcpy(target_data, data, MIN(len, tgt_len));
2053             if (tgt_len > len) {
2054                 memset(target_data + len, 0, tgt_len - len);
2055             }
2056         }
2057 
2058         target_cmsg->cmsg_len = tswapal(TARGET_CMSG_LEN(tgt_len));
2059         tgt_space = TARGET_CMSG_SPACE(tgt_len);
2060         if (msg_controllen < tgt_space) {
2061             tgt_space = msg_controllen;
2062         }
2063         msg_controllen -= tgt_space;
2064         space += tgt_space;
2065         cmsg = CMSG_NXTHDR(msgh, cmsg);
2066         target_cmsg = TARGET_CMSG_NXTHDR(target_msgh, target_cmsg,
2067                                          target_cmsg_start);
2068     }
2069     unlock_user(target_cmsg, target_cmsg_addr, space);
2070  the_end:
2071     target_msgh->msg_controllen = tswapal(space);
2072     return 0;
2073 }
2074 
2075 /* do_setsockopt() Must return target values and target errnos. */
do_setsockopt(int sockfd,int level,int optname,abi_ulong optval_addr,socklen_t optlen)2076 static abi_long do_setsockopt(int sockfd, int level, int optname,
2077                               abi_ulong optval_addr, socklen_t optlen)
2078 {
2079     abi_long ret;
2080     int val;
2081 
2082     switch(level) {
2083     case SOL_TCP:
2084     case SOL_UDP:
2085         /* TCP and UDP options all take an 'int' value.  */
2086         if (optlen < sizeof(uint32_t))
2087             return -TARGET_EINVAL;
2088 
2089         if (get_user_u32(val, optval_addr))
2090             return -TARGET_EFAULT;
2091         ret = get_errno(setsockopt(sockfd, level, optname, &val, sizeof(val)));
2092         break;
2093     case SOL_IP:
2094         switch(optname) {
2095         case IP_TOS:
2096         case IP_TTL:
2097         case IP_HDRINCL:
2098         case IP_ROUTER_ALERT:
2099         case IP_RECVOPTS:
2100         case IP_RETOPTS:
2101         case IP_PKTINFO:
2102         case IP_MTU_DISCOVER:
2103         case IP_RECVERR:
2104         case IP_RECVTTL:
2105         case IP_RECVTOS:
2106 #ifdef IP_FREEBIND
2107         case IP_FREEBIND:
2108 #endif
2109         case IP_MULTICAST_TTL:
2110         case IP_MULTICAST_LOOP:
2111             val = 0;
2112             if (optlen >= sizeof(uint32_t)) {
2113                 if (get_user_u32(val, optval_addr))
2114                     return -TARGET_EFAULT;
2115             } else if (optlen >= 1) {
2116                 if (get_user_u8(val, optval_addr))
2117                     return -TARGET_EFAULT;
2118             }
2119             ret = get_errno(setsockopt(sockfd, level, optname, &val, sizeof(val)));
2120             break;
2121         case IP_ADD_MEMBERSHIP:
2122         case IP_DROP_MEMBERSHIP:
2123         {
2124             struct ip_mreqn ip_mreq;
2125             struct target_ip_mreqn *target_smreqn;
2126 
2127             QEMU_BUILD_BUG_ON(sizeof(struct ip_mreq) !=
2128                               sizeof(struct target_ip_mreq));
2129 
2130             if (optlen < sizeof (struct target_ip_mreq) ||
2131                 optlen > sizeof (struct target_ip_mreqn)) {
2132                 return -TARGET_EINVAL;
2133             }
2134 
2135             target_smreqn = lock_user(VERIFY_READ, optval_addr, optlen, 1);
2136             if (!target_smreqn) {
2137                 return -TARGET_EFAULT;
2138             }
2139             ip_mreq.imr_multiaddr.s_addr = target_smreqn->imr_multiaddr.s_addr;
2140             ip_mreq.imr_address.s_addr = target_smreqn->imr_address.s_addr;
2141             if (optlen == sizeof(struct target_ip_mreqn)) {
2142                 ip_mreq.imr_ifindex = tswapal(target_smreqn->imr_ifindex);
2143                 optlen = sizeof(struct ip_mreqn);
2144             }
2145             unlock_user(target_smreqn, optval_addr, 0);
2146 
2147             ret = get_errno(setsockopt(sockfd, level, optname, &ip_mreq, optlen));
2148             break;
2149         }
2150         case IP_BLOCK_SOURCE:
2151         case IP_UNBLOCK_SOURCE:
2152         case IP_ADD_SOURCE_MEMBERSHIP:
2153         case IP_DROP_SOURCE_MEMBERSHIP:
2154         {
2155             struct ip_mreq_source *ip_mreq_source;
2156 
2157             if (optlen != sizeof (struct target_ip_mreq_source))
2158                 return -TARGET_EINVAL;
2159 
2160             ip_mreq_source = lock_user(VERIFY_READ, optval_addr, optlen, 1);
2161             if (!ip_mreq_source) {
2162                 return -TARGET_EFAULT;
2163             }
2164             ret = get_errno(setsockopt(sockfd, level, optname, ip_mreq_source, optlen));
2165             unlock_user (ip_mreq_source, optval_addr, 0);
2166             break;
2167         }
2168         default:
2169             goto unimplemented;
2170         }
2171         break;
2172     case SOL_IPV6:
2173         switch (optname) {
2174         case IPV6_MTU_DISCOVER:
2175         case IPV6_MTU:
2176         case IPV6_V6ONLY:
2177         case IPV6_RECVPKTINFO:
2178         case IPV6_UNICAST_HOPS:
2179         case IPV6_MULTICAST_HOPS:
2180         case IPV6_MULTICAST_LOOP:
2181         case IPV6_RECVERR:
2182         case IPV6_RECVHOPLIMIT:
2183         case IPV6_2292HOPLIMIT:
2184         case IPV6_CHECKSUM:
2185         case IPV6_ADDRFORM:
2186         case IPV6_2292PKTINFO:
2187         case IPV6_RECVTCLASS:
2188         case IPV6_RECVRTHDR:
2189         case IPV6_2292RTHDR:
2190         case IPV6_RECVHOPOPTS:
2191         case IPV6_2292HOPOPTS:
2192         case IPV6_RECVDSTOPTS:
2193         case IPV6_2292DSTOPTS:
2194         case IPV6_TCLASS:
2195         case IPV6_ADDR_PREFERENCES:
2196 #ifdef IPV6_RECVPATHMTU
2197         case IPV6_RECVPATHMTU:
2198 #endif
2199 #ifdef IPV6_TRANSPARENT
2200         case IPV6_TRANSPARENT:
2201 #endif
2202 #ifdef IPV6_FREEBIND
2203         case IPV6_FREEBIND:
2204 #endif
2205 #ifdef IPV6_RECVORIGDSTADDR
2206         case IPV6_RECVORIGDSTADDR:
2207 #endif
2208             val = 0;
2209             if (optlen < sizeof(uint32_t)) {
2210                 return -TARGET_EINVAL;
2211             }
2212             if (get_user_u32(val, optval_addr)) {
2213                 return -TARGET_EFAULT;
2214             }
2215             ret = get_errno(setsockopt(sockfd, level, optname,
2216                                        &val, sizeof(val)));
2217             break;
2218         case IPV6_PKTINFO:
2219         {
2220             struct in6_pktinfo pki;
2221 
2222             if (optlen < sizeof(pki)) {
2223                 return -TARGET_EINVAL;
2224             }
2225 
2226             if (copy_from_user(&pki, optval_addr, sizeof(pki))) {
2227                 return -TARGET_EFAULT;
2228             }
2229 
2230             pki.ipi6_ifindex = tswap32(pki.ipi6_ifindex);
2231 
2232             ret = get_errno(setsockopt(sockfd, level, optname,
2233                                        &pki, sizeof(pki)));
2234             break;
2235         }
2236         case IPV6_ADD_MEMBERSHIP:
2237         case IPV6_DROP_MEMBERSHIP:
2238         {
2239             struct ipv6_mreq ipv6mreq;
2240 
2241             if (optlen < sizeof(ipv6mreq)) {
2242                 return -TARGET_EINVAL;
2243             }
2244 
2245             if (copy_from_user(&ipv6mreq, optval_addr, sizeof(ipv6mreq))) {
2246                 return -TARGET_EFAULT;
2247             }
2248 
2249             ipv6mreq.ipv6mr_interface = tswap32(ipv6mreq.ipv6mr_interface);
2250 
2251             ret = get_errno(setsockopt(sockfd, level, optname,
2252                                        &ipv6mreq, sizeof(ipv6mreq)));
2253             break;
2254         }
2255         default:
2256             goto unimplemented;
2257         }
2258         break;
2259     case SOL_ICMPV6:
2260         switch (optname) {
2261         case ICMPV6_FILTER:
2262         {
2263             struct icmp6_filter icmp6f;
2264 
2265             if (optlen > sizeof(icmp6f)) {
2266                 optlen = sizeof(icmp6f);
2267             }
2268 
2269             if (copy_from_user(&icmp6f, optval_addr, optlen)) {
2270                 return -TARGET_EFAULT;
2271             }
2272 
2273             for (val = 0; val < 8; val++) {
2274                 icmp6f.data[val] = tswap32(icmp6f.data[val]);
2275             }
2276 
2277             ret = get_errno(setsockopt(sockfd, level, optname,
2278                                        &icmp6f, optlen));
2279             break;
2280         }
2281         default:
2282             goto unimplemented;
2283         }
2284         break;
2285     case SOL_RAW:
2286         switch (optname) {
2287         case ICMP_FILTER:
2288         case IPV6_CHECKSUM:
2289             /* those take an u32 value */
2290             if (optlen < sizeof(uint32_t)) {
2291                 return -TARGET_EINVAL;
2292             }
2293 
2294             if (get_user_u32(val, optval_addr)) {
2295                 return -TARGET_EFAULT;
2296             }
2297             ret = get_errno(setsockopt(sockfd, level, optname,
2298                                        &val, sizeof(val)));
2299             break;
2300 
2301         default:
2302             goto unimplemented;
2303         }
2304         break;
2305 #if defined(SOL_ALG) && defined(ALG_SET_KEY) && defined(ALG_SET_AEAD_AUTHSIZE)
2306     case SOL_ALG:
2307         switch (optname) {
2308         case ALG_SET_KEY:
2309         {
2310             char *alg_key = lock_user(VERIFY_READ, optval_addr, optlen, 1);
2311             if (!alg_key) {
2312                 return -TARGET_EFAULT;
2313             }
2314             ret = get_errno(setsockopt(sockfd, level, optname,
2315                                        alg_key, optlen));
2316             unlock_user(alg_key, optval_addr, optlen);
2317             break;
2318         }
2319         case ALG_SET_AEAD_AUTHSIZE:
2320         {
2321             ret = get_errno(setsockopt(sockfd, level, optname,
2322                                        NULL, optlen));
2323             break;
2324         }
2325         default:
2326             goto unimplemented;
2327         }
2328         break;
2329 #endif
2330     case TARGET_SOL_SOCKET:
2331         switch (optname) {
2332         case TARGET_SO_RCVTIMEO:
2333         case TARGET_SO_SNDTIMEO:
2334         {
2335                 struct timeval tv;
2336 
2337                 if (optlen != sizeof(struct target_timeval)) {
2338                     return -TARGET_EINVAL;
2339                 }
2340 
2341                 if (copy_from_user_timeval(&tv, optval_addr)) {
2342                     return -TARGET_EFAULT;
2343                 }
2344 
2345                 ret = get_errno(setsockopt(sockfd, SOL_SOCKET,
2346                                 optname == TARGET_SO_RCVTIMEO ?
2347                                     SO_RCVTIMEO : SO_SNDTIMEO,
2348                                 &tv, sizeof(tv)));
2349                 return ret;
2350         }
2351         case TARGET_SO_ATTACH_FILTER:
2352         {
2353                 struct target_sock_fprog *tfprog;
2354                 struct target_sock_filter *tfilter;
2355                 struct sock_fprog fprog;
2356                 struct sock_filter *filter;
2357                 int i;
2358 
2359                 if (optlen != sizeof(*tfprog)) {
2360                     return -TARGET_EINVAL;
2361                 }
2362                 if (!lock_user_struct(VERIFY_READ, tfprog, optval_addr, 0)) {
2363                     return -TARGET_EFAULT;
2364                 }
2365                 if (!lock_user_struct(VERIFY_READ, tfilter,
2366                                       tswapal(tfprog->filter), 0)) {
2367                     unlock_user_struct(tfprog, optval_addr, 1);
2368                     return -TARGET_EFAULT;
2369                 }
2370 
2371                 fprog.len = tswap16(tfprog->len);
2372                 filter = g_try_new(struct sock_filter, fprog.len);
2373                 if (filter == NULL) {
2374                     unlock_user_struct(tfilter, tfprog->filter, 1);
2375                     unlock_user_struct(tfprog, optval_addr, 1);
2376                     return -TARGET_ENOMEM;
2377                 }
2378                 for (i = 0; i < fprog.len; i++) {
2379                     filter[i].code = tswap16(tfilter[i].code);
2380                     filter[i].jt = tfilter[i].jt;
2381                     filter[i].jf = tfilter[i].jf;
2382                     filter[i].k = tswap32(tfilter[i].k);
2383                 }
2384                 fprog.filter = filter;
2385 
2386                 ret = get_errno(setsockopt(sockfd, SOL_SOCKET,
2387                                 SO_ATTACH_FILTER, &fprog, sizeof(fprog)));
2388                 g_free(filter);
2389 
2390                 unlock_user_struct(tfilter, tfprog->filter, 1);
2391                 unlock_user_struct(tfprog, optval_addr, 1);
2392                 return ret;
2393         }
2394 	case TARGET_SO_BINDTODEVICE:
2395 	{
2396 		char *dev_ifname, *addr_ifname;
2397 
2398 		if (optlen > IFNAMSIZ - 1) {
2399 		    optlen = IFNAMSIZ - 1;
2400 		}
2401 		dev_ifname = lock_user(VERIFY_READ, optval_addr, optlen, 1);
2402 		if (!dev_ifname) {
2403 		    return -TARGET_EFAULT;
2404 		}
2405 		optname = SO_BINDTODEVICE;
2406 		addr_ifname = alloca(IFNAMSIZ);
2407 		memcpy(addr_ifname, dev_ifname, optlen);
2408 		addr_ifname[optlen] = 0;
2409 		ret = get_errno(setsockopt(sockfd, SOL_SOCKET, optname,
2410                                            addr_ifname, optlen));
2411 		unlock_user (dev_ifname, optval_addr, 0);
2412 		return ret;
2413 	}
2414         case TARGET_SO_LINGER:
2415         {
2416                 struct linger lg;
2417                 struct target_linger *tlg;
2418 
2419                 if (optlen != sizeof(struct target_linger)) {
2420                     return -TARGET_EINVAL;
2421                 }
2422                 if (!lock_user_struct(VERIFY_READ, tlg, optval_addr, 1)) {
2423                     return -TARGET_EFAULT;
2424                 }
2425                 __get_user(lg.l_onoff, &tlg->l_onoff);
2426                 __get_user(lg.l_linger, &tlg->l_linger);
2427                 ret = get_errno(setsockopt(sockfd, SOL_SOCKET, SO_LINGER,
2428                                 &lg, sizeof(lg)));
2429                 unlock_user_struct(tlg, optval_addr, 0);
2430                 return ret;
2431         }
2432             /* Options with 'int' argument.  */
2433         case TARGET_SO_DEBUG:
2434 		optname = SO_DEBUG;
2435 		break;
2436         case TARGET_SO_REUSEADDR:
2437 		optname = SO_REUSEADDR;
2438 		break;
2439 #ifdef SO_REUSEPORT
2440         case TARGET_SO_REUSEPORT:
2441                 optname = SO_REUSEPORT;
2442                 break;
2443 #endif
2444         case TARGET_SO_TYPE:
2445 		optname = SO_TYPE;
2446 		break;
2447         case TARGET_SO_ERROR:
2448 		optname = SO_ERROR;
2449 		break;
2450         case TARGET_SO_DONTROUTE:
2451 		optname = SO_DONTROUTE;
2452 		break;
2453         case TARGET_SO_BROADCAST:
2454 		optname = SO_BROADCAST;
2455 		break;
2456         case TARGET_SO_SNDBUF:
2457 		optname = SO_SNDBUF;
2458 		break;
2459         case TARGET_SO_SNDBUFFORCE:
2460                 optname = SO_SNDBUFFORCE;
2461                 break;
2462         case TARGET_SO_RCVBUF:
2463 		optname = SO_RCVBUF;
2464 		break;
2465         case TARGET_SO_RCVBUFFORCE:
2466                 optname = SO_RCVBUFFORCE;
2467                 break;
2468         case TARGET_SO_KEEPALIVE:
2469 		optname = SO_KEEPALIVE;
2470 		break;
2471         case TARGET_SO_OOBINLINE:
2472 		optname = SO_OOBINLINE;
2473 		break;
2474         case TARGET_SO_NO_CHECK:
2475 		optname = SO_NO_CHECK;
2476 		break;
2477         case TARGET_SO_PRIORITY:
2478 		optname = SO_PRIORITY;
2479 		break;
2480 #ifdef SO_BSDCOMPAT
2481         case TARGET_SO_BSDCOMPAT:
2482 		optname = SO_BSDCOMPAT;
2483 		break;
2484 #endif
2485         case TARGET_SO_PASSCRED:
2486 		optname = SO_PASSCRED;
2487 		break;
2488         case TARGET_SO_PASSSEC:
2489                 optname = SO_PASSSEC;
2490                 break;
2491         case TARGET_SO_TIMESTAMP:
2492 		optname = SO_TIMESTAMP;
2493 		break;
2494         case TARGET_SO_RCVLOWAT:
2495 		optname = SO_RCVLOWAT;
2496 		break;
2497         default:
2498             goto unimplemented;
2499         }
2500 	if (optlen < sizeof(uint32_t))
2501             return -TARGET_EINVAL;
2502 
2503 	if (get_user_u32(val, optval_addr))
2504             return -TARGET_EFAULT;
2505 	ret = get_errno(setsockopt(sockfd, SOL_SOCKET, optname, &val, sizeof(val)));
2506         break;
2507 #ifdef SOL_NETLINK
2508     case SOL_NETLINK:
2509         switch (optname) {
2510         case NETLINK_PKTINFO:
2511         case NETLINK_ADD_MEMBERSHIP:
2512         case NETLINK_DROP_MEMBERSHIP:
2513         case NETLINK_BROADCAST_ERROR:
2514         case NETLINK_NO_ENOBUFS:
2515 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)
2516         case NETLINK_LISTEN_ALL_NSID:
2517         case NETLINK_CAP_ACK:
2518 #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0) */
2519 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0)
2520         case NETLINK_EXT_ACK:
2521 #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) */
2522 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 20, 0)
2523         case NETLINK_GET_STRICT_CHK:
2524 #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) */
2525             break;
2526         default:
2527             goto unimplemented;
2528         }
2529         val = 0;
2530         if (optlen < sizeof(uint32_t)) {
2531             return -TARGET_EINVAL;
2532         }
2533         if (get_user_u32(val, optval_addr)) {
2534             return -TARGET_EFAULT;
2535         }
2536         ret = get_errno(setsockopt(sockfd, SOL_NETLINK, optname, &val,
2537                                    sizeof(val)));
2538         break;
2539 #endif /* SOL_NETLINK */
2540     default:
2541     unimplemented:
2542         qemu_log_mask(LOG_UNIMP, "Unsupported setsockopt level=%d optname=%d\n",
2543                       level, optname);
2544         ret = -TARGET_ENOPROTOOPT;
2545     }
2546     return ret;
2547 }
2548 
2549 /* do_getsockopt() Must return target values and target errnos. */
do_getsockopt(int sockfd,int level,int optname,abi_ulong optval_addr,abi_ulong optlen)2550 static abi_long do_getsockopt(int sockfd, int level, int optname,
2551                               abi_ulong optval_addr, abi_ulong optlen)
2552 {
2553     abi_long ret;
2554     int len, val;
2555     socklen_t lv;
2556 
2557     switch(level) {
2558     case TARGET_SOL_SOCKET:
2559         level = SOL_SOCKET;
2560         switch (optname) {
2561         /* These don't just return a single integer */
2562         case TARGET_SO_PEERNAME:
2563             goto unimplemented;
2564         case TARGET_SO_RCVTIMEO: {
2565             struct timeval tv;
2566             socklen_t tvlen;
2567 
2568             optname = SO_RCVTIMEO;
2569 
2570 get_timeout:
2571             if (get_user_u32(len, optlen)) {
2572                 return -TARGET_EFAULT;
2573             }
2574             if (len < 0) {
2575                 return -TARGET_EINVAL;
2576             }
2577 
2578             tvlen = sizeof(tv);
2579             ret = get_errno(getsockopt(sockfd, level, optname,
2580                                        &tv, &tvlen));
2581             if (ret < 0) {
2582                 return ret;
2583             }
2584             if (len > sizeof(struct target_timeval)) {
2585                 len = sizeof(struct target_timeval);
2586             }
2587             if (copy_to_user_timeval(optval_addr, &tv)) {
2588                 return -TARGET_EFAULT;
2589             }
2590             if (put_user_u32(len, optlen)) {
2591                 return -TARGET_EFAULT;
2592             }
2593             break;
2594         }
2595         case TARGET_SO_SNDTIMEO:
2596             optname = SO_SNDTIMEO;
2597             goto get_timeout;
2598         case TARGET_SO_PEERCRED: {
2599             struct ucred cr;
2600             socklen_t crlen;
2601             struct target_ucred *tcr;
2602 
2603             if (get_user_u32(len, optlen)) {
2604                 return -TARGET_EFAULT;
2605             }
2606             if (len < 0) {
2607                 return -TARGET_EINVAL;
2608             }
2609 
2610             crlen = sizeof(cr);
2611             ret = get_errno(getsockopt(sockfd, level, SO_PEERCRED,
2612                                        &cr, &crlen));
2613             if (ret < 0) {
2614                 return ret;
2615             }
2616             if (len > crlen) {
2617                 len = crlen;
2618             }
2619             if (!lock_user_struct(VERIFY_WRITE, tcr, optval_addr, 0)) {
2620                 return -TARGET_EFAULT;
2621             }
2622             __put_user(cr.pid, &tcr->pid);
2623             __put_user(cr.uid, &tcr->uid);
2624             __put_user(cr.gid, &tcr->gid);
2625             unlock_user_struct(tcr, optval_addr, 1);
2626             if (put_user_u32(len, optlen)) {
2627                 return -TARGET_EFAULT;
2628             }
2629             break;
2630         }
2631         case TARGET_SO_PEERSEC: {
2632             char *name;
2633 
2634             if (get_user_u32(len, optlen)) {
2635                 return -TARGET_EFAULT;
2636             }
2637             if (len < 0) {
2638                 return -TARGET_EINVAL;
2639             }
2640             name = lock_user(VERIFY_WRITE, optval_addr, len, 0);
2641             if (!name) {
2642                 return -TARGET_EFAULT;
2643             }
2644             lv = len;
2645             ret = get_errno(getsockopt(sockfd, level, SO_PEERSEC,
2646                                        name, &lv));
2647             if (put_user_u32(lv, optlen)) {
2648                 ret = -TARGET_EFAULT;
2649             }
2650             unlock_user(name, optval_addr, lv);
2651             break;
2652         }
2653         case TARGET_SO_LINGER:
2654         {
2655             struct linger lg;
2656             socklen_t lglen;
2657             struct target_linger *tlg;
2658 
2659             if (get_user_u32(len, optlen)) {
2660                 return -TARGET_EFAULT;
2661             }
2662             if (len < 0) {
2663                 return -TARGET_EINVAL;
2664             }
2665 
2666             lglen = sizeof(lg);
2667             ret = get_errno(getsockopt(sockfd, level, SO_LINGER,
2668                                        &lg, &lglen));
2669             if (ret < 0) {
2670                 return ret;
2671             }
2672             if (len > lglen) {
2673                 len = lglen;
2674             }
2675             if (!lock_user_struct(VERIFY_WRITE, tlg, optval_addr, 0)) {
2676                 return -TARGET_EFAULT;
2677             }
2678             __put_user(lg.l_onoff, &tlg->l_onoff);
2679             __put_user(lg.l_linger, &tlg->l_linger);
2680             unlock_user_struct(tlg, optval_addr, 1);
2681             if (put_user_u32(len, optlen)) {
2682                 return -TARGET_EFAULT;
2683             }
2684             break;
2685         }
2686         /* Options with 'int' argument.  */
2687         case TARGET_SO_DEBUG:
2688             optname = SO_DEBUG;
2689             goto int_case;
2690         case TARGET_SO_REUSEADDR:
2691             optname = SO_REUSEADDR;
2692             goto int_case;
2693 #ifdef SO_REUSEPORT
2694         case TARGET_SO_REUSEPORT:
2695             optname = SO_REUSEPORT;
2696             goto int_case;
2697 #endif
2698         case TARGET_SO_TYPE:
2699             optname = SO_TYPE;
2700             goto int_case;
2701         case TARGET_SO_ERROR:
2702             optname = SO_ERROR;
2703             goto int_case;
2704         case TARGET_SO_DONTROUTE:
2705             optname = SO_DONTROUTE;
2706             goto int_case;
2707         case TARGET_SO_BROADCAST:
2708             optname = SO_BROADCAST;
2709             goto int_case;
2710         case TARGET_SO_SNDBUF:
2711             optname = SO_SNDBUF;
2712             goto int_case;
2713         case TARGET_SO_RCVBUF:
2714             optname = SO_RCVBUF;
2715             goto int_case;
2716         case TARGET_SO_KEEPALIVE:
2717             optname = SO_KEEPALIVE;
2718             goto int_case;
2719         case TARGET_SO_OOBINLINE:
2720             optname = SO_OOBINLINE;
2721             goto int_case;
2722         case TARGET_SO_NO_CHECK:
2723             optname = SO_NO_CHECK;
2724             goto int_case;
2725         case TARGET_SO_PRIORITY:
2726             optname = SO_PRIORITY;
2727             goto int_case;
2728 #ifdef SO_BSDCOMPAT
2729         case TARGET_SO_BSDCOMPAT:
2730             optname = SO_BSDCOMPAT;
2731             goto int_case;
2732 #endif
2733         case TARGET_SO_PASSCRED:
2734             optname = SO_PASSCRED;
2735             goto int_case;
2736         case TARGET_SO_TIMESTAMP:
2737             optname = SO_TIMESTAMP;
2738             goto int_case;
2739         case TARGET_SO_RCVLOWAT:
2740             optname = SO_RCVLOWAT;
2741             goto int_case;
2742         case TARGET_SO_ACCEPTCONN:
2743             optname = SO_ACCEPTCONN;
2744             goto int_case;
2745         case TARGET_SO_PROTOCOL:
2746             optname = SO_PROTOCOL;
2747             goto int_case;
2748         case TARGET_SO_DOMAIN:
2749             optname = SO_DOMAIN;
2750             goto int_case;
2751         default:
2752             goto int_case;
2753         }
2754         break;
2755     case SOL_TCP:
2756     case SOL_UDP:
2757         /* TCP and UDP options all take an 'int' value.  */
2758     int_case:
2759         if (get_user_u32(len, optlen))
2760             return -TARGET_EFAULT;
2761         if (len < 0)
2762             return -TARGET_EINVAL;
2763         lv = sizeof(lv);
2764         ret = get_errno(getsockopt(sockfd, level, optname, &val, &lv));
2765         if (ret < 0)
2766             return ret;
2767         switch (optname) {
2768         case SO_TYPE:
2769             val = host_to_target_sock_type(val);
2770             break;
2771         case SO_ERROR:
2772             val = host_to_target_errno(val);
2773             break;
2774         }
2775         if (len > lv)
2776             len = lv;
2777         if (len == 4) {
2778             if (put_user_u32(val, optval_addr))
2779                 return -TARGET_EFAULT;
2780         } else {
2781             if (put_user_u8(val, optval_addr))
2782                 return -TARGET_EFAULT;
2783         }
2784         if (put_user_u32(len, optlen))
2785             return -TARGET_EFAULT;
2786         break;
2787     case SOL_IP:
2788         switch(optname) {
2789         case IP_TOS:
2790         case IP_TTL:
2791         case IP_HDRINCL:
2792         case IP_ROUTER_ALERT:
2793         case IP_RECVOPTS:
2794         case IP_RETOPTS:
2795         case IP_PKTINFO:
2796         case IP_MTU_DISCOVER:
2797         case IP_RECVERR:
2798         case IP_RECVTOS:
2799 #ifdef IP_FREEBIND
2800         case IP_FREEBIND:
2801 #endif
2802         case IP_MULTICAST_TTL:
2803         case IP_MULTICAST_LOOP:
2804             if (get_user_u32(len, optlen))
2805                 return -TARGET_EFAULT;
2806             if (len < 0)
2807                 return -TARGET_EINVAL;
2808             lv = sizeof(lv);
2809             ret = get_errno(getsockopt(sockfd, level, optname, &val, &lv));
2810             if (ret < 0)
2811                 return ret;
2812             if (len < sizeof(int) && len > 0 && val >= 0 && val < 255) {
2813                 len = 1;
2814                 if (put_user_u32(len, optlen)
2815                     || put_user_u8(val, optval_addr))
2816                     return -TARGET_EFAULT;
2817             } else {
2818                 if (len > sizeof(int))
2819                     len = sizeof(int);
2820                 if (put_user_u32(len, optlen)
2821                     || put_user_u32(val, optval_addr))
2822                     return -TARGET_EFAULT;
2823             }
2824             break;
2825         default:
2826             ret = -TARGET_ENOPROTOOPT;
2827             break;
2828         }
2829         break;
2830     case SOL_IPV6:
2831         switch (optname) {
2832         case IPV6_MTU_DISCOVER:
2833         case IPV6_MTU:
2834         case IPV6_V6ONLY:
2835         case IPV6_RECVPKTINFO:
2836         case IPV6_UNICAST_HOPS:
2837         case IPV6_MULTICAST_HOPS:
2838         case IPV6_MULTICAST_LOOP:
2839         case IPV6_RECVERR:
2840         case IPV6_RECVHOPLIMIT:
2841         case IPV6_2292HOPLIMIT:
2842         case IPV6_CHECKSUM:
2843         case IPV6_ADDRFORM:
2844         case IPV6_2292PKTINFO:
2845         case IPV6_RECVTCLASS:
2846         case IPV6_RECVRTHDR:
2847         case IPV6_2292RTHDR:
2848         case IPV6_RECVHOPOPTS:
2849         case IPV6_2292HOPOPTS:
2850         case IPV6_RECVDSTOPTS:
2851         case IPV6_2292DSTOPTS:
2852         case IPV6_TCLASS:
2853         case IPV6_ADDR_PREFERENCES:
2854 #ifdef IPV6_RECVPATHMTU
2855         case IPV6_RECVPATHMTU:
2856 #endif
2857 #ifdef IPV6_TRANSPARENT
2858         case IPV6_TRANSPARENT:
2859 #endif
2860 #ifdef IPV6_FREEBIND
2861         case IPV6_FREEBIND:
2862 #endif
2863 #ifdef IPV6_RECVORIGDSTADDR
2864         case IPV6_RECVORIGDSTADDR:
2865 #endif
2866             if (get_user_u32(len, optlen))
2867                 return -TARGET_EFAULT;
2868             if (len < 0)
2869                 return -TARGET_EINVAL;
2870             lv = sizeof(lv);
2871             ret = get_errno(getsockopt(sockfd, level, optname, &val, &lv));
2872             if (ret < 0)
2873                 return ret;
2874             if (len < sizeof(int) && len > 0 && val >= 0 && val < 255) {
2875                 len = 1;
2876                 if (put_user_u32(len, optlen)
2877                     || put_user_u8(val, optval_addr))
2878                     return -TARGET_EFAULT;
2879             } else {
2880                 if (len > sizeof(int))
2881                     len = sizeof(int);
2882                 if (put_user_u32(len, optlen)
2883                     || put_user_u32(val, optval_addr))
2884                     return -TARGET_EFAULT;
2885             }
2886             break;
2887         default:
2888             ret = -TARGET_ENOPROTOOPT;
2889             break;
2890         }
2891         break;
2892 #ifdef SOL_NETLINK
2893     case SOL_NETLINK:
2894         switch (optname) {
2895         case NETLINK_PKTINFO:
2896         case NETLINK_BROADCAST_ERROR:
2897         case NETLINK_NO_ENOBUFS:
2898 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)
2899         case NETLINK_LISTEN_ALL_NSID:
2900         case NETLINK_CAP_ACK:
2901 #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0) */
2902 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0)
2903         case NETLINK_EXT_ACK:
2904 #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) */
2905 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 20, 0)
2906         case NETLINK_GET_STRICT_CHK:
2907 #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) */
2908             if (get_user_u32(len, optlen)) {
2909                 return -TARGET_EFAULT;
2910             }
2911             if (len != sizeof(val)) {
2912                 return -TARGET_EINVAL;
2913             }
2914             lv = len;
2915             ret = get_errno(getsockopt(sockfd, level, optname, &val, &lv));
2916             if (ret < 0) {
2917                 return ret;
2918             }
2919             if (put_user_u32(lv, optlen)
2920                 || put_user_u32(val, optval_addr)) {
2921                 return -TARGET_EFAULT;
2922             }
2923             break;
2924 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)
2925         case NETLINK_LIST_MEMBERSHIPS:
2926         {
2927             uint32_t *results;
2928             int i;
2929             if (get_user_u32(len, optlen)) {
2930                 return -TARGET_EFAULT;
2931             }
2932             if (len < 0) {
2933                 return -TARGET_EINVAL;
2934             }
2935             results = lock_user(VERIFY_WRITE, optval_addr, len, 1);
2936             if (!results && len > 0) {
2937                 return -TARGET_EFAULT;
2938             }
2939             lv = len;
2940             ret = get_errno(getsockopt(sockfd, level, optname, results, &lv));
2941             if (ret < 0) {
2942                 unlock_user(results, optval_addr, 0);
2943                 return ret;
2944             }
2945             /* swap host endianness to target endianness. */
2946             for (i = 0; i < (len / sizeof(uint32_t)); i++) {
2947                 results[i] = tswap32(results[i]);
2948             }
2949             if (put_user_u32(lv, optlen)) {
2950                 return -TARGET_EFAULT;
2951             }
2952             unlock_user(results, optval_addr, 0);
2953             break;
2954         }
2955 #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0) */
2956         default:
2957             goto unimplemented;
2958         }
2959         break;
2960 #endif /* SOL_NETLINK */
2961     default:
2962     unimplemented:
2963         qemu_log_mask(LOG_UNIMP,
2964                       "getsockopt level=%d optname=%d not yet supported\n",
2965                       level, optname);
2966         ret = -TARGET_EOPNOTSUPP;
2967         break;
2968     }
2969     return ret;
2970 }
2971 
2972 /* Convert target low/high pair representing file offset into the host
2973  * low/high pair. This function doesn't handle offsets bigger than 64 bits
2974  * as the kernel doesn't handle them either.
2975  */
target_to_host_low_high(abi_ulong tlow,abi_ulong thigh,unsigned long * hlow,unsigned long * hhigh)2976 static void target_to_host_low_high(abi_ulong tlow,
2977                                     abi_ulong thigh,
2978                                     unsigned long *hlow,
2979                                     unsigned long *hhigh)
2980 {
2981     uint64_t off = tlow |
2982         ((unsigned long long)thigh << TARGET_LONG_BITS / 2) <<
2983         TARGET_LONG_BITS / 2;
2984 
2985     *hlow = off;
2986     *hhigh = (off >> HOST_LONG_BITS / 2) >> HOST_LONG_BITS / 2;
2987 }
2988 
lock_iovec(int type,abi_ulong target_addr,abi_ulong count,int copy)2989 static struct iovec *lock_iovec(int type, abi_ulong target_addr,
2990                                 abi_ulong count, int copy)
2991 {
2992     struct target_iovec *target_vec;
2993     struct iovec *vec;
2994     abi_ulong total_len, max_len;
2995     int i;
2996     int err = 0;
2997     bool bad_address = false;
2998 
2999     if (count == 0) {
3000         errno = 0;
3001         return NULL;
3002     }
3003     if (count > IOV_MAX) {
3004         errno = EINVAL;
3005         return NULL;
3006     }
3007 
3008     vec = g_try_new0(struct iovec, count);
3009     if (vec == NULL) {
3010         errno = ENOMEM;
3011         return NULL;
3012     }
3013 
3014     target_vec = lock_user(VERIFY_READ, target_addr,
3015                            count * sizeof(struct target_iovec), 1);
3016     if (target_vec == NULL) {
3017         err = EFAULT;
3018         goto fail2;
3019     }
3020 
3021     /* ??? If host page size > target page size, this will result in a
3022        value larger than what we can actually support.  */
3023     max_len = 0x7fffffff & TARGET_PAGE_MASK;
3024     total_len = 0;
3025 
3026     for (i = 0; i < count; i++) {
3027         abi_ulong base = tswapal(target_vec[i].iov_base);
3028         abi_long len = tswapal(target_vec[i].iov_len);
3029 
3030         if (len < 0) {
3031             err = EINVAL;
3032             goto fail;
3033         } else if (len == 0) {
3034             /* Zero length pointer is ignored.  */
3035             vec[i].iov_base = 0;
3036         } else {
3037             vec[i].iov_base = lock_user(type, base, len, copy);
3038             /* If the first buffer pointer is bad, this is a fault.  But
3039              * subsequent bad buffers will result in a partial write; this
3040              * is realized by filling the vector with null pointers and
3041              * zero lengths. */
3042             if (!vec[i].iov_base) {
3043                 if (i == 0) {
3044                     err = EFAULT;
3045                     goto fail;
3046                 } else {
3047                     bad_address = true;
3048                 }
3049             }
3050             if (bad_address) {
3051                 len = 0;
3052             }
3053             if (len > max_len - total_len) {
3054                 len = max_len - total_len;
3055             }
3056         }
3057         vec[i].iov_len = len;
3058         total_len += len;
3059     }
3060 
3061     unlock_user(target_vec, target_addr, 0);
3062     return vec;
3063 
3064  fail:
3065     while (--i >= 0) {
3066         if (tswapal(target_vec[i].iov_len) > 0) {
3067             unlock_user(vec[i].iov_base, tswapal(target_vec[i].iov_base), 0);
3068         }
3069     }
3070     unlock_user(target_vec, target_addr, 0);
3071  fail2:
3072     g_free(vec);
3073     errno = err;
3074     return NULL;
3075 }
3076 
unlock_iovec(struct iovec * vec,abi_ulong target_addr,abi_ulong count,int copy)3077 static void unlock_iovec(struct iovec *vec, abi_ulong target_addr,
3078                          abi_ulong count, int copy)
3079 {
3080     struct target_iovec *target_vec;
3081     int i;
3082 
3083     target_vec = lock_user(VERIFY_READ, target_addr,
3084                            count * sizeof(struct target_iovec), 1);
3085     if (target_vec) {
3086         for (i = 0; i < count; i++) {
3087             abi_ulong base = tswapal(target_vec[i].iov_base);
3088             abi_long len = tswapal(target_vec[i].iov_len);
3089             if (len < 0) {
3090                 break;
3091             }
3092             unlock_user(vec[i].iov_base, base, copy ? vec[i].iov_len : 0);
3093         }
3094         unlock_user(target_vec, target_addr, 0);
3095     }
3096 
3097     g_free(vec);
3098 }
3099 
target_to_host_sock_type(int * type)3100 static inline int target_to_host_sock_type(int *type)
3101 {
3102     int host_type = 0;
3103     int target_type = *type;
3104 
3105     switch (target_type & TARGET_SOCK_TYPE_MASK) {
3106     case TARGET_SOCK_DGRAM:
3107         host_type = SOCK_DGRAM;
3108         break;
3109     case TARGET_SOCK_STREAM:
3110         host_type = SOCK_STREAM;
3111         break;
3112     default:
3113         host_type = target_type & TARGET_SOCK_TYPE_MASK;
3114         break;
3115     }
3116     if (target_type & TARGET_SOCK_CLOEXEC) {
3117 #if defined(SOCK_CLOEXEC)
3118         host_type |= SOCK_CLOEXEC;
3119 #else
3120         return -TARGET_EINVAL;
3121 #endif
3122     }
3123     if (target_type & TARGET_SOCK_NONBLOCK) {
3124 #if defined(SOCK_NONBLOCK)
3125         host_type |= SOCK_NONBLOCK;
3126 #elif !defined(O_NONBLOCK)
3127         return -TARGET_EINVAL;
3128 #endif
3129     }
3130     *type = host_type;
3131     return 0;
3132 }
3133 
3134 /* Try to emulate socket type flags after socket creation.  */
sock_flags_fixup(int fd,int target_type)3135 static int sock_flags_fixup(int fd, int target_type)
3136 {
3137 #if !defined(SOCK_NONBLOCK) && defined(O_NONBLOCK)
3138     if (target_type & TARGET_SOCK_NONBLOCK) {
3139         int flags = fcntl(fd, F_GETFL);
3140         if (fcntl(fd, F_SETFL, O_NONBLOCK | flags) == -1) {
3141             close(fd);
3142             return -TARGET_EINVAL;
3143         }
3144     }
3145 #endif
3146     return fd;
3147 }
3148 
3149 /* do_socket() Must return target values and target errnos. */
do_socket(int domain,int type,int protocol)3150 static abi_long do_socket(int domain, int type, int protocol)
3151 {
3152     int target_type = type;
3153     int ret;
3154 
3155     ret = target_to_host_sock_type(&type);
3156     if (ret) {
3157         return ret;
3158     }
3159 
3160     if (domain == PF_NETLINK && !(
3161 #ifdef CONFIG_RTNETLINK
3162          protocol == NETLINK_ROUTE ||
3163 #endif
3164          protocol == NETLINK_KOBJECT_UEVENT ||
3165          protocol == NETLINK_AUDIT)) {
3166         return -TARGET_EPROTONOSUPPORT;
3167     }
3168 
3169     if (domain == AF_PACKET ||
3170         (domain == AF_INET && type == SOCK_PACKET)) {
3171         protocol = tswap16(protocol);
3172     }
3173 
3174     ret = get_errno(socket(domain, type, protocol));
3175     if (ret >= 0) {
3176         ret = sock_flags_fixup(ret, target_type);
3177         if (type == SOCK_PACKET) {
3178             /* Manage an obsolete case :
3179              * if socket type is SOCK_PACKET, bind by name
3180              */
3181             fd_trans_register(ret, &target_packet_trans);
3182         } else if (domain == PF_NETLINK) {
3183             switch (protocol) {
3184 #ifdef CONFIG_RTNETLINK
3185             case NETLINK_ROUTE:
3186                 fd_trans_register(ret, &target_netlink_route_trans);
3187                 break;
3188 #endif
3189             case NETLINK_KOBJECT_UEVENT:
3190                 /* nothing to do: messages are strings */
3191                 break;
3192             case NETLINK_AUDIT:
3193                 fd_trans_register(ret, &target_netlink_audit_trans);
3194                 break;
3195             default:
3196                 g_assert_not_reached();
3197             }
3198         }
3199     }
3200     return ret;
3201 }
3202 
3203 /* do_bind() Must return target values and target errnos. */
do_bind(int sockfd,abi_ulong target_addr,socklen_t addrlen)3204 static abi_long do_bind(int sockfd, abi_ulong target_addr,
3205                         socklen_t addrlen)
3206 {
3207     void *addr;
3208     abi_long ret;
3209 
3210     if ((int)addrlen < 0) {
3211         return -TARGET_EINVAL;
3212     }
3213 
3214     addr = alloca(addrlen+1);
3215 
3216     ret = target_to_host_sockaddr(sockfd, addr, target_addr, addrlen);
3217     if (ret)
3218         return ret;
3219 
3220     return get_errno(bind(sockfd, addr, addrlen));
3221 }
3222 
3223 /* do_connect() Must return target values and target errnos. */
do_connect(int sockfd,abi_ulong target_addr,socklen_t addrlen)3224 static abi_long do_connect(int sockfd, abi_ulong target_addr,
3225                            socklen_t addrlen)
3226 {
3227     void *addr;
3228     abi_long ret;
3229 
3230     if ((int)addrlen < 0) {
3231         return -TARGET_EINVAL;
3232     }
3233 
3234     addr = alloca(addrlen+1);
3235 
3236     ret = target_to_host_sockaddr(sockfd, addr, target_addr, addrlen);
3237     if (ret)
3238         return ret;
3239 
3240     return get_errno(safe_connect(sockfd, addr, addrlen));
3241 }
3242 
3243 /* do_sendrecvmsg_locked() Must return target values and target errnos. */
do_sendrecvmsg_locked(int fd,struct target_msghdr * msgp,int flags,int send)3244 static abi_long do_sendrecvmsg_locked(int fd, struct target_msghdr *msgp,
3245                                       int flags, int send)
3246 {
3247     abi_long ret, len;
3248     struct msghdr msg;
3249     abi_ulong count;
3250     struct iovec *vec;
3251     abi_ulong target_vec;
3252 
3253     if (msgp->msg_name) {
3254         msg.msg_namelen = tswap32(msgp->msg_namelen);
3255         msg.msg_name = alloca(msg.msg_namelen+1);
3256         ret = target_to_host_sockaddr(fd, msg.msg_name,
3257                                       tswapal(msgp->msg_name),
3258                                       msg.msg_namelen);
3259         if (ret == -TARGET_EFAULT) {
3260             /* For connected sockets msg_name and msg_namelen must
3261              * be ignored, so returning EFAULT immediately is wrong.
3262              * Instead, pass a bad msg_name to the host kernel, and
3263              * let it decide whether to return EFAULT or not.
3264              */
3265             msg.msg_name = (void *)-1;
3266         } else if (ret) {
3267             goto out2;
3268         }
3269     } else {
3270         msg.msg_name = NULL;
3271         msg.msg_namelen = 0;
3272     }
3273     msg.msg_controllen = 2 * tswapal(msgp->msg_controllen);
3274     msg.msg_control = alloca(msg.msg_controllen);
3275     memset(msg.msg_control, 0, msg.msg_controllen);
3276 
3277     msg.msg_flags = tswap32(msgp->msg_flags);
3278 
3279     count = tswapal(msgp->msg_iovlen);
3280     target_vec = tswapal(msgp->msg_iov);
3281 
3282     if (count > IOV_MAX) {
3283         /* sendrcvmsg returns a different errno for this condition than
3284          * readv/writev, so we must catch it here before lock_iovec() does.
3285          */
3286         ret = -TARGET_EMSGSIZE;
3287         goto out2;
3288     }
3289 
3290     vec = lock_iovec(send ? VERIFY_READ : VERIFY_WRITE,
3291                      target_vec, count, send);
3292     if (vec == NULL) {
3293         ret = -host_to_target_errno(errno);
3294         /* allow sending packet without any iov, e.g. with MSG_MORE flag */
3295         if (!send || ret) {
3296             goto out2;
3297         }
3298     }
3299     msg.msg_iovlen = count;
3300     msg.msg_iov = vec;
3301 
3302     if (send) {
3303         if (fd_trans_target_to_host_data(fd)) {
3304             void *host_msg;
3305 
3306             host_msg = g_malloc(msg.msg_iov->iov_len);
3307             memcpy(host_msg, msg.msg_iov->iov_base, msg.msg_iov->iov_len);
3308             ret = fd_trans_target_to_host_data(fd)(host_msg,
3309                                                    msg.msg_iov->iov_len);
3310             if (ret >= 0) {
3311                 msg.msg_iov->iov_base = host_msg;
3312                 ret = get_errno(safe_sendmsg(fd, &msg, flags));
3313             }
3314             g_free(host_msg);
3315         } else {
3316             ret = target_to_host_cmsg(&msg, msgp);
3317             if (ret == 0) {
3318                 ret = get_errno(safe_sendmsg(fd, &msg, flags));
3319             }
3320         }
3321     } else {
3322         ret = get_errno(safe_recvmsg(fd, &msg, flags));
3323         if (!is_error(ret)) {
3324             len = ret;
3325             if (fd_trans_host_to_target_data(fd)) {
3326                 ret = fd_trans_host_to_target_data(fd)(msg.msg_iov->iov_base,
3327                                                MIN(msg.msg_iov->iov_len, len));
3328             }
3329             if (!is_error(ret)) {
3330                 ret = host_to_target_cmsg(msgp, &msg);
3331             }
3332             if (!is_error(ret)) {
3333                 msgp->msg_namelen = tswap32(msg.msg_namelen);
3334                 msgp->msg_flags = tswap32(msg.msg_flags);
3335                 if (msg.msg_name != NULL && msg.msg_name != (void *)-1) {
3336                     ret = host_to_target_sockaddr(tswapal(msgp->msg_name),
3337                                     msg.msg_name, msg.msg_namelen);
3338                     if (ret) {
3339                         goto out;
3340                     }
3341                 }
3342 
3343                 ret = len;
3344             }
3345         }
3346     }
3347 
3348 out:
3349     if (vec) {
3350         unlock_iovec(vec, target_vec, count, !send);
3351     }
3352 out2:
3353     return ret;
3354 }
3355 
do_sendrecvmsg(int fd,abi_ulong target_msg,int flags,int send)3356 static abi_long do_sendrecvmsg(int fd, abi_ulong target_msg,
3357                                int flags, int send)
3358 {
3359     abi_long ret;
3360     struct target_msghdr *msgp;
3361 
3362     if (!lock_user_struct(send ? VERIFY_READ : VERIFY_WRITE,
3363                           msgp,
3364                           target_msg,
3365                           send ? 1 : 0)) {
3366         return -TARGET_EFAULT;
3367     }
3368     ret = do_sendrecvmsg_locked(fd, msgp, flags, send);
3369     unlock_user_struct(msgp, target_msg, send ? 0 : 1);
3370     return ret;
3371 }
3372 
3373 /* We don't rely on the C library to have sendmmsg/recvmmsg support,
3374  * so it might not have this *mmsg-specific flag either.
3375  */
3376 #ifndef MSG_WAITFORONE
3377 #define MSG_WAITFORONE 0x10000
3378 #endif
3379 
do_sendrecvmmsg(int fd,abi_ulong target_msgvec,unsigned int vlen,unsigned int flags,int send)3380 static abi_long do_sendrecvmmsg(int fd, abi_ulong target_msgvec,
3381                                 unsigned int vlen, unsigned int flags,
3382                                 int send)
3383 {
3384     struct target_mmsghdr *mmsgp;
3385     abi_long ret = 0;
3386     int i;
3387 
3388     if (vlen > UIO_MAXIOV) {
3389         vlen = UIO_MAXIOV;
3390     }
3391 
3392     mmsgp = lock_user(VERIFY_WRITE, target_msgvec, sizeof(*mmsgp) * vlen, 1);
3393     if (!mmsgp) {
3394         return -TARGET_EFAULT;
3395     }
3396 
3397     for (i = 0; i < vlen; i++) {
3398         ret = do_sendrecvmsg_locked(fd, &mmsgp[i].msg_hdr, flags, send);
3399         if (is_error(ret)) {
3400             break;
3401         }
3402         mmsgp[i].msg_len = tswap32(ret);
3403         /* MSG_WAITFORONE turns on MSG_DONTWAIT after one packet */
3404         if (flags & MSG_WAITFORONE) {
3405             flags |= MSG_DONTWAIT;
3406         }
3407     }
3408 
3409     unlock_user(mmsgp, target_msgvec, sizeof(*mmsgp) * i);
3410 
3411     /* Return number of datagrams sent if we sent any at all;
3412      * otherwise return the error.
3413      */
3414     if (i) {
3415         return i;
3416     }
3417     return ret;
3418 }
3419 
3420 /* do_accept4() Must return target values and target errnos. */
do_accept4(int fd,abi_ulong target_addr,abi_ulong target_addrlen_addr,int flags)3421 static abi_long do_accept4(int fd, abi_ulong target_addr,
3422                            abi_ulong target_addrlen_addr, int flags)
3423 {
3424     socklen_t addrlen, ret_addrlen;
3425     void *addr;
3426     abi_long ret;
3427     int host_flags;
3428 
3429     if (flags & ~(TARGET_SOCK_CLOEXEC | TARGET_SOCK_NONBLOCK)) {
3430         return -TARGET_EINVAL;
3431     }
3432 
3433     host_flags = 0;
3434     if (flags & TARGET_SOCK_NONBLOCK) {
3435         host_flags |= SOCK_NONBLOCK;
3436     }
3437     if (flags & TARGET_SOCK_CLOEXEC) {
3438         host_flags |= SOCK_CLOEXEC;
3439     }
3440 
3441     if (target_addr == 0) {
3442         return get_errno(safe_accept4(fd, NULL, NULL, host_flags));
3443     }
3444 
3445     /* linux returns EFAULT if addrlen pointer is invalid */
3446     if (get_user_u32(addrlen, target_addrlen_addr))
3447         return -TARGET_EFAULT;
3448 
3449     if ((int)addrlen < 0) {
3450         return -TARGET_EINVAL;
3451     }
3452 
3453     if (!access_ok(thread_cpu, VERIFY_WRITE, target_addr, addrlen)) {
3454         return -TARGET_EFAULT;
3455     }
3456 
3457     addr = alloca(addrlen);
3458 
3459     ret_addrlen = addrlen;
3460     ret = get_errno(safe_accept4(fd, addr, &ret_addrlen, host_flags));
3461     if (!is_error(ret)) {
3462         host_to_target_sockaddr(target_addr, addr, MIN(addrlen, ret_addrlen));
3463         if (put_user_u32(ret_addrlen, target_addrlen_addr)) {
3464             ret = -TARGET_EFAULT;
3465         }
3466     }
3467     return ret;
3468 }
3469 
3470 /* do_getpeername() Must return target values and target errnos. */
do_getpeername(int fd,abi_ulong target_addr,abi_ulong target_addrlen_addr)3471 static abi_long do_getpeername(int fd, abi_ulong target_addr,
3472                                abi_ulong target_addrlen_addr)
3473 {
3474     socklen_t addrlen, ret_addrlen;
3475     void *addr;
3476     abi_long ret;
3477 
3478     if (get_user_u32(addrlen, target_addrlen_addr))
3479         return -TARGET_EFAULT;
3480 
3481     if ((int)addrlen < 0) {
3482         return -TARGET_EINVAL;
3483     }
3484 
3485     if (!access_ok(thread_cpu, VERIFY_WRITE, target_addr, addrlen)) {
3486         return -TARGET_EFAULT;
3487     }
3488 
3489     addr = alloca(addrlen);
3490 
3491     ret_addrlen = addrlen;
3492     ret = get_errno(getpeername(fd, addr, &ret_addrlen));
3493     if (!is_error(ret)) {
3494         host_to_target_sockaddr(target_addr, addr, MIN(addrlen, ret_addrlen));
3495         if (put_user_u32(ret_addrlen, target_addrlen_addr)) {
3496             ret = -TARGET_EFAULT;
3497         }
3498     }
3499     return ret;
3500 }
3501 
3502 /* do_getsockname() Must return target values and target errnos. */
do_getsockname(int fd,abi_ulong target_addr,abi_ulong target_addrlen_addr)3503 static abi_long do_getsockname(int fd, abi_ulong target_addr,
3504                                abi_ulong target_addrlen_addr)
3505 {
3506     socklen_t addrlen, ret_addrlen;
3507     void *addr;
3508     abi_long ret;
3509 
3510     if (get_user_u32(addrlen, target_addrlen_addr))
3511         return -TARGET_EFAULT;
3512 
3513     if ((int)addrlen < 0) {
3514         return -TARGET_EINVAL;
3515     }
3516 
3517     if (!access_ok(thread_cpu, VERIFY_WRITE, target_addr, addrlen)) {
3518         return -TARGET_EFAULT;
3519     }
3520 
3521     addr = alloca(addrlen);
3522 
3523     ret_addrlen = addrlen;
3524     ret = get_errno(getsockname(fd, addr, &ret_addrlen));
3525     if (!is_error(ret)) {
3526         host_to_target_sockaddr(target_addr, addr, MIN(addrlen, ret_addrlen));
3527         if (put_user_u32(ret_addrlen, target_addrlen_addr)) {
3528             ret = -TARGET_EFAULT;
3529         }
3530     }
3531     return ret;
3532 }
3533 
3534 /* do_socketpair() Must return target values and target errnos. */
do_socketpair(int domain,int type,int protocol,abi_ulong target_tab_addr)3535 static abi_long do_socketpair(int domain, int type, int protocol,
3536                               abi_ulong target_tab_addr)
3537 {
3538     int tab[2];
3539     abi_long ret;
3540 
3541     target_to_host_sock_type(&type);
3542 
3543     ret = get_errno(socketpair(domain, type, protocol, tab));
3544     if (!is_error(ret)) {
3545         if (put_user_s32(tab[0], target_tab_addr)
3546             || put_user_s32(tab[1], target_tab_addr + sizeof(tab[0])))
3547             ret = -TARGET_EFAULT;
3548     }
3549     return ret;
3550 }
3551 
3552 /* do_sendto() Must return target values and target errnos. */
do_sendto(int fd,abi_ulong msg,size_t len,int flags,abi_ulong target_addr,socklen_t addrlen)3553 static abi_long do_sendto(int fd, abi_ulong msg, size_t len, int flags,
3554                           abi_ulong target_addr, socklen_t addrlen)
3555 {
3556     void *addr;
3557     void *host_msg;
3558     void *copy_msg = NULL;
3559     abi_long ret;
3560 
3561     if ((int)addrlen < 0) {
3562         return -TARGET_EINVAL;
3563     }
3564 
3565     host_msg = lock_user(VERIFY_READ, msg, len, 1);
3566     if (!host_msg)
3567         return -TARGET_EFAULT;
3568     if (fd_trans_target_to_host_data(fd)) {
3569         copy_msg = host_msg;
3570         host_msg = g_malloc(len);
3571         memcpy(host_msg, copy_msg, len);
3572         ret = fd_trans_target_to_host_data(fd)(host_msg, len);
3573         if (ret < 0) {
3574             goto fail;
3575         }
3576     }
3577     if (target_addr) {
3578         addr = alloca(addrlen+1);
3579         ret = target_to_host_sockaddr(fd, addr, target_addr, addrlen);
3580         if (ret) {
3581             goto fail;
3582         }
3583         ret = get_errno(safe_sendto(fd, host_msg, len, flags, addr, addrlen));
3584     } else {
3585         ret = get_errno(safe_sendto(fd, host_msg, len, flags, NULL, 0));
3586     }
3587 fail:
3588     if (copy_msg) {
3589         g_free(host_msg);
3590         host_msg = copy_msg;
3591     }
3592     unlock_user(host_msg, msg, 0);
3593     return ret;
3594 }
3595 
3596 /* do_recvfrom() Must return target values and target errnos. */
do_recvfrom(int fd,abi_ulong msg,size_t len,int flags,abi_ulong target_addr,abi_ulong target_addrlen)3597 static abi_long do_recvfrom(int fd, abi_ulong msg, size_t len, int flags,
3598                             abi_ulong target_addr,
3599                             abi_ulong target_addrlen)
3600 {
3601     socklen_t addrlen, ret_addrlen;
3602     void *addr;
3603     void *host_msg;
3604     abi_long ret;
3605 
3606     if (!msg) {
3607         host_msg = NULL;
3608     } else {
3609         host_msg = lock_user(VERIFY_WRITE, msg, len, 0);
3610         if (!host_msg) {
3611             return -TARGET_EFAULT;
3612         }
3613     }
3614     if (target_addr) {
3615         if (get_user_u32(addrlen, target_addrlen)) {
3616             ret = -TARGET_EFAULT;
3617             goto fail;
3618         }
3619         if ((int)addrlen < 0) {
3620             ret = -TARGET_EINVAL;
3621             goto fail;
3622         }
3623         addr = alloca(addrlen);
3624         ret_addrlen = addrlen;
3625         ret = get_errno(safe_recvfrom(fd, host_msg, len, flags,
3626                                       addr, &ret_addrlen));
3627     } else {
3628         addr = NULL; /* To keep compiler quiet.  */
3629         addrlen = 0; /* To keep compiler quiet.  */
3630         ret = get_errno(safe_recvfrom(fd, host_msg, len, flags, NULL, 0));
3631     }
3632     if (!is_error(ret)) {
3633         if (fd_trans_host_to_target_data(fd)) {
3634             abi_long trans;
3635             trans = fd_trans_host_to_target_data(fd)(host_msg, MIN(ret, len));
3636             if (is_error(trans)) {
3637                 ret = trans;
3638                 goto fail;
3639             }
3640         }
3641         if (target_addr) {
3642             host_to_target_sockaddr(target_addr, addr,
3643                                     MIN(addrlen, ret_addrlen));
3644             if (put_user_u32(ret_addrlen, target_addrlen)) {
3645                 ret = -TARGET_EFAULT;
3646                 goto fail;
3647             }
3648         }
3649         unlock_user(host_msg, msg, len);
3650     } else {
3651 fail:
3652         unlock_user(host_msg, msg, 0);
3653     }
3654     return ret;
3655 }
3656 
3657 #ifdef TARGET_NR_socketcall
3658 /* do_socketcall() must return target values and target errnos. */
do_socketcall(int num,abi_ulong vptr)3659 static abi_long do_socketcall(int num, abi_ulong vptr)
3660 {
3661     static const unsigned nargs[] = { /* number of arguments per operation */
3662         [TARGET_SYS_SOCKET] = 3,      /* domain, type, protocol */
3663         [TARGET_SYS_BIND] = 3,        /* fd, addr, addrlen */
3664         [TARGET_SYS_CONNECT] = 3,     /* fd, addr, addrlen */
3665         [TARGET_SYS_LISTEN] = 2,      /* fd, backlog */
3666         [TARGET_SYS_ACCEPT] = 3,      /* fd, addr, addrlen */
3667         [TARGET_SYS_GETSOCKNAME] = 3, /* fd, addr, addrlen */
3668         [TARGET_SYS_GETPEERNAME] = 3, /* fd, addr, addrlen */
3669         [TARGET_SYS_SOCKETPAIR] = 4,  /* domain, type, protocol, tab */
3670         [TARGET_SYS_SEND] = 4,        /* fd, msg, len, flags */
3671         [TARGET_SYS_RECV] = 4,        /* fd, msg, len, flags */
3672         [TARGET_SYS_SENDTO] = 6,      /* fd, msg, len, flags, addr, addrlen */
3673         [TARGET_SYS_RECVFROM] = 6,    /* fd, msg, len, flags, addr, addrlen */
3674         [TARGET_SYS_SHUTDOWN] = 2,    /* fd, how */
3675         [TARGET_SYS_SETSOCKOPT] = 5,  /* fd, level, optname, optval, optlen */
3676         [TARGET_SYS_GETSOCKOPT] = 5,  /* fd, level, optname, optval, optlen */
3677         [TARGET_SYS_SENDMSG] = 3,     /* fd, msg, flags */
3678         [TARGET_SYS_RECVMSG] = 3,     /* fd, msg, flags */
3679         [TARGET_SYS_ACCEPT4] = 4,     /* fd, addr, addrlen, flags */
3680         [TARGET_SYS_RECVMMSG] = 4,    /* fd, msgvec, vlen, flags */
3681         [TARGET_SYS_SENDMMSG] = 4,    /* fd, msgvec, vlen, flags */
3682     };
3683     abi_long a[6]; /* max 6 args */
3684     unsigned i;
3685 
3686     /* check the range of the first argument num */
3687     /* (TARGET_SYS_SENDMMSG is the highest among TARGET_SYS_xxx) */
3688     if (num < 1 || num > TARGET_SYS_SENDMMSG) {
3689         return -TARGET_EINVAL;
3690     }
3691     /* ensure we have space for args */
3692     if (nargs[num] > ARRAY_SIZE(a)) {
3693         return -TARGET_EINVAL;
3694     }
3695     /* collect the arguments in a[] according to nargs[] */
3696     for (i = 0; i < nargs[num]; ++i) {
3697         if (get_user_ual(a[i], vptr + i * sizeof(abi_long)) != 0) {
3698             return -TARGET_EFAULT;
3699         }
3700     }
3701     /* now when we have the args, invoke the appropriate underlying function */
3702     switch (num) {
3703     case TARGET_SYS_SOCKET: /* domain, type, protocol */
3704         return do_socket(a[0], a[1], a[2]);
3705     case TARGET_SYS_BIND: /* sockfd, addr, addrlen */
3706         return do_bind(a[0], a[1], a[2]);
3707     case TARGET_SYS_CONNECT: /* sockfd, addr, addrlen */
3708         return do_connect(a[0], a[1], a[2]);
3709     case TARGET_SYS_LISTEN: /* sockfd, backlog */
3710         return get_errno(listen(a[0], a[1]));
3711     case TARGET_SYS_ACCEPT: /* sockfd, addr, addrlen */
3712         return do_accept4(a[0], a[1], a[2], 0);
3713     case TARGET_SYS_GETSOCKNAME: /* sockfd, addr, addrlen */
3714         return do_getsockname(a[0], a[1], a[2]);
3715     case TARGET_SYS_GETPEERNAME: /* sockfd, addr, addrlen */
3716         return do_getpeername(a[0], a[1], a[2]);
3717     case TARGET_SYS_SOCKETPAIR: /* domain, type, protocol, tab */
3718         return do_socketpair(a[0], a[1], a[2], a[3]);
3719     case TARGET_SYS_SEND: /* sockfd, msg, len, flags */
3720         return do_sendto(a[0], a[1], a[2], a[3], 0, 0);
3721     case TARGET_SYS_RECV: /* sockfd, msg, len, flags */
3722         return do_recvfrom(a[0], a[1], a[2], a[3], 0, 0);
3723     case TARGET_SYS_SENDTO: /* sockfd, msg, len, flags, addr, addrlen */
3724         return do_sendto(a[0], a[1], a[2], a[3], a[4], a[5]);
3725     case TARGET_SYS_RECVFROM: /* sockfd, msg, len, flags, addr, addrlen */
3726         return do_recvfrom(a[0], a[1], a[2], a[3], a[4], a[5]);
3727     case TARGET_SYS_SHUTDOWN: /* sockfd, how */
3728         return get_errno(shutdown(a[0], a[1]));
3729     case TARGET_SYS_SETSOCKOPT: /* sockfd, level, optname, optval, optlen */
3730         return do_setsockopt(a[0], a[1], a[2], a[3], a[4]);
3731     case TARGET_SYS_GETSOCKOPT: /* sockfd, level, optname, optval, optlen */
3732         return do_getsockopt(a[0], a[1], a[2], a[3], a[4]);
3733     case TARGET_SYS_SENDMSG: /* sockfd, msg, flags */
3734         return do_sendrecvmsg(a[0], a[1], a[2], 1);
3735     case TARGET_SYS_RECVMSG: /* sockfd, msg, flags */
3736         return do_sendrecvmsg(a[0], a[1], a[2], 0);
3737     case TARGET_SYS_ACCEPT4: /* sockfd, addr, addrlen, flags */
3738         return do_accept4(a[0], a[1], a[2], a[3]);
3739     case TARGET_SYS_RECVMMSG: /* sockfd, msgvec, vlen, flags */
3740         return do_sendrecvmmsg(a[0], a[1], a[2], a[3], 0);
3741     case TARGET_SYS_SENDMMSG: /* sockfd, msgvec, vlen, flags */
3742         return do_sendrecvmmsg(a[0], a[1], a[2], a[3], 1);
3743     default:
3744         qemu_log_mask(LOG_UNIMP, "Unsupported socketcall: %d\n", num);
3745         return -TARGET_EINVAL;
3746     }
3747 }
3748 #endif
3749 
3750 #ifndef TARGET_SEMID64_DS
3751 /* asm-generic version of this struct */
3752 struct target_semid64_ds
3753 {
3754   struct target_ipc_perm sem_perm;
3755   abi_ulong sem_otime;
3756 #if TARGET_ABI_BITS == 32
3757   abi_ulong __unused1;
3758 #endif
3759   abi_ulong sem_ctime;
3760 #if TARGET_ABI_BITS == 32
3761   abi_ulong __unused2;
3762 #endif
3763   abi_ulong sem_nsems;
3764   abi_ulong __unused3;
3765   abi_ulong __unused4;
3766 };
3767 #endif
3768 
target_to_host_ipc_perm(struct ipc_perm * host_ip,abi_ulong target_addr)3769 static inline abi_long target_to_host_ipc_perm(struct ipc_perm *host_ip,
3770                                                abi_ulong target_addr)
3771 {
3772     struct target_ipc_perm *target_ip;
3773     struct target_semid64_ds *target_sd;
3774 
3775     if (!lock_user_struct(VERIFY_READ, target_sd, target_addr, 1))
3776         return -TARGET_EFAULT;
3777     target_ip = &(target_sd->sem_perm);
3778     host_ip->__key = tswap32(target_ip->__key);
3779     host_ip->uid = tswap32(target_ip->uid);
3780     host_ip->gid = tswap32(target_ip->gid);
3781     host_ip->cuid = tswap32(target_ip->cuid);
3782     host_ip->cgid = tswap32(target_ip->cgid);
3783 #if defined(TARGET_ALPHA) || defined(TARGET_MIPS) || defined(TARGET_PPC)
3784     host_ip->mode = tswap32(target_ip->mode);
3785 #else
3786     host_ip->mode = tswap16(target_ip->mode);
3787 #endif
3788 #if defined(TARGET_PPC)
3789     host_ip->__seq = tswap32(target_ip->__seq);
3790 #else
3791     host_ip->__seq = tswap16(target_ip->__seq);
3792 #endif
3793     unlock_user_struct(target_sd, target_addr, 0);
3794     return 0;
3795 }
3796 
host_to_target_ipc_perm(abi_ulong target_addr,struct ipc_perm * host_ip)3797 static inline abi_long host_to_target_ipc_perm(abi_ulong target_addr,
3798                                                struct ipc_perm *host_ip)
3799 {
3800     struct target_ipc_perm *target_ip;
3801     struct target_semid64_ds *target_sd;
3802 
3803     if (!lock_user_struct(VERIFY_WRITE, target_sd, target_addr, 0))
3804         return -TARGET_EFAULT;
3805     target_ip = &(target_sd->sem_perm);
3806     target_ip->__key = tswap32(host_ip->__key);
3807     target_ip->uid = tswap32(host_ip->uid);
3808     target_ip->gid = tswap32(host_ip->gid);
3809     target_ip->cuid = tswap32(host_ip->cuid);
3810     target_ip->cgid = tswap32(host_ip->cgid);
3811 #if defined(TARGET_ALPHA) || defined(TARGET_MIPS) || defined(TARGET_PPC)
3812     target_ip->mode = tswap32(host_ip->mode);
3813 #else
3814     target_ip->mode = tswap16(host_ip->mode);
3815 #endif
3816 #if defined(TARGET_PPC)
3817     target_ip->__seq = tswap32(host_ip->__seq);
3818 #else
3819     target_ip->__seq = tswap16(host_ip->__seq);
3820 #endif
3821     unlock_user_struct(target_sd, target_addr, 1);
3822     return 0;
3823 }
3824 
target_to_host_semid_ds(struct semid_ds * host_sd,abi_ulong target_addr)3825 static inline abi_long target_to_host_semid_ds(struct semid_ds *host_sd,
3826                                                abi_ulong target_addr)
3827 {
3828     struct target_semid64_ds *target_sd;
3829 
3830     if (!lock_user_struct(VERIFY_READ, target_sd, target_addr, 1))
3831         return -TARGET_EFAULT;
3832     if (target_to_host_ipc_perm(&(host_sd->sem_perm),target_addr))
3833         return -TARGET_EFAULT;
3834     host_sd->sem_nsems = tswapal(target_sd->sem_nsems);
3835     host_sd->sem_otime = tswapal(target_sd->sem_otime);
3836     host_sd->sem_ctime = tswapal(target_sd->sem_ctime);
3837     unlock_user_struct(target_sd, target_addr, 0);
3838     return 0;
3839 }
3840 
host_to_target_semid_ds(abi_ulong target_addr,struct semid_ds * host_sd)3841 static inline abi_long host_to_target_semid_ds(abi_ulong target_addr,
3842                                                struct semid_ds *host_sd)
3843 {
3844     struct target_semid64_ds *target_sd;
3845 
3846     if (!lock_user_struct(VERIFY_WRITE, target_sd, target_addr, 0))
3847         return -TARGET_EFAULT;
3848     if (host_to_target_ipc_perm(target_addr,&(host_sd->sem_perm)))
3849         return -TARGET_EFAULT;
3850     target_sd->sem_nsems = tswapal(host_sd->sem_nsems);
3851     target_sd->sem_otime = tswapal(host_sd->sem_otime);
3852     target_sd->sem_ctime = tswapal(host_sd->sem_ctime);
3853     unlock_user_struct(target_sd, target_addr, 1);
3854     return 0;
3855 }
3856 
3857 struct target_seminfo {
3858     int semmap;
3859     int semmni;
3860     int semmns;
3861     int semmnu;
3862     int semmsl;
3863     int semopm;
3864     int semume;
3865     int semusz;
3866     int semvmx;
3867     int semaem;
3868 };
3869 
host_to_target_seminfo(abi_ulong target_addr,struct seminfo * host_seminfo)3870 static inline abi_long host_to_target_seminfo(abi_ulong target_addr,
3871                                               struct seminfo *host_seminfo)
3872 {
3873     struct target_seminfo *target_seminfo;
3874     if (!lock_user_struct(VERIFY_WRITE, target_seminfo, target_addr, 0))
3875         return -TARGET_EFAULT;
3876     __put_user(host_seminfo->semmap, &target_seminfo->semmap);
3877     __put_user(host_seminfo->semmni, &target_seminfo->semmni);
3878     __put_user(host_seminfo->semmns, &target_seminfo->semmns);
3879     __put_user(host_seminfo->semmnu, &target_seminfo->semmnu);
3880     __put_user(host_seminfo->semmsl, &target_seminfo->semmsl);
3881     __put_user(host_seminfo->semopm, &target_seminfo->semopm);
3882     __put_user(host_seminfo->semume, &target_seminfo->semume);
3883     __put_user(host_seminfo->semusz, &target_seminfo->semusz);
3884     __put_user(host_seminfo->semvmx, &target_seminfo->semvmx);
3885     __put_user(host_seminfo->semaem, &target_seminfo->semaem);
3886     unlock_user_struct(target_seminfo, target_addr, 1);
3887     return 0;
3888 }
3889 
3890 union semun {
3891 	int val;
3892 	struct semid_ds *buf;
3893 	unsigned short *array;
3894 	struct seminfo *__buf;
3895 };
3896 
3897 union target_semun {
3898 	int val;
3899 	abi_ulong buf;
3900 	abi_ulong array;
3901 	abi_ulong __buf;
3902 };
3903 
target_to_host_semarray(int semid,unsigned short ** host_array,abi_ulong target_addr)3904 static inline abi_long target_to_host_semarray(int semid, unsigned short **host_array,
3905                                                abi_ulong target_addr)
3906 {
3907     int nsems;
3908     unsigned short *array;
3909     union semun semun;
3910     struct semid_ds semid_ds;
3911     int i, ret;
3912 
3913     semun.buf = &semid_ds;
3914 
3915     ret = semctl(semid, 0, IPC_STAT, semun);
3916     if (ret == -1)
3917         return get_errno(ret);
3918 
3919     nsems = semid_ds.sem_nsems;
3920 
3921     *host_array = g_try_new(unsigned short, nsems);
3922     if (!*host_array) {
3923         return -TARGET_ENOMEM;
3924     }
3925     array = lock_user(VERIFY_READ, target_addr,
3926                       nsems*sizeof(unsigned short), 1);
3927     if (!array) {
3928         g_free(*host_array);
3929         return -TARGET_EFAULT;
3930     }
3931 
3932     for(i=0; i<nsems; i++) {
3933         __get_user((*host_array)[i], &array[i]);
3934     }
3935     unlock_user(array, target_addr, 0);
3936 
3937     return 0;
3938 }
3939 
host_to_target_semarray(int semid,abi_ulong target_addr,unsigned short ** host_array)3940 static inline abi_long host_to_target_semarray(int semid, abi_ulong target_addr,
3941                                                unsigned short **host_array)
3942 {
3943     int nsems;
3944     unsigned short *array;
3945     union semun semun;
3946     struct semid_ds semid_ds;
3947     int i, ret;
3948 
3949     semun.buf = &semid_ds;
3950 
3951     ret = semctl(semid, 0, IPC_STAT, semun);
3952     if (ret == -1)
3953         return get_errno(ret);
3954 
3955     nsems = semid_ds.sem_nsems;
3956 
3957     array = lock_user(VERIFY_WRITE, target_addr,
3958                       nsems*sizeof(unsigned short), 0);
3959     if (!array)
3960         return -TARGET_EFAULT;
3961 
3962     for(i=0; i<nsems; i++) {
3963         __put_user((*host_array)[i], &array[i]);
3964     }
3965     g_free(*host_array);
3966     unlock_user(array, target_addr, 1);
3967 
3968     return 0;
3969 }
3970 
do_semctl(int semid,int semnum,int cmd,abi_ulong target_arg)3971 static inline abi_long do_semctl(int semid, int semnum, int cmd,
3972                                  abi_ulong target_arg)
3973 {
3974     union target_semun target_su = { .buf = target_arg };
3975     union semun arg;
3976     struct semid_ds dsarg;
3977     unsigned short *array = NULL;
3978     struct seminfo seminfo;
3979     abi_long ret = -TARGET_EINVAL;
3980     abi_long err;
3981     cmd &= 0xff;
3982 
3983     switch( cmd ) {
3984 	case GETVAL:
3985 	case SETVAL:
3986             /* In 64 bit cross-endian situations, we will erroneously pick up
3987              * the wrong half of the union for the "val" element.  To rectify
3988              * this, the entire 8-byte structure is byteswapped, followed by
3989 	     * a swap of the 4 byte val field. In other cases, the data is
3990 	     * already in proper host byte order. */
3991 	    if (sizeof(target_su.val) != (sizeof(target_su.buf))) {
3992 		target_su.buf = tswapal(target_su.buf);
3993 		arg.val = tswap32(target_su.val);
3994 	    } else {
3995 		arg.val = target_su.val;
3996 	    }
3997             ret = get_errno(semctl(semid, semnum, cmd, arg));
3998             break;
3999 	case GETALL:
4000 	case SETALL:
4001             err = target_to_host_semarray(semid, &array, target_su.array);
4002             if (err)
4003                 return err;
4004             arg.array = array;
4005             ret = get_errno(semctl(semid, semnum, cmd, arg));
4006             err = host_to_target_semarray(semid, target_su.array, &array);
4007             if (err)
4008                 return err;
4009             break;
4010 	case IPC_STAT:
4011 	case IPC_SET:
4012 	case SEM_STAT:
4013             err = target_to_host_semid_ds(&dsarg, target_su.buf);
4014             if (err)
4015                 return err;
4016             arg.buf = &dsarg;
4017             ret = get_errno(semctl(semid, semnum, cmd, arg));
4018             err = host_to_target_semid_ds(target_su.buf, &dsarg);
4019             if (err)
4020                 return err;
4021             break;
4022 	case IPC_INFO:
4023 	case SEM_INFO:
4024             arg.__buf = &seminfo;
4025             ret = get_errno(semctl(semid, semnum, cmd, arg));
4026             err = host_to_target_seminfo(target_su.__buf, &seminfo);
4027             if (err)
4028                 return err;
4029             break;
4030 	case IPC_RMID:
4031 	case GETPID:
4032 	case GETNCNT:
4033 	case GETZCNT:
4034             ret = get_errno(semctl(semid, semnum, cmd, NULL));
4035             break;
4036     }
4037 
4038     return ret;
4039 }
4040 
4041 struct target_sembuf {
4042     unsigned short sem_num;
4043     short sem_op;
4044     short sem_flg;
4045 };
4046 
target_to_host_sembuf(struct sembuf * host_sembuf,abi_ulong target_addr,unsigned nsops)4047 static inline abi_long target_to_host_sembuf(struct sembuf *host_sembuf,
4048                                              abi_ulong target_addr,
4049                                              unsigned nsops)
4050 {
4051     struct target_sembuf *target_sembuf;
4052     int i;
4053 
4054     target_sembuf = lock_user(VERIFY_READ, target_addr,
4055                               nsops*sizeof(struct target_sembuf), 1);
4056     if (!target_sembuf)
4057         return -TARGET_EFAULT;
4058 
4059     for(i=0; i<nsops; i++) {
4060         __get_user(host_sembuf[i].sem_num, &target_sembuf[i].sem_num);
4061         __get_user(host_sembuf[i].sem_op, &target_sembuf[i].sem_op);
4062         __get_user(host_sembuf[i].sem_flg, &target_sembuf[i].sem_flg);
4063     }
4064 
4065     unlock_user(target_sembuf, target_addr, 0);
4066 
4067     return 0;
4068 }
4069 
4070 #if defined(TARGET_NR_ipc) || defined(TARGET_NR_semop) || \
4071     defined(TARGET_NR_semtimedop) || defined(TARGET_NR_semtimedop_time64)
4072 
4073 /*
4074  * This macro is required to handle the s390 variants, which passes the
4075  * arguments in a different order than default.
4076  */
4077 #ifdef __s390x__
4078 #define SEMTIMEDOP_IPC_ARGS(__nsops, __sops, __timeout) \
4079   (__nsops), (__timeout), (__sops)
4080 #else
4081 #define SEMTIMEDOP_IPC_ARGS(__nsops, __sops, __timeout) \
4082   (__nsops), 0, (__sops), (__timeout)
4083 #endif
4084 
do_semtimedop(int semid,abi_long ptr,unsigned nsops,abi_long timeout,bool time64)4085 static inline abi_long do_semtimedop(int semid,
4086                                      abi_long ptr,
4087                                      unsigned nsops,
4088                                      abi_long timeout, bool time64)
4089 {
4090     struct sembuf *sops;
4091     struct timespec ts, *pts = NULL;
4092     abi_long ret;
4093 
4094     if (timeout) {
4095         pts = &ts;
4096         if (time64) {
4097             if (target_to_host_timespec64(pts, timeout)) {
4098                 return -TARGET_EFAULT;
4099             }
4100         } else {
4101             if (target_to_host_timespec(pts, timeout)) {
4102                 return -TARGET_EFAULT;
4103             }
4104         }
4105     }
4106 
4107     if (nsops > TARGET_SEMOPM) {
4108         return -TARGET_E2BIG;
4109     }
4110 
4111     sops = g_new(struct sembuf, nsops);
4112 
4113     if (target_to_host_sembuf(sops, ptr, nsops)) {
4114         g_free(sops);
4115         return -TARGET_EFAULT;
4116     }
4117 
4118     ret = -TARGET_ENOSYS;
4119 #ifdef __NR_semtimedop
4120     ret = get_errno(safe_semtimedop(semid, sops, nsops, pts));
4121 #endif
4122 #ifdef __NR_ipc
4123     if (ret == -TARGET_ENOSYS) {
4124         ret = get_errno(safe_ipc(IPCOP_semtimedop, semid,
4125                                  SEMTIMEDOP_IPC_ARGS(nsops, sops, (long)pts)));
4126     }
4127 #endif
4128     g_free(sops);
4129     return ret;
4130 }
4131 #endif
4132 
4133 struct target_msqid_ds
4134 {
4135     struct target_ipc_perm msg_perm;
4136     abi_ulong msg_stime;
4137 #if TARGET_ABI_BITS == 32
4138     abi_ulong __unused1;
4139 #endif
4140     abi_ulong msg_rtime;
4141 #if TARGET_ABI_BITS == 32
4142     abi_ulong __unused2;
4143 #endif
4144     abi_ulong msg_ctime;
4145 #if TARGET_ABI_BITS == 32
4146     abi_ulong __unused3;
4147 #endif
4148     abi_ulong __msg_cbytes;
4149     abi_ulong msg_qnum;
4150     abi_ulong msg_qbytes;
4151     abi_ulong msg_lspid;
4152     abi_ulong msg_lrpid;
4153     abi_ulong __unused4;
4154     abi_ulong __unused5;
4155 };
4156 
target_to_host_msqid_ds(struct msqid_ds * host_md,abi_ulong target_addr)4157 static inline abi_long target_to_host_msqid_ds(struct msqid_ds *host_md,
4158                                                abi_ulong target_addr)
4159 {
4160     struct target_msqid_ds *target_md;
4161 
4162     if (!lock_user_struct(VERIFY_READ, target_md, target_addr, 1))
4163         return -TARGET_EFAULT;
4164     if (target_to_host_ipc_perm(&(host_md->msg_perm),target_addr))
4165         return -TARGET_EFAULT;
4166     host_md->msg_stime = tswapal(target_md->msg_stime);
4167     host_md->msg_rtime = tswapal(target_md->msg_rtime);
4168     host_md->msg_ctime = tswapal(target_md->msg_ctime);
4169     host_md->__msg_cbytes = tswapal(target_md->__msg_cbytes);
4170     host_md->msg_qnum = tswapal(target_md->msg_qnum);
4171     host_md->msg_qbytes = tswapal(target_md->msg_qbytes);
4172     host_md->msg_lspid = tswapal(target_md->msg_lspid);
4173     host_md->msg_lrpid = tswapal(target_md->msg_lrpid);
4174     unlock_user_struct(target_md, target_addr, 0);
4175     return 0;
4176 }
4177 
host_to_target_msqid_ds(abi_ulong target_addr,struct msqid_ds * host_md)4178 static inline abi_long host_to_target_msqid_ds(abi_ulong target_addr,
4179                                                struct msqid_ds *host_md)
4180 {
4181     struct target_msqid_ds *target_md;
4182 
4183     if (!lock_user_struct(VERIFY_WRITE, target_md, target_addr, 0))
4184         return -TARGET_EFAULT;
4185     if (host_to_target_ipc_perm(target_addr,&(host_md->msg_perm)))
4186         return -TARGET_EFAULT;
4187     target_md->msg_stime = tswapal(host_md->msg_stime);
4188     target_md->msg_rtime = tswapal(host_md->msg_rtime);
4189     target_md->msg_ctime = tswapal(host_md->msg_ctime);
4190     target_md->__msg_cbytes = tswapal(host_md->__msg_cbytes);
4191     target_md->msg_qnum = tswapal(host_md->msg_qnum);
4192     target_md->msg_qbytes = tswapal(host_md->msg_qbytes);
4193     target_md->msg_lspid = tswapal(host_md->msg_lspid);
4194     target_md->msg_lrpid = tswapal(host_md->msg_lrpid);
4195     unlock_user_struct(target_md, target_addr, 1);
4196     return 0;
4197 }
4198 
4199 struct target_msginfo {
4200     int msgpool;
4201     int msgmap;
4202     int msgmax;
4203     int msgmnb;
4204     int msgmni;
4205     int msgssz;
4206     int msgtql;
4207     unsigned short int msgseg;
4208 };
4209 
host_to_target_msginfo(abi_ulong target_addr,struct msginfo * host_msginfo)4210 static inline abi_long host_to_target_msginfo(abi_ulong target_addr,
4211                                               struct msginfo *host_msginfo)
4212 {
4213     struct target_msginfo *target_msginfo;
4214     if (!lock_user_struct(VERIFY_WRITE, target_msginfo, target_addr, 0))
4215         return -TARGET_EFAULT;
4216     __put_user(host_msginfo->msgpool, &target_msginfo->msgpool);
4217     __put_user(host_msginfo->msgmap, &target_msginfo->msgmap);
4218     __put_user(host_msginfo->msgmax, &target_msginfo->msgmax);
4219     __put_user(host_msginfo->msgmnb, &target_msginfo->msgmnb);
4220     __put_user(host_msginfo->msgmni, &target_msginfo->msgmni);
4221     __put_user(host_msginfo->msgssz, &target_msginfo->msgssz);
4222     __put_user(host_msginfo->msgtql, &target_msginfo->msgtql);
4223     __put_user(host_msginfo->msgseg, &target_msginfo->msgseg);
4224     unlock_user_struct(target_msginfo, target_addr, 1);
4225     return 0;
4226 }
4227 
do_msgctl(int msgid,int cmd,abi_long ptr)4228 static inline abi_long do_msgctl(int msgid, int cmd, abi_long ptr)
4229 {
4230     struct msqid_ds dsarg;
4231     struct msginfo msginfo;
4232     abi_long ret = -TARGET_EINVAL;
4233 
4234     cmd &= 0xff;
4235 
4236     switch (cmd) {
4237     case IPC_STAT:
4238     case IPC_SET:
4239     case MSG_STAT:
4240         if (target_to_host_msqid_ds(&dsarg,ptr))
4241             return -TARGET_EFAULT;
4242         ret = get_errno(msgctl(msgid, cmd, &dsarg));
4243         if (host_to_target_msqid_ds(ptr,&dsarg))
4244             return -TARGET_EFAULT;
4245         break;
4246     case IPC_RMID:
4247         ret = get_errno(msgctl(msgid, cmd, NULL));
4248         break;
4249     case IPC_INFO:
4250     case MSG_INFO:
4251         ret = get_errno(msgctl(msgid, cmd, (struct msqid_ds *)&msginfo));
4252         if (host_to_target_msginfo(ptr, &msginfo))
4253             return -TARGET_EFAULT;
4254         break;
4255     }
4256 
4257     return ret;
4258 }
4259 
4260 struct target_msgbuf {
4261     abi_long mtype;
4262     char	mtext[1];
4263 };
4264 
do_msgsnd(int msqid,abi_long msgp,ssize_t msgsz,int msgflg)4265 static inline abi_long do_msgsnd(int msqid, abi_long msgp,
4266                                  ssize_t msgsz, int msgflg)
4267 {
4268     struct target_msgbuf *target_mb;
4269     struct msgbuf *host_mb;
4270     abi_long ret = 0;
4271 
4272     if (msgsz < 0) {
4273         return -TARGET_EINVAL;
4274     }
4275 
4276     if (!lock_user_struct(VERIFY_READ, target_mb, msgp, 0))
4277         return -TARGET_EFAULT;
4278     host_mb = g_try_malloc(msgsz + sizeof(long));
4279     if (!host_mb) {
4280         unlock_user_struct(target_mb, msgp, 0);
4281         return -TARGET_ENOMEM;
4282     }
4283     host_mb->mtype = (abi_long) tswapal(target_mb->mtype);
4284     memcpy(host_mb->mtext, target_mb->mtext, msgsz);
4285     ret = -TARGET_ENOSYS;
4286 #ifdef __NR_msgsnd
4287     ret = get_errno(safe_msgsnd(msqid, host_mb, msgsz, msgflg));
4288 #endif
4289 #ifdef __NR_ipc
4290     if (ret == -TARGET_ENOSYS) {
4291 #ifdef __s390x__
4292         ret = get_errno(safe_ipc(IPCOP_msgsnd, msqid, msgsz, msgflg,
4293                                  host_mb));
4294 #else
4295         ret = get_errno(safe_ipc(IPCOP_msgsnd, msqid, msgsz, msgflg,
4296                                  host_mb, 0));
4297 #endif
4298     }
4299 #endif
4300     g_free(host_mb);
4301     unlock_user_struct(target_mb, msgp, 0);
4302 
4303     return ret;
4304 }
4305 
4306 #ifdef __NR_ipc
4307 #if defined(__sparc__)
4308 /* SPARC for msgrcv it does not use the kludge on final 2 arguments.  */
4309 #define MSGRCV_ARGS(__msgp, __msgtyp) __msgp, __msgtyp
4310 #elif defined(__s390x__)
4311 /* The s390 sys_ipc variant has only five parameters.  */
4312 #define MSGRCV_ARGS(__msgp, __msgtyp) \
4313     ((long int[]){(long int)__msgp, __msgtyp})
4314 #else
4315 #define MSGRCV_ARGS(__msgp, __msgtyp) \
4316     ((long int[]){(long int)__msgp, __msgtyp}), 0
4317 #endif
4318 #endif
4319 
do_msgrcv(int msqid,abi_long msgp,ssize_t msgsz,abi_long msgtyp,int msgflg)4320 static inline abi_long do_msgrcv(int msqid, abi_long msgp,
4321                                  ssize_t msgsz, abi_long msgtyp,
4322                                  int msgflg)
4323 {
4324     struct target_msgbuf *target_mb;
4325     char *target_mtext;
4326     struct msgbuf *host_mb;
4327     abi_long ret = 0;
4328 
4329     if (msgsz < 0) {
4330         return -TARGET_EINVAL;
4331     }
4332 
4333     if (!lock_user_struct(VERIFY_WRITE, target_mb, msgp, 0))
4334         return -TARGET_EFAULT;
4335 
4336     host_mb = g_try_malloc(msgsz + sizeof(long));
4337     if (!host_mb) {
4338         ret = -TARGET_ENOMEM;
4339         goto end;
4340     }
4341     ret = -TARGET_ENOSYS;
4342 #ifdef __NR_msgrcv
4343     ret = get_errno(safe_msgrcv(msqid, host_mb, msgsz, msgtyp, msgflg));
4344 #endif
4345 #ifdef __NR_ipc
4346     if (ret == -TARGET_ENOSYS) {
4347         ret = get_errno(safe_ipc(IPCOP_CALL(1, IPCOP_msgrcv), msqid, msgsz,
4348                         msgflg, MSGRCV_ARGS(host_mb, msgtyp)));
4349     }
4350 #endif
4351 
4352     if (ret > 0) {
4353         abi_ulong target_mtext_addr = msgp + sizeof(abi_ulong);
4354         target_mtext = lock_user(VERIFY_WRITE, target_mtext_addr, ret, 0);
4355         if (!target_mtext) {
4356             ret = -TARGET_EFAULT;
4357             goto end;
4358         }
4359         memcpy(target_mb->mtext, host_mb->mtext, ret);
4360         unlock_user(target_mtext, target_mtext_addr, ret);
4361     }
4362 
4363     target_mb->mtype = tswapal(host_mb->mtype);
4364 
4365 end:
4366     if (target_mb)
4367         unlock_user_struct(target_mb, msgp, 1);
4368     g_free(host_mb);
4369     return ret;
4370 }
4371 
target_to_host_shmid_ds(struct shmid_ds * host_sd,abi_ulong target_addr)4372 static inline abi_long target_to_host_shmid_ds(struct shmid_ds *host_sd,
4373                                                abi_ulong target_addr)
4374 {
4375     struct target_shmid_ds *target_sd;
4376 
4377     if (!lock_user_struct(VERIFY_READ, target_sd, target_addr, 1))
4378         return -TARGET_EFAULT;
4379     if (target_to_host_ipc_perm(&(host_sd->shm_perm), target_addr))
4380         return -TARGET_EFAULT;
4381     __get_user(host_sd->shm_segsz, &target_sd->shm_segsz);
4382     __get_user(host_sd->shm_atime, &target_sd->shm_atime);
4383     __get_user(host_sd->shm_dtime, &target_sd->shm_dtime);
4384     __get_user(host_sd->shm_ctime, &target_sd->shm_ctime);
4385     __get_user(host_sd->shm_cpid, &target_sd->shm_cpid);
4386     __get_user(host_sd->shm_lpid, &target_sd->shm_lpid);
4387     __get_user(host_sd->shm_nattch, &target_sd->shm_nattch);
4388     unlock_user_struct(target_sd, target_addr, 0);
4389     return 0;
4390 }
4391 
host_to_target_shmid_ds(abi_ulong target_addr,struct shmid_ds * host_sd)4392 static inline abi_long host_to_target_shmid_ds(abi_ulong target_addr,
4393                                                struct shmid_ds *host_sd)
4394 {
4395     struct target_shmid_ds *target_sd;
4396 
4397     if (!lock_user_struct(VERIFY_WRITE, target_sd, target_addr, 0))
4398         return -TARGET_EFAULT;
4399     if (host_to_target_ipc_perm(target_addr, &(host_sd->shm_perm)))
4400         return -TARGET_EFAULT;
4401     __put_user(host_sd->shm_segsz, &target_sd->shm_segsz);
4402     __put_user(host_sd->shm_atime, &target_sd->shm_atime);
4403     __put_user(host_sd->shm_dtime, &target_sd->shm_dtime);
4404     __put_user(host_sd->shm_ctime, &target_sd->shm_ctime);
4405     __put_user(host_sd->shm_cpid, &target_sd->shm_cpid);
4406     __put_user(host_sd->shm_lpid, &target_sd->shm_lpid);
4407     __put_user(host_sd->shm_nattch, &target_sd->shm_nattch);
4408     unlock_user_struct(target_sd, target_addr, 1);
4409     return 0;
4410 }
4411 
4412 struct  target_shminfo {
4413     abi_ulong shmmax;
4414     abi_ulong shmmin;
4415     abi_ulong shmmni;
4416     abi_ulong shmseg;
4417     abi_ulong shmall;
4418 };
4419 
host_to_target_shminfo(abi_ulong target_addr,struct shminfo * host_shminfo)4420 static inline abi_long host_to_target_shminfo(abi_ulong target_addr,
4421                                               struct shminfo *host_shminfo)
4422 {
4423     struct target_shminfo *target_shminfo;
4424     if (!lock_user_struct(VERIFY_WRITE, target_shminfo, target_addr, 0))
4425         return -TARGET_EFAULT;
4426     __put_user(host_shminfo->shmmax, &target_shminfo->shmmax);
4427     __put_user(host_shminfo->shmmin, &target_shminfo->shmmin);
4428     __put_user(host_shminfo->shmmni, &target_shminfo->shmmni);
4429     __put_user(host_shminfo->shmseg, &target_shminfo->shmseg);
4430     __put_user(host_shminfo->shmall, &target_shminfo->shmall);
4431     unlock_user_struct(target_shminfo, target_addr, 1);
4432     return 0;
4433 }
4434 
4435 struct target_shm_info {
4436     int used_ids;
4437     abi_ulong shm_tot;
4438     abi_ulong shm_rss;
4439     abi_ulong shm_swp;
4440     abi_ulong swap_attempts;
4441     abi_ulong swap_successes;
4442 };
4443 
host_to_target_shm_info(abi_ulong target_addr,struct shm_info * host_shm_info)4444 static inline abi_long host_to_target_shm_info(abi_ulong target_addr,
4445                                                struct shm_info *host_shm_info)
4446 {
4447     struct target_shm_info *target_shm_info;
4448     if (!lock_user_struct(VERIFY_WRITE, target_shm_info, target_addr, 0))
4449         return -TARGET_EFAULT;
4450     __put_user(host_shm_info->used_ids, &target_shm_info->used_ids);
4451     __put_user(host_shm_info->shm_tot, &target_shm_info->shm_tot);
4452     __put_user(host_shm_info->shm_rss, &target_shm_info->shm_rss);
4453     __put_user(host_shm_info->shm_swp, &target_shm_info->shm_swp);
4454     __put_user(host_shm_info->swap_attempts, &target_shm_info->swap_attempts);
4455     __put_user(host_shm_info->swap_successes, &target_shm_info->swap_successes);
4456     unlock_user_struct(target_shm_info, target_addr, 1);
4457     return 0;
4458 }
4459 
do_shmctl(int shmid,int cmd,abi_long buf)4460 static inline abi_long do_shmctl(int shmid, int cmd, abi_long buf)
4461 {
4462     struct shmid_ds dsarg;
4463     struct shminfo shminfo;
4464     struct shm_info shm_info;
4465     abi_long ret = -TARGET_EINVAL;
4466 
4467     cmd &= 0xff;
4468 
4469     switch(cmd) {
4470     case IPC_STAT:
4471     case IPC_SET:
4472     case SHM_STAT:
4473         if (target_to_host_shmid_ds(&dsarg, buf))
4474             return -TARGET_EFAULT;
4475         ret = get_errno(shmctl(shmid, cmd, &dsarg));
4476         if (host_to_target_shmid_ds(buf, &dsarg))
4477             return -TARGET_EFAULT;
4478         break;
4479     case IPC_INFO:
4480         ret = get_errno(shmctl(shmid, cmd, (struct shmid_ds *)&shminfo));
4481         if (host_to_target_shminfo(buf, &shminfo))
4482             return -TARGET_EFAULT;
4483         break;
4484     case SHM_INFO:
4485         ret = get_errno(shmctl(shmid, cmd, (struct shmid_ds *)&shm_info));
4486         if (host_to_target_shm_info(buf, &shm_info))
4487             return -TARGET_EFAULT;
4488         break;
4489     case IPC_RMID:
4490     case SHM_LOCK:
4491     case SHM_UNLOCK:
4492         ret = get_errno(shmctl(shmid, cmd, NULL));
4493         break;
4494     }
4495 
4496     return ret;
4497 }
4498 
4499 #ifdef TARGET_NR_ipc
4500 /* ??? This only works with linear mappings.  */
4501 /* do_ipc() must return target values and target errnos. */
do_ipc(CPUArchState * cpu_env,unsigned int call,abi_long first,abi_long second,abi_long third,abi_long ptr,abi_long fifth)4502 static abi_long do_ipc(CPUArchState *cpu_env,
4503                        unsigned int call, abi_long first,
4504                        abi_long second, abi_long third,
4505                        abi_long ptr, abi_long fifth)
4506 {
4507     int version;
4508     abi_long ret = 0;
4509 
4510     version = call >> 16;
4511     call &= 0xffff;
4512 
4513     switch (call) {
4514     case IPCOP_semop:
4515         ret = do_semtimedop(first, ptr, second, 0, false);
4516         break;
4517     case IPCOP_semtimedop:
4518     /*
4519      * The s390 sys_ipc variant has only five parameters instead of six
4520      * (as for default variant) and the only difference is the handling of
4521      * SEMTIMEDOP where on s390 the third parameter is used as a pointer
4522      * to a struct timespec where the generic variant uses fifth parameter.
4523      */
4524 #if defined(TARGET_S390X)
4525         ret = do_semtimedop(first, ptr, second, third, TARGET_ABI_BITS == 64);
4526 #else
4527         ret = do_semtimedop(first, ptr, second, fifth, TARGET_ABI_BITS == 64);
4528 #endif
4529         break;
4530 
4531     case IPCOP_semget:
4532         ret = get_errno(semget(first, second, third));
4533         break;
4534 
4535     case IPCOP_semctl: {
4536         /* The semun argument to semctl is passed by value, so dereference the
4537          * ptr argument. */
4538         abi_ulong atptr;
4539         get_user_ual(atptr, ptr);
4540         ret = do_semctl(first, second, third, atptr);
4541         break;
4542     }
4543 
4544     case IPCOP_msgget:
4545         ret = get_errno(msgget(first, second));
4546         break;
4547 
4548     case IPCOP_msgsnd:
4549         ret = do_msgsnd(first, ptr, second, third);
4550         break;
4551 
4552     case IPCOP_msgctl:
4553         ret = do_msgctl(first, second, ptr);
4554         break;
4555 
4556     case IPCOP_msgrcv:
4557         switch (version) {
4558         case 0:
4559             {
4560                 struct target_ipc_kludge {
4561                     abi_long msgp;
4562                     abi_long msgtyp;
4563                 } *tmp;
4564 
4565                 if (!lock_user_struct(VERIFY_READ, tmp, ptr, 1)) {
4566                     ret = -TARGET_EFAULT;
4567                     break;
4568                 }
4569 
4570                 ret = do_msgrcv(first, tswapal(tmp->msgp), second, tswapal(tmp->msgtyp), third);
4571 
4572                 unlock_user_struct(tmp, ptr, 0);
4573                 break;
4574             }
4575         default:
4576             ret = do_msgrcv(first, ptr, second, fifth, third);
4577         }
4578         break;
4579 
4580     case IPCOP_shmat:
4581         switch (version) {
4582         default:
4583         {
4584             abi_ulong raddr;
4585             raddr = target_shmat(cpu_env, first, ptr, second);
4586             if (is_error(raddr))
4587                 return get_errno(raddr);
4588             if (put_user_ual(raddr, third))
4589                 return -TARGET_EFAULT;
4590             break;
4591         }
4592         case 1:
4593             ret = -TARGET_EINVAL;
4594             break;
4595         }
4596 	break;
4597     case IPCOP_shmdt:
4598         ret = target_shmdt(ptr);
4599 	break;
4600 
4601     case IPCOP_shmget:
4602 	/* IPC_* flag values are the same on all linux platforms */
4603 	ret = get_errno(shmget(first, second, third));
4604 	break;
4605 
4606 	/* IPC_* and SHM_* command values are the same on all linux platforms */
4607     case IPCOP_shmctl:
4608         ret = do_shmctl(first, second, ptr);
4609         break;
4610     default:
4611         qemu_log_mask(LOG_UNIMP, "Unsupported ipc call: %d (version %d)\n",
4612                       call, version);
4613 	ret = -TARGET_ENOSYS;
4614 	break;
4615     }
4616     return ret;
4617 }
4618 #endif
4619 
4620 /* kernel structure types definitions */
4621 
4622 #define STRUCT(name, ...) STRUCT_ ## name,
4623 #define STRUCT_SPECIAL(name) STRUCT_ ## name,
4624 enum {
4625 #include "syscall_types.h"
4626 STRUCT_MAX
4627 };
4628 #undef STRUCT
4629 #undef STRUCT_SPECIAL
4630 
4631 #define STRUCT(name, ...) static const argtype struct_ ## name ## _def[] = {  __VA_ARGS__, TYPE_NULL };
4632 #define STRUCT_SPECIAL(name)
4633 #include "syscall_types.h"
4634 #undef STRUCT
4635 #undef STRUCT_SPECIAL
4636 
4637 #define MAX_STRUCT_SIZE 4096
4638 
4639 #ifdef CONFIG_FIEMAP
4640 /* So fiemap access checks don't overflow on 32 bit systems.
4641  * This is very slightly smaller than the limit imposed by
4642  * the underlying kernel.
4643  */
4644 #define FIEMAP_MAX_EXTENTS ((UINT_MAX - sizeof(struct fiemap))  \
4645                             / sizeof(struct fiemap_extent))
4646 
do_ioctl_fs_ioc_fiemap(const IOCTLEntry * ie,uint8_t * buf_temp,int fd,int cmd,abi_long arg)4647 static abi_long do_ioctl_fs_ioc_fiemap(const IOCTLEntry *ie, uint8_t *buf_temp,
4648                                        int fd, int cmd, abi_long arg)
4649 {
4650     /* The parameter for this ioctl is a struct fiemap followed
4651      * by an array of struct fiemap_extent whose size is set
4652      * in fiemap->fm_extent_count. The array is filled in by the
4653      * ioctl.
4654      */
4655     int target_size_in, target_size_out;
4656     struct fiemap *fm;
4657     const argtype *arg_type = ie->arg_type;
4658     const argtype extent_arg_type[] = { MK_STRUCT(STRUCT_fiemap_extent) };
4659     void *argptr, *p;
4660     abi_long ret;
4661     int i, extent_size = thunk_type_size(extent_arg_type, 0);
4662     uint32_t outbufsz;
4663     int free_fm = 0;
4664 
4665     assert(arg_type[0] == TYPE_PTR);
4666     assert(ie->access == IOC_RW);
4667     arg_type++;
4668     target_size_in = thunk_type_size(arg_type, 0);
4669     argptr = lock_user(VERIFY_READ, arg, target_size_in, 1);
4670     if (!argptr) {
4671         return -TARGET_EFAULT;
4672     }
4673     thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST);
4674     unlock_user(argptr, arg, 0);
4675     fm = (struct fiemap *)buf_temp;
4676     if (fm->fm_extent_count > FIEMAP_MAX_EXTENTS) {
4677         return -TARGET_EINVAL;
4678     }
4679 
4680     outbufsz = sizeof (*fm) +
4681         (sizeof(struct fiemap_extent) * fm->fm_extent_count);
4682 
4683     if (outbufsz > MAX_STRUCT_SIZE) {
4684         /* We can't fit all the extents into the fixed size buffer.
4685          * Allocate one that is large enough and use it instead.
4686          */
4687         fm = g_try_malloc(outbufsz);
4688         if (!fm) {
4689             return -TARGET_ENOMEM;
4690         }
4691         memcpy(fm, buf_temp, sizeof(struct fiemap));
4692         free_fm = 1;
4693     }
4694     ret = get_errno(safe_ioctl(fd, ie->host_cmd, fm));
4695     if (!is_error(ret)) {
4696         target_size_out = target_size_in;
4697         /* An extent_count of 0 means we were only counting the extents
4698          * so there are no structs to copy
4699          */
4700         if (fm->fm_extent_count != 0) {
4701             target_size_out += fm->fm_mapped_extents * extent_size;
4702         }
4703         argptr = lock_user(VERIFY_WRITE, arg, target_size_out, 0);
4704         if (!argptr) {
4705             ret = -TARGET_EFAULT;
4706         } else {
4707             /* Convert the struct fiemap */
4708             thunk_convert(argptr, fm, arg_type, THUNK_TARGET);
4709             if (fm->fm_extent_count != 0) {
4710                 p = argptr + target_size_in;
4711                 /* ...and then all the struct fiemap_extents */
4712                 for (i = 0; i < fm->fm_mapped_extents; i++) {
4713                     thunk_convert(p, &fm->fm_extents[i], extent_arg_type,
4714                                   THUNK_TARGET);
4715                     p += extent_size;
4716                 }
4717             }
4718             unlock_user(argptr, arg, target_size_out);
4719         }
4720     }
4721     if (free_fm) {
4722         g_free(fm);
4723     }
4724     return ret;
4725 }
4726 #endif
4727 
do_ioctl_ifconf(const IOCTLEntry * ie,uint8_t * buf_temp,int fd,int cmd,abi_long arg)4728 static abi_long do_ioctl_ifconf(const IOCTLEntry *ie, uint8_t *buf_temp,
4729                                 int fd, int cmd, abi_long arg)
4730 {
4731     const argtype *arg_type = ie->arg_type;
4732     int target_size;
4733     void *argptr;
4734     int ret;
4735     struct ifconf *host_ifconf;
4736     uint32_t outbufsz;
4737     const argtype ifreq_arg_type[] = { MK_STRUCT(STRUCT_sockaddr_ifreq) };
4738     const argtype ifreq_max_type[] = { MK_STRUCT(STRUCT_ifmap_ifreq) };
4739     int target_ifreq_size;
4740     int nb_ifreq;
4741     int free_buf = 0;
4742     int i;
4743     int target_ifc_len;
4744     abi_long target_ifc_buf;
4745     int host_ifc_len;
4746     char *host_ifc_buf;
4747 
4748     assert(arg_type[0] == TYPE_PTR);
4749     assert(ie->access == IOC_RW);
4750 
4751     arg_type++;
4752     target_size = thunk_type_size(arg_type, 0);
4753 
4754     argptr = lock_user(VERIFY_READ, arg, target_size, 1);
4755     if (!argptr)
4756         return -TARGET_EFAULT;
4757     thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST);
4758     unlock_user(argptr, arg, 0);
4759 
4760     host_ifconf = (struct ifconf *)(unsigned long)buf_temp;
4761     target_ifc_buf = (abi_long)(unsigned long)host_ifconf->ifc_buf;
4762     target_ifreq_size = thunk_type_size(ifreq_max_type, 0);
4763 
4764     if (target_ifc_buf != 0) {
4765         target_ifc_len = host_ifconf->ifc_len;
4766         nb_ifreq = target_ifc_len / target_ifreq_size;
4767         host_ifc_len = nb_ifreq * sizeof(struct ifreq);
4768 
4769         outbufsz = sizeof(*host_ifconf) + host_ifc_len;
4770         if (outbufsz > MAX_STRUCT_SIZE) {
4771             /*
4772              * We can't fit all the extents into the fixed size buffer.
4773              * Allocate one that is large enough and use it instead.
4774              */
4775             host_ifconf = g_try_malloc(outbufsz);
4776             if (!host_ifconf) {
4777                 return -TARGET_ENOMEM;
4778             }
4779             memcpy(host_ifconf, buf_temp, sizeof(*host_ifconf));
4780             free_buf = 1;
4781         }
4782         host_ifc_buf = (char *)host_ifconf + sizeof(*host_ifconf);
4783 
4784         host_ifconf->ifc_len = host_ifc_len;
4785     } else {
4786       host_ifc_buf = NULL;
4787     }
4788     host_ifconf->ifc_buf = host_ifc_buf;
4789 
4790     ret = get_errno(safe_ioctl(fd, ie->host_cmd, host_ifconf));
4791     if (!is_error(ret)) {
4792 	/* convert host ifc_len to target ifc_len */
4793 
4794         nb_ifreq = host_ifconf->ifc_len / sizeof(struct ifreq);
4795         target_ifc_len = nb_ifreq * target_ifreq_size;
4796         host_ifconf->ifc_len = target_ifc_len;
4797 
4798 	/* restore target ifc_buf */
4799 
4800         host_ifconf->ifc_buf = (char *)(unsigned long)target_ifc_buf;
4801 
4802 	/* copy struct ifconf to target user */
4803 
4804         argptr = lock_user(VERIFY_WRITE, arg, target_size, 0);
4805         if (!argptr)
4806             return -TARGET_EFAULT;
4807         thunk_convert(argptr, host_ifconf, arg_type, THUNK_TARGET);
4808         unlock_user(argptr, arg, target_size);
4809 
4810         if (target_ifc_buf != 0) {
4811             /* copy ifreq[] to target user */
4812             argptr = lock_user(VERIFY_WRITE, target_ifc_buf, target_ifc_len, 0);
4813             for (i = 0; i < nb_ifreq ; i++) {
4814                 thunk_convert(argptr + i * target_ifreq_size,
4815                               host_ifc_buf + i * sizeof(struct ifreq),
4816                               ifreq_arg_type, THUNK_TARGET);
4817             }
4818             unlock_user(argptr, target_ifc_buf, target_ifc_len);
4819         }
4820     }
4821 
4822     if (free_buf) {
4823         g_free(host_ifconf);
4824     }
4825 
4826     return ret;
4827 }
4828 
4829 #if defined(CONFIG_USBFS)
4830 #if HOST_LONG_BITS > 64
4831 #error USBDEVFS thunks do not support >64 bit hosts yet.
4832 #endif
4833 struct live_urb {
4834     uint64_t target_urb_adr;
4835     uint64_t target_buf_adr;
4836     char *target_buf_ptr;
4837     struct usbdevfs_urb host_urb;
4838 };
4839 
usbdevfs_urb_hashtable(void)4840 static GHashTable *usbdevfs_urb_hashtable(void)
4841 {
4842     static GHashTable *urb_hashtable;
4843 
4844     if (!urb_hashtable) {
4845         urb_hashtable = g_hash_table_new(g_int64_hash, g_int64_equal);
4846     }
4847     return urb_hashtable;
4848 }
4849 
urb_hashtable_insert(struct live_urb * urb)4850 static void urb_hashtable_insert(struct live_urb *urb)
4851 {
4852     GHashTable *urb_hashtable = usbdevfs_urb_hashtable();
4853     g_hash_table_insert(urb_hashtable, urb, urb);
4854 }
4855 
urb_hashtable_lookup(uint64_t target_urb_adr)4856 static struct live_urb *urb_hashtable_lookup(uint64_t target_urb_adr)
4857 {
4858     GHashTable *urb_hashtable = usbdevfs_urb_hashtable();
4859     return g_hash_table_lookup(urb_hashtable, &target_urb_adr);
4860 }
4861 
urb_hashtable_remove(struct live_urb * urb)4862 static void urb_hashtable_remove(struct live_urb *urb)
4863 {
4864     GHashTable *urb_hashtable = usbdevfs_urb_hashtable();
4865     g_hash_table_remove(urb_hashtable, urb);
4866 }
4867 
4868 static abi_long
do_ioctl_usbdevfs_reapurb(const IOCTLEntry * ie,uint8_t * buf_temp,int fd,int cmd,abi_long arg)4869 do_ioctl_usbdevfs_reapurb(const IOCTLEntry *ie, uint8_t *buf_temp,
4870                           int fd, int cmd, abi_long arg)
4871 {
4872     const argtype usbfsurb_arg_type[] = { MK_STRUCT(STRUCT_usbdevfs_urb) };
4873     const argtype ptrvoid_arg_type[] = { TYPE_PTRVOID, 0, 0 };
4874     struct live_urb *lurb;
4875     void *argptr;
4876     uint64_t hurb;
4877     int target_size;
4878     uintptr_t target_urb_adr;
4879     abi_long ret;
4880 
4881     target_size = thunk_type_size(usbfsurb_arg_type, THUNK_TARGET);
4882 
4883     memset(buf_temp, 0, sizeof(uint64_t));
4884     ret = get_errno(safe_ioctl(fd, ie->host_cmd, buf_temp));
4885     if (is_error(ret)) {
4886         return ret;
4887     }
4888 
4889     memcpy(&hurb, buf_temp, sizeof(uint64_t));
4890     lurb = (void *)((uintptr_t)hurb - offsetof(struct live_urb, host_urb));
4891     if (!lurb->target_urb_adr) {
4892         return -TARGET_EFAULT;
4893     }
4894     urb_hashtable_remove(lurb);
4895     unlock_user(lurb->target_buf_ptr, lurb->target_buf_adr,
4896         lurb->host_urb.buffer_length);
4897     lurb->target_buf_ptr = NULL;
4898 
4899     /* restore the guest buffer pointer */
4900     lurb->host_urb.buffer = (void *)(uintptr_t)lurb->target_buf_adr;
4901 
4902     /* update the guest urb struct */
4903     argptr = lock_user(VERIFY_WRITE, lurb->target_urb_adr, target_size, 0);
4904     if (!argptr) {
4905         g_free(lurb);
4906         return -TARGET_EFAULT;
4907     }
4908     thunk_convert(argptr, &lurb->host_urb, usbfsurb_arg_type, THUNK_TARGET);
4909     unlock_user(argptr, lurb->target_urb_adr, target_size);
4910 
4911     target_size = thunk_type_size(ptrvoid_arg_type, THUNK_TARGET);
4912     /* write back the urb handle */
4913     argptr = lock_user(VERIFY_WRITE, arg, target_size, 0);
4914     if (!argptr) {
4915         g_free(lurb);
4916         return -TARGET_EFAULT;
4917     }
4918 
4919     /* GHashTable uses 64-bit keys but thunk_convert expects uintptr_t */
4920     target_urb_adr = lurb->target_urb_adr;
4921     thunk_convert(argptr, &target_urb_adr, ptrvoid_arg_type, THUNK_TARGET);
4922     unlock_user(argptr, arg, target_size);
4923 
4924     g_free(lurb);
4925     return ret;
4926 }
4927 
4928 static abi_long
do_ioctl_usbdevfs_discardurb(const IOCTLEntry * ie,uint8_t * buf_temp,int fd,int cmd,abi_long arg)4929 do_ioctl_usbdevfs_discardurb(const IOCTLEntry *ie,
4930                              uint8_t *buf_temp __attribute__((unused)),
4931                              int fd, int cmd, abi_long arg)
4932 {
4933     struct live_urb *lurb;
4934 
4935     /* map target address back to host URB with metadata. */
4936     lurb = urb_hashtable_lookup(arg);
4937     if (!lurb) {
4938         return -TARGET_EFAULT;
4939     }
4940     return get_errno(safe_ioctl(fd, ie->host_cmd, &lurb->host_urb));
4941 }
4942 
4943 static abi_long
do_ioctl_usbdevfs_submiturb(const IOCTLEntry * ie,uint8_t * buf_temp,int fd,int cmd,abi_long arg)4944 do_ioctl_usbdevfs_submiturb(const IOCTLEntry *ie, uint8_t *buf_temp,
4945                             int fd, int cmd, abi_long arg)
4946 {
4947     const argtype *arg_type = ie->arg_type;
4948     int target_size;
4949     abi_long ret;
4950     void *argptr;
4951     int rw_dir;
4952     struct live_urb *lurb;
4953 
4954     /*
4955      * each submitted URB needs to map to a unique ID for the
4956      * kernel, and that unique ID needs to be a pointer to
4957      * host memory.  hence, we need to malloc for each URB.
4958      * isochronous transfers have a variable length struct.
4959      */
4960     arg_type++;
4961     target_size = thunk_type_size(arg_type, THUNK_TARGET);
4962 
4963     /* construct host copy of urb and metadata */
4964     lurb = g_try_new0(struct live_urb, 1);
4965     if (!lurb) {
4966         return -TARGET_ENOMEM;
4967     }
4968 
4969     argptr = lock_user(VERIFY_READ, arg, target_size, 1);
4970     if (!argptr) {
4971         g_free(lurb);
4972         return -TARGET_EFAULT;
4973     }
4974     thunk_convert(&lurb->host_urb, argptr, arg_type, THUNK_HOST);
4975     unlock_user(argptr, arg, 0);
4976 
4977     lurb->target_urb_adr = arg;
4978     lurb->target_buf_adr = (uintptr_t)lurb->host_urb.buffer;
4979 
4980     /* buffer space used depends on endpoint type so lock the entire buffer */
4981     /* control type urbs should check the buffer contents for true direction */
4982     rw_dir = lurb->host_urb.endpoint & USB_DIR_IN ? VERIFY_WRITE : VERIFY_READ;
4983     lurb->target_buf_ptr = lock_user(rw_dir, lurb->target_buf_adr,
4984         lurb->host_urb.buffer_length, 1);
4985     if (lurb->target_buf_ptr == NULL) {
4986         g_free(lurb);
4987         return -TARGET_EFAULT;
4988     }
4989 
4990     /* update buffer pointer in host copy */
4991     lurb->host_urb.buffer = lurb->target_buf_ptr;
4992 
4993     ret = get_errno(safe_ioctl(fd, ie->host_cmd, &lurb->host_urb));
4994     if (is_error(ret)) {
4995         unlock_user(lurb->target_buf_ptr, lurb->target_buf_adr, 0);
4996         g_free(lurb);
4997     } else {
4998         urb_hashtable_insert(lurb);
4999     }
5000 
5001     return ret;
5002 }
5003 #endif /* CONFIG_USBFS */
5004 
do_ioctl_dm(const IOCTLEntry * ie,uint8_t * buf_temp,int fd,int cmd,abi_long arg)5005 static abi_long do_ioctl_dm(const IOCTLEntry *ie, uint8_t *buf_temp, int fd,
5006                             int cmd, abi_long arg)
5007 {
5008     void *argptr;
5009     struct dm_ioctl *host_dm;
5010     abi_long guest_data;
5011     uint32_t guest_data_size;
5012     int target_size;
5013     const argtype *arg_type = ie->arg_type;
5014     abi_long ret;
5015     void *big_buf = NULL;
5016     char *host_data;
5017 
5018     arg_type++;
5019     target_size = thunk_type_size(arg_type, 0);
5020     argptr = lock_user(VERIFY_READ, arg, target_size, 1);
5021     if (!argptr) {
5022         ret = -TARGET_EFAULT;
5023         goto out;
5024     }
5025     thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST);
5026     unlock_user(argptr, arg, 0);
5027 
5028     /* buf_temp is too small, so fetch things into a bigger buffer */
5029     big_buf = g_malloc0(((struct dm_ioctl*)buf_temp)->data_size * 2);
5030     memcpy(big_buf, buf_temp, target_size);
5031     buf_temp = big_buf;
5032     host_dm = big_buf;
5033 
5034     guest_data = arg + host_dm->data_start;
5035     if ((guest_data - arg) < 0) {
5036         ret = -TARGET_EINVAL;
5037         goto out;
5038     }
5039     guest_data_size = host_dm->data_size - host_dm->data_start;
5040     host_data = (char*)host_dm + host_dm->data_start;
5041 
5042     argptr = lock_user(VERIFY_READ, guest_data, guest_data_size, 1);
5043     if (!argptr) {
5044         ret = -TARGET_EFAULT;
5045         goto out;
5046     }
5047 
5048     switch (ie->host_cmd) {
5049     case DM_REMOVE_ALL:
5050     case DM_LIST_DEVICES:
5051     case DM_DEV_CREATE:
5052     case DM_DEV_REMOVE:
5053     case DM_DEV_SUSPEND:
5054     case DM_DEV_STATUS:
5055     case DM_DEV_WAIT:
5056     case DM_TABLE_STATUS:
5057     case DM_TABLE_CLEAR:
5058     case DM_TABLE_DEPS:
5059     case DM_LIST_VERSIONS:
5060         /* no input data */
5061         break;
5062     case DM_DEV_RENAME:
5063     case DM_DEV_SET_GEOMETRY:
5064         /* data contains only strings */
5065         memcpy(host_data, argptr, guest_data_size);
5066         break;
5067     case DM_TARGET_MSG:
5068         memcpy(host_data, argptr, guest_data_size);
5069         *(uint64_t*)host_data = tswap64(*(uint64_t*)argptr);
5070         break;
5071     case DM_TABLE_LOAD:
5072     {
5073         void *gspec = argptr;
5074         void *cur_data = host_data;
5075         const argtype dm_arg_type[] = { MK_STRUCT(STRUCT_dm_target_spec) };
5076         int spec_size = thunk_type_size(dm_arg_type, 0);
5077         int i;
5078 
5079         for (i = 0; i < host_dm->target_count; i++) {
5080             struct dm_target_spec *spec = cur_data;
5081             uint32_t next;
5082             int slen;
5083 
5084             thunk_convert(spec, gspec, dm_arg_type, THUNK_HOST);
5085             slen = strlen((char*)gspec + spec_size) + 1;
5086             next = spec->next;
5087             spec->next = sizeof(*spec) + slen;
5088             strcpy((char*)&spec[1], gspec + spec_size);
5089             gspec += next;
5090             cur_data += spec->next;
5091         }
5092         break;
5093     }
5094     default:
5095         ret = -TARGET_EINVAL;
5096         unlock_user(argptr, guest_data, 0);
5097         goto out;
5098     }
5099     unlock_user(argptr, guest_data, 0);
5100 
5101     ret = get_errno(safe_ioctl(fd, ie->host_cmd, buf_temp));
5102     if (!is_error(ret)) {
5103         guest_data = arg + host_dm->data_start;
5104         guest_data_size = host_dm->data_size - host_dm->data_start;
5105         argptr = lock_user(VERIFY_WRITE, guest_data, guest_data_size, 0);
5106         switch (ie->host_cmd) {
5107         case DM_REMOVE_ALL:
5108         case DM_DEV_CREATE:
5109         case DM_DEV_REMOVE:
5110         case DM_DEV_RENAME:
5111         case DM_DEV_SUSPEND:
5112         case DM_DEV_STATUS:
5113         case DM_TABLE_LOAD:
5114         case DM_TABLE_CLEAR:
5115         case DM_TARGET_MSG:
5116         case DM_DEV_SET_GEOMETRY:
5117             /* no return data */
5118             break;
5119         case DM_LIST_DEVICES:
5120         {
5121             struct dm_name_list *nl = (void*)host_dm + host_dm->data_start;
5122             uint32_t remaining_data = guest_data_size;
5123             void *cur_data = argptr;
5124             const argtype dm_arg_type[] = { MK_STRUCT(STRUCT_dm_name_list) };
5125             int nl_size = 12; /* can't use thunk_size due to alignment */
5126 
5127             while (1) {
5128                 uint32_t next = nl->next;
5129                 if (next) {
5130                     nl->next = nl_size + (strlen(nl->name) + 1);
5131                 }
5132                 if (remaining_data < nl->next) {
5133                     host_dm->flags |= DM_BUFFER_FULL_FLAG;
5134                     break;
5135                 }
5136                 thunk_convert(cur_data, nl, dm_arg_type, THUNK_TARGET);
5137                 strcpy(cur_data + nl_size, nl->name);
5138                 cur_data += nl->next;
5139                 remaining_data -= nl->next;
5140                 if (!next) {
5141                     break;
5142                 }
5143                 nl = (void*)nl + next;
5144             }
5145             break;
5146         }
5147         case DM_DEV_WAIT:
5148         case DM_TABLE_STATUS:
5149         {
5150             struct dm_target_spec *spec = (void*)host_dm + host_dm->data_start;
5151             void *cur_data = argptr;
5152             const argtype dm_arg_type[] = { MK_STRUCT(STRUCT_dm_target_spec) };
5153             int spec_size = thunk_type_size(dm_arg_type, 0);
5154             int i;
5155 
5156             for (i = 0; i < host_dm->target_count; i++) {
5157                 uint32_t next = spec->next;
5158                 int slen = strlen((char*)&spec[1]) + 1;
5159                 spec->next = (cur_data - argptr) + spec_size + slen;
5160                 if (guest_data_size < spec->next) {
5161                     host_dm->flags |= DM_BUFFER_FULL_FLAG;
5162                     break;
5163                 }
5164                 thunk_convert(cur_data, spec, dm_arg_type, THUNK_TARGET);
5165                 strcpy(cur_data + spec_size, (char*)&spec[1]);
5166                 cur_data = argptr + spec->next;
5167                 spec = (void*)host_dm + host_dm->data_start + next;
5168             }
5169             break;
5170         }
5171         case DM_TABLE_DEPS:
5172         {
5173             void *hdata = (void*)host_dm + host_dm->data_start;
5174             int count = *(uint32_t*)hdata;
5175             uint64_t *hdev = hdata + 8;
5176             uint64_t *gdev = argptr + 8;
5177             int i;
5178 
5179             *(uint32_t*)argptr = tswap32(count);
5180             for (i = 0; i < count; i++) {
5181                 *gdev = tswap64(*hdev);
5182                 gdev++;
5183                 hdev++;
5184             }
5185             break;
5186         }
5187         case DM_LIST_VERSIONS:
5188         {
5189             struct dm_target_versions *vers = (void*)host_dm + host_dm->data_start;
5190             uint32_t remaining_data = guest_data_size;
5191             void *cur_data = argptr;
5192             const argtype dm_arg_type[] = { MK_STRUCT(STRUCT_dm_target_versions) };
5193             int vers_size = thunk_type_size(dm_arg_type, 0);
5194 
5195             while (1) {
5196                 uint32_t next = vers->next;
5197                 if (next) {
5198                     vers->next = vers_size + (strlen(vers->name) + 1);
5199                 }
5200                 if (remaining_data < vers->next) {
5201                     host_dm->flags |= DM_BUFFER_FULL_FLAG;
5202                     break;
5203                 }
5204                 thunk_convert(cur_data, vers, dm_arg_type, THUNK_TARGET);
5205                 strcpy(cur_data + vers_size, vers->name);
5206                 cur_data += vers->next;
5207                 remaining_data -= vers->next;
5208                 if (!next) {
5209                     break;
5210                 }
5211                 vers = (void*)vers + next;
5212             }
5213             break;
5214         }
5215         default:
5216             unlock_user(argptr, guest_data, 0);
5217             ret = -TARGET_EINVAL;
5218             goto out;
5219         }
5220         unlock_user(argptr, guest_data, guest_data_size);
5221 
5222         argptr = lock_user(VERIFY_WRITE, arg, target_size, 0);
5223         if (!argptr) {
5224             ret = -TARGET_EFAULT;
5225             goto out;
5226         }
5227         thunk_convert(argptr, buf_temp, arg_type, THUNK_TARGET);
5228         unlock_user(argptr, arg, target_size);
5229     }
5230 out:
5231     g_free(big_buf);
5232     return ret;
5233 }
5234 
do_ioctl_blkpg(const IOCTLEntry * ie,uint8_t * buf_temp,int fd,int cmd,abi_long arg)5235 static abi_long do_ioctl_blkpg(const IOCTLEntry *ie, uint8_t *buf_temp, int fd,
5236                                int cmd, abi_long arg)
5237 {
5238     void *argptr;
5239     int target_size;
5240     const argtype *arg_type = ie->arg_type;
5241     const argtype part_arg_type[] = { MK_STRUCT(STRUCT_blkpg_partition) };
5242     abi_long ret;
5243 
5244     struct blkpg_ioctl_arg *host_blkpg = (void*)buf_temp;
5245     struct blkpg_partition host_part;
5246 
5247     /* Read and convert blkpg */
5248     arg_type++;
5249     target_size = thunk_type_size(arg_type, 0);
5250     argptr = lock_user(VERIFY_READ, arg, target_size, 1);
5251     if (!argptr) {
5252         ret = -TARGET_EFAULT;
5253         goto out;
5254     }
5255     thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST);
5256     unlock_user(argptr, arg, 0);
5257 
5258     switch (host_blkpg->op) {
5259     case BLKPG_ADD_PARTITION:
5260     case BLKPG_DEL_PARTITION:
5261         /* payload is struct blkpg_partition */
5262         break;
5263     default:
5264         /* Unknown opcode */
5265         ret = -TARGET_EINVAL;
5266         goto out;
5267     }
5268 
5269     /* Read and convert blkpg->data */
5270     arg = (abi_long)(uintptr_t)host_blkpg->data;
5271     target_size = thunk_type_size(part_arg_type, 0);
5272     argptr = lock_user(VERIFY_READ, arg, target_size, 1);
5273     if (!argptr) {
5274         ret = -TARGET_EFAULT;
5275         goto out;
5276     }
5277     thunk_convert(&host_part, argptr, part_arg_type, THUNK_HOST);
5278     unlock_user(argptr, arg, 0);
5279 
5280     /* Swizzle the data pointer to our local copy and call! */
5281     host_blkpg->data = &host_part;
5282     ret = get_errno(safe_ioctl(fd, ie->host_cmd, host_blkpg));
5283 
5284 out:
5285     return ret;
5286 }
5287 
do_ioctl_rt(const IOCTLEntry * ie,uint8_t * buf_temp,int fd,int cmd,abi_long arg)5288 static abi_long do_ioctl_rt(const IOCTLEntry *ie, uint8_t *buf_temp,
5289                                 int fd, int cmd, abi_long arg)
5290 {
5291     const argtype *arg_type = ie->arg_type;
5292     const StructEntry *se;
5293     const argtype *field_types;
5294     const int *dst_offsets, *src_offsets;
5295     int target_size;
5296     void *argptr;
5297     abi_ulong *target_rt_dev_ptr = NULL;
5298     unsigned long *host_rt_dev_ptr = NULL;
5299     abi_long ret;
5300     int i;
5301 
5302     assert(ie->access == IOC_W);
5303     assert(*arg_type == TYPE_PTR);
5304     arg_type++;
5305     assert(*arg_type == TYPE_STRUCT);
5306     target_size = thunk_type_size(arg_type, 0);
5307     argptr = lock_user(VERIFY_READ, arg, target_size, 1);
5308     if (!argptr) {
5309         return -TARGET_EFAULT;
5310     }
5311     arg_type++;
5312     assert(*arg_type == (int)STRUCT_rtentry);
5313     se = struct_entries + *arg_type++;
5314     assert(se->convert[0] == NULL);
5315     /* convert struct here to be able to catch rt_dev string */
5316     field_types = se->field_types;
5317     dst_offsets = se->field_offsets[THUNK_HOST];
5318     src_offsets = se->field_offsets[THUNK_TARGET];
5319     for (i = 0; i < se->nb_fields; i++) {
5320         if (dst_offsets[i] == offsetof(struct rtentry, rt_dev)) {
5321             assert(*field_types == TYPE_PTRVOID);
5322             target_rt_dev_ptr = argptr + src_offsets[i];
5323             host_rt_dev_ptr = (unsigned long *)(buf_temp + dst_offsets[i]);
5324             if (*target_rt_dev_ptr != 0) {
5325                 *host_rt_dev_ptr = (unsigned long)lock_user_string(
5326                                                   tswapal(*target_rt_dev_ptr));
5327                 if (!*host_rt_dev_ptr) {
5328                     unlock_user(argptr, arg, 0);
5329                     return -TARGET_EFAULT;
5330                 }
5331             } else {
5332                 *host_rt_dev_ptr = 0;
5333             }
5334             field_types++;
5335             continue;
5336         }
5337         field_types = thunk_convert(buf_temp + dst_offsets[i],
5338                                     argptr + src_offsets[i],
5339                                     field_types, THUNK_HOST);
5340     }
5341     unlock_user(argptr, arg, 0);
5342 
5343     ret = get_errno(safe_ioctl(fd, ie->host_cmd, buf_temp));
5344 
5345     assert(host_rt_dev_ptr != NULL);
5346     assert(target_rt_dev_ptr != NULL);
5347     if (*host_rt_dev_ptr != 0) {
5348         unlock_user((void *)*host_rt_dev_ptr,
5349                     *target_rt_dev_ptr, 0);
5350     }
5351     return ret;
5352 }
5353 
do_ioctl_kdsigaccept(const IOCTLEntry * ie,uint8_t * buf_temp,int fd,int cmd,abi_long arg)5354 static abi_long do_ioctl_kdsigaccept(const IOCTLEntry *ie, uint8_t *buf_temp,
5355                                      int fd, int cmd, abi_long arg)
5356 {
5357     int sig = target_to_host_signal(arg);
5358     return get_errno(safe_ioctl(fd, ie->host_cmd, sig));
5359 }
5360 
do_ioctl_SIOCGSTAMP(const IOCTLEntry * ie,uint8_t * buf_temp,int fd,int cmd,abi_long arg)5361 static abi_long do_ioctl_SIOCGSTAMP(const IOCTLEntry *ie, uint8_t *buf_temp,
5362                                     int fd, int cmd, abi_long arg)
5363 {
5364     struct timeval tv;
5365     abi_long ret;
5366 
5367     ret = get_errno(safe_ioctl(fd, SIOCGSTAMP, &tv));
5368     if (is_error(ret)) {
5369         return ret;
5370     }
5371 
5372     if (cmd == (int)TARGET_SIOCGSTAMP_OLD) {
5373         if (copy_to_user_timeval(arg, &tv)) {
5374             return -TARGET_EFAULT;
5375         }
5376     } else {
5377         if (copy_to_user_timeval64(arg, &tv)) {
5378             return -TARGET_EFAULT;
5379         }
5380     }
5381 
5382     return ret;
5383 }
5384 
do_ioctl_SIOCGSTAMPNS(const IOCTLEntry * ie,uint8_t * buf_temp,int fd,int cmd,abi_long arg)5385 static abi_long do_ioctl_SIOCGSTAMPNS(const IOCTLEntry *ie, uint8_t *buf_temp,
5386                                       int fd, int cmd, abi_long arg)
5387 {
5388     struct timespec ts;
5389     abi_long ret;
5390 
5391     ret = get_errno(safe_ioctl(fd, SIOCGSTAMPNS, &ts));
5392     if (is_error(ret)) {
5393         return ret;
5394     }
5395 
5396     if (cmd == (int)TARGET_SIOCGSTAMPNS_OLD) {
5397         if (host_to_target_timespec(arg, &ts)) {
5398             return -TARGET_EFAULT;
5399         }
5400     } else{
5401         if (host_to_target_timespec64(arg, &ts)) {
5402             return -TARGET_EFAULT;
5403         }
5404     }
5405 
5406     return ret;
5407 }
5408 
5409 #ifdef TIOCGPTPEER
do_ioctl_tiocgptpeer(const IOCTLEntry * ie,uint8_t * buf_temp,int fd,int cmd,abi_long arg)5410 static abi_long do_ioctl_tiocgptpeer(const IOCTLEntry *ie, uint8_t *buf_temp,
5411                                      int fd, int cmd, abi_long arg)
5412 {
5413     int flags = target_to_host_bitmask(arg, fcntl_flags_tbl);
5414     return get_errno(safe_ioctl(fd, ie->host_cmd, flags));
5415 }
5416 #endif
5417 
5418 #ifdef HAVE_DRM_H
5419 
unlock_drm_version(struct drm_version * host_ver,struct target_drm_version * target_ver,bool copy)5420 static void unlock_drm_version(struct drm_version *host_ver,
5421                                struct target_drm_version *target_ver,
5422                                bool copy)
5423 {
5424     unlock_user(host_ver->name, target_ver->name,
5425                                 copy ? host_ver->name_len : 0);
5426     unlock_user(host_ver->date, target_ver->date,
5427                                 copy ? host_ver->date_len : 0);
5428     unlock_user(host_ver->desc, target_ver->desc,
5429                                 copy ? host_ver->desc_len : 0);
5430 }
5431 
target_to_host_drmversion(struct drm_version * host_ver,struct target_drm_version * target_ver)5432 static inline abi_long target_to_host_drmversion(struct drm_version *host_ver,
5433                                           struct target_drm_version *target_ver)
5434 {
5435     memset(host_ver, 0, sizeof(*host_ver));
5436 
5437     __get_user(host_ver->name_len, &target_ver->name_len);
5438     if (host_ver->name_len) {
5439         host_ver->name = lock_user(VERIFY_WRITE, target_ver->name,
5440                                    target_ver->name_len, 0);
5441         if (!host_ver->name) {
5442             return -EFAULT;
5443         }
5444     }
5445 
5446     __get_user(host_ver->date_len, &target_ver->date_len);
5447     if (host_ver->date_len) {
5448         host_ver->date = lock_user(VERIFY_WRITE, target_ver->date,
5449                                    target_ver->date_len, 0);
5450         if (!host_ver->date) {
5451             goto err;
5452         }
5453     }
5454 
5455     __get_user(host_ver->desc_len, &target_ver->desc_len);
5456     if (host_ver->desc_len) {
5457         host_ver->desc = lock_user(VERIFY_WRITE, target_ver->desc,
5458                                    target_ver->desc_len, 0);
5459         if (!host_ver->desc) {
5460             goto err;
5461         }
5462     }
5463 
5464     return 0;
5465 err:
5466     unlock_drm_version(host_ver, target_ver, false);
5467     return -EFAULT;
5468 }
5469 
host_to_target_drmversion(struct target_drm_version * target_ver,struct drm_version * host_ver)5470 static inline void host_to_target_drmversion(
5471                                           struct target_drm_version *target_ver,
5472                                           struct drm_version *host_ver)
5473 {
5474     __put_user(host_ver->version_major, &target_ver->version_major);
5475     __put_user(host_ver->version_minor, &target_ver->version_minor);
5476     __put_user(host_ver->version_patchlevel, &target_ver->version_patchlevel);
5477     __put_user(host_ver->name_len, &target_ver->name_len);
5478     __put_user(host_ver->date_len, &target_ver->date_len);
5479     __put_user(host_ver->desc_len, &target_ver->desc_len);
5480     unlock_drm_version(host_ver, target_ver, true);
5481 }
5482 
do_ioctl_drm(const IOCTLEntry * ie,uint8_t * buf_temp,int fd,int cmd,abi_long arg)5483 static abi_long do_ioctl_drm(const IOCTLEntry *ie, uint8_t *buf_temp,
5484                              int fd, int cmd, abi_long arg)
5485 {
5486     struct drm_version *ver;
5487     struct target_drm_version *target_ver;
5488     abi_long ret;
5489 
5490     switch (ie->host_cmd) {
5491     case DRM_IOCTL_VERSION:
5492         if (!lock_user_struct(VERIFY_WRITE, target_ver, arg, 0)) {
5493             return -TARGET_EFAULT;
5494         }
5495         ver = (struct drm_version *)buf_temp;
5496         ret = target_to_host_drmversion(ver, target_ver);
5497         if (!is_error(ret)) {
5498             ret = get_errno(safe_ioctl(fd, ie->host_cmd, ver));
5499             if (is_error(ret)) {
5500                 unlock_drm_version(ver, target_ver, false);
5501             } else {
5502                 host_to_target_drmversion(target_ver, ver);
5503             }
5504         }
5505         unlock_user_struct(target_ver, arg, 0);
5506         return ret;
5507     }
5508     return -TARGET_ENOSYS;
5509 }
5510 
do_ioctl_drm_i915_getparam(const IOCTLEntry * ie,struct drm_i915_getparam * gparam,int fd,abi_long arg)5511 static abi_long do_ioctl_drm_i915_getparam(const IOCTLEntry *ie,
5512                                            struct drm_i915_getparam *gparam,
5513                                            int fd, abi_long arg)
5514 {
5515     abi_long ret;
5516     int value;
5517     struct target_drm_i915_getparam *target_gparam;
5518 
5519     if (!lock_user_struct(VERIFY_READ, target_gparam, arg, 0)) {
5520         return -TARGET_EFAULT;
5521     }
5522 
5523     __get_user(gparam->param, &target_gparam->param);
5524     gparam->value = &value;
5525     ret = get_errno(safe_ioctl(fd, ie->host_cmd, gparam));
5526     put_user_s32(value, target_gparam->value);
5527 
5528     unlock_user_struct(target_gparam, arg, 0);
5529     return ret;
5530 }
5531 
do_ioctl_drm_i915(const IOCTLEntry * ie,uint8_t * buf_temp,int fd,int cmd,abi_long arg)5532 static abi_long do_ioctl_drm_i915(const IOCTLEntry *ie, uint8_t *buf_temp,
5533                                   int fd, int cmd, abi_long arg)
5534 {
5535     switch (ie->host_cmd) {
5536     case DRM_IOCTL_I915_GETPARAM:
5537         return do_ioctl_drm_i915_getparam(ie,
5538                                           (struct drm_i915_getparam *)buf_temp,
5539                                           fd, arg);
5540     default:
5541         return -TARGET_ENOSYS;
5542     }
5543 }
5544 
5545 #endif
5546 
do_ioctl_TUNSETTXFILTER(const IOCTLEntry * ie,uint8_t * buf_temp,int fd,int cmd,abi_long arg)5547 static abi_long do_ioctl_TUNSETTXFILTER(const IOCTLEntry *ie, uint8_t *buf_temp,
5548                                         int fd, int cmd, abi_long arg)
5549 {
5550     struct tun_filter *filter = (struct tun_filter *)buf_temp;
5551     struct tun_filter *target_filter;
5552     char *target_addr;
5553 
5554     assert(ie->access == IOC_W);
5555 
5556     target_filter = lock_user(VERIFY_READ, arg, sizeof(*target_filter), 1);
5557     if (!target_filter) {
5558         return -TARGET_EFAULT;
5559     }
5560     filter->flags = tswap16(target_filter->flags);
5561     filter->count = tswap16(target_filter->count);
5562     unlock_user(target_filter, arg, 0);
5563 
5564     if (filter->count) {
5565         if (offsetof(struct tun_filter, addr) + filter->count * ETH_ALEN >
5566             MAX_STRUCT_SIZE) {
5567             return -TARGET_EFAULT;
5568         }
5569 
5570         target_addr = lock_user(VERIFY_READ,
5571                                 arg + offsetof(struct tun_filter, addr),
5572                                 filter->count * ETH_ALEN, 1);
5573         if (!target_addr) {
5574             return -TARGET_EFAULT;
5575         }
5576         memcpy(filter->addr, target_addr, filter->count * ETH_ALEN);
5577         unlock_user(target_addr, arg + offsetof(struct tun_filter, addr), 0);
5578     }
5579 
5580     return get_errno(safe_ioctl(fd, ie->host_cmd, filter));
5581 }
5582 
5583 IOCTLEntry ioctl_entries[] = {
5584 #define IOCTL(cmd, access, ...) \
5585     { TARGET_ ## cmd, cmd, #cmd, access, 0, {  __VA_ARGS__ } },
5586 #define IOCTL_SPECIAL(cmd, access, dofn, ...)                      \
5587     { TARGET_ ## cmd, cmd, #cmd, access, dofn, {  __VA_ARGS__ } },
5588 #define IOCTL_IGNORE(cmd) \
5589     { TARGET_ ## cmd, 0, #cmd },
5590 #include "ioctls.h"
5591     { 0, 0, },
5592 };
5593 
5594 /* ??? Implement proper locking for ioctls.  */
5595 /* do_ioctl() Must return target values and target errnos. */
do_ioctl(int fd,int cmd,abi_long arg)5596 static abi_long do_ioctl(int fd, int cmd, abi_long arg)
5597 {
5598     const IOCTLEntry *ie;
5599     const argtype *arg_type;
5600     abi_long ret;
5601     uint8_t buf_temp[MAX_STRUCT_SIZE];
5602     int target_size;
5603     void *argptr;
5604 
5605     ie = ioctl_entries;
5606     for(;;) {
5607         if (ie->target_cmd == 0) {
5608             qemu_log_mask(
5609                 LOG_UNIMP, "Unsupported ioctl: cmd=0x%04lx\n", (long)cmd);
5610             return -TARGET_ENOTTY;
5611         }
5612         if (ie->target_cmd == cmd)
5613             break;
5614         ie++;
5615     }
5616     arg_type = ie->arg_type;
5617     if (ie->do_ioctl) {
5618         return ie->do_ioctl(ie, buf_temp, fd, cmd, arg);
5619     } else if (!ie->host_cmd) {
5620         /* Some architectures define BSD ioctls in their headers
5621            that are not implemented in Linux.  */
5622         return -TARGET_ENOTTY;
5623     }
5624 
5625     switch(arg_type[0]) {
5626     case TYPE_NULL:
5627         /* no argument */
5628         ret = get_errno(safe_ioctl(fd, ie->host_cmd));
5629         break;
5630     case TYPE_PTRVOID:
5631     case TYPE_INT:
5632     case TYPE_LONG:
5633     case TYPE_ULONG:
5634         ret = get_errno(safe_ioctl(fd, ie->host_cmd, arg));
5635         break;
5636     case TYPE_PTR:
5637         arg_type++;
5638         target_size = thunk_type_size(arg_type, 0);
5639         switch(ie->access) {
5640         case IOC_R:
5641             ret = get_errno(safe_ioctl(fd, ie->host_cmd, buf_temp));
5642             if (!is_error(ret)) {
5643                 argptr = lock_user(VERIFY_WRITE, arg, target_size, 0);
5644                 if (!argptr)
5645                     return -TARGET_EFAULT;
5646                 thunk_convert(argptr, buf_temp, arg_type, THUNK_TARGET);
5647                 unlock_user(argptr, arg, target_size);
5648             }
5649             break;
5650         case IOC_W:
5651             argptr = lock_user(VERIFY_READ, arg, target_size, 1);
5652             if (!argptr)
5653                 return -TARGET_EFAULT;
5654             thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST);
5655             unlock_user(argptr, arg, 0);
5656             ret = get_errno(safe_ioctl(fd, ie->host_cmd, buf_temp));
5657             break;
5658         default:
5659         case IOC_RW:
5660             argptr = lock_user(VERIFY_READ, arg, target_size, 1);
5661             if (!argptr)
5662                 return -TARGET_EFAULT;
5663             thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST);
5664             unlock_user(argptr, arg, 0);
5665             ret = get_errno(safe_ioctl(fd, ie->host_cmd, buf_temp));
5666             if (!is_error(ret)) {
5667                 argptr = lock_user(VERIFY_WRITE, arg, target_size, 0);
5668                 if (!argptr)
5669                     return -TARGET_EFAULT;
5670                 thunk_convert(argptr, buf_temp, arg_type, THUNK_TARGET);
5671                 unlock_user(argptr, arg, target_size);
5672             }
5673             break;
5674         }
5675         break;
5676     default:
5677         qemu_log_mask(LOG_UNIMP,
5678                       "Unsupported ioctl type: cmd=0x%04lx type=%d\n",
5679                       (long)cmd, arg_type[0]);
5680         ret = -TARGET_ENOTTY;
5681         break;
5682     }
5683     return ret;
5684 }
5685 
5686 static const bitmask_transtbl iflag_tbl[] = {
5687         { TARGET_IGNBRK, TARGET_IGNBRK, IGNBRK, IGNBRK },
5688         { TARGET_BRKINT, TARGET_BRKINT, BRKINT, BRKINT },
5689         { TARGET_IGNPAR, TARGET_IGNPAR, IGNPAR, IGNPAR },
5690         { TARGET_PARMRK, TARGET_PARMRK, PARMRK, PARMRK },
5691         { TARGET_INPCK, TARGET_INPCK, INPCK, INPCK },
5692         { TARGET_ISTRIP, TARGET_ISTRIP, ISTRIP, ISTRIP },
5693         { TARGET_INLCR, TARGET_INLCR, INLCR, INLCR },
5694         { TARGET_IGNCR, TARGET_IGNCR, IGNCR, IGNCR },
5695         { TARGET_ICRNL, TARGET_ICRNL, ICRNL, ICRNL },
5696         { TARGET_IUCLC, TARGET_IUCLC, IUCLC, IUCLC },
5697         { TARGET_IXON, TARGET_IXON, IXON, IXON },
5698         { TARGET_IXANY, TARGET_IXANY, IXANY, IXANY },
5699         { TARGET_IXOFF, TARGET_IXOFF, IXOFF, IXOFF },
5700         { TARGET_IMAXBEL, TARGET_IMAXBEL, IMAXBEL, IMAXBEL },
5701         { TARGET_IUTF8, TARGET_IUTF8, IUTF8, IUTF8},
5702 };
5703 
5704 static const bitmask_transtbl oflag_tbl[] = {
5705 	{ TARGET_OPOST, TARGET_OPOST, OPOST, OPOST },
5706 	{ TARGET_OLCUC, TARGET_OLCUC, OLCUC, OLCUC },
5707 	{ TARGET_ONLCR, TARGET_ONLCR, ONLCR, ONLCR },
5708 	{ TARGET_OCRNL, TARGET_OCRNL, OCRNL, OCRNL },
5709 	{ TARGET_ONOCR, TARGET_ONOCR, ONOCR, ONOCR },
5710 	{ TARGET_ONLRET, TARGET_ONLRET, ONLRET, ONLRET },
5711 	{ TARGET_OFILL, TARGET_OFILL, OFILL, OFILL },
5712 	{ TARGET_OFDEL, TARGET_OFDEL, OFDEL, OFDEL },
5713 	{ TARGET_NLDLY, TARGET_NL0, NLDLY, NL0 },
5714 	{ TARGET_NLDLY, TARGET_NL1, NLDLY, NL1 },
5715 	{ TARGET_CRDLY, TARGET_CR0, CRDLY, CR0 },
5716 	{ TARGET_CRDLY, TARGET_CR1, CRDLY, CR1 },
5717 	{ TARGET_CRDLY, TARGET_CR2, CRDLY, CR2 },
5718 	{ TARGET_CRDLY, TARGET_CR3, CRDLY, CR3 },
5719 	{ TARGET_TABDLY, TARGET_TAB0, TABDLY, TAB0 },
5720 	{ TARGET_TABDLY, TARGET_TAB1, TABDLY, TAB1 },
5721 	{ TARGET_TABDLY, TARGET_TAB2, TABDLY, TAB2 },
5722 	{ TARGET_TABDLY, TARGET_TAB3, TABDLY, TAB3 },
5723 	{ TARGET_BSDLY, TARGET_BS0, BSDLY, BS0 },
5724 	{ TARGET_BSDLY, TARGET_BS1, BSDLY, BS1 },
5725 	{ TARGET_VTDLY, TARGET_VT0, VTDLY, VT0 },
5726 	{ TARGET_VTDLY, TARGET_VT1, VTDLY, VT1 },
5727 	{ TARGET_FFDLY, TARGET_FF0, FFDLY, FF0 },
5728 	{ TARGET_FFDLY, TARGET_FF1, FFDLY, FF1 },
5729 };
5730 
5731 static const bitmask_transtbl cflag_tbl[] = {
5732 	{ TARGET_CBAUD, TARGET_B0, CBAUD, B0 },
5733 	{ TARGET_CBAUD, TARGET_B50, CBAUD, B50 },
5734 	{ TARGET_CBAUD, TARGET_B75, CBAUD, B75 },
5735 	{ TARGET_CBAUD, TARGET_B110, CBAUD, B110 },
5736 	{ TARGET_CBAUD, TARGET_B134, CBAUD, B134 },
5737 	{ TARGET_CBAUD, TARGET_B150, CBAUD, B150 },
5738 	{ TARGET_CBAUD, TARGET_B200, CBAUD, B200 },
5739 	{ TARGET_CBAUD, TARGET_B300, CBAUD, B300 },
5740 	{ TARGET_CBAUD, TARGET_B600, CBAUD, B600 },
5741 	{ TARGET_CBAUD, TARGET_B1200, CBAUD, B1200 },
5742 	{ TARGET_CBAUD, TARGET_B1800, CBAUD, B1800 },
5743 	{ TARGET_CBAUD, TARGET_B2400, CBAUD, B2400 },
5744 	{ TARGET_CBAUD, TARGET_B4800, CBAUD, B4800 },
5745 	{ TARGET_CBAUD, TARGET_B9600, CBAUD, B9600 },
5746 	{ TARGET_CBAUD, TARGET_B19200, CBAUD, B19200 },
5747 	{ TARGET_CBAUD, TARGET_B38400, CBAUD, B38400 },
5748 	{ TARGET_CBAUD, TARGET_B57600, CBAUD, B57600 },
5749 	{ TARGET_CBAUD, TARGET_B115200, CBAUD, B115200 },
5750 	{ TARGET_CBAUD, TARGET_B230400, CBAUD, B230400 },
5751 	{ TARGET_CBAUD, TARGET_B460800, CBAUD, B460800 },
5752 	{ TARGET_CSIZE, TARGET_CS5, CSIZE, CS5 },
5753 	{ TARGET_CSIZE, TARGET_CS6, CSIZE, CS6 },
5754 	{ TARGET_CSIZE, TARGET_CS7, CSIZE, CS7 },
5755 	{ TARGET_CSIZE, TARGET_CS8, CSIZE, CS8 },
5756 	{ TARGET_CSTOPB, TARGET_CSTOPB, CSTOPB, CSTOPB },
5757 	{ TARGET_CREAD, TARGET_CREAD, CREAD, CREAD },
5758 	{ TARGET_PARENB, TARGET_PARENB, PARENB, PARENB },
5759 	{ TARGET_PARODD, TARGET_PARODD, PARODD, PARODD },
5760 	{ TARGET_HUPCL, TARGET_HUPCL, HUPCL, HUPCL },
5761 	{ TARGET_CLOCAL, TARGET_CLOCAL, CLOCAL, CLOCAL },
5762 	{ TARGET_CRTSCTS, TARGET_CRTSCTS, CRTSCTS, CRTSCTS },
5763 };
5764 
5765 static const bitmask_transtbl lflag_tbl[] = {
5766   { TARGET_ISIG, TARGET_ISIG, ISIG, ISIG },
5767   { TARGET_ICANON, TARGET_ICANON, ICANON, ICANON },
5768   { TARGET_XCASE, TARGET_XCASE, XCASE, XCASE },
5769   { TARGET_ECHO, TARGET_ECHO, ECHO, ECHO },
5770   { TARGET_ECHOE, TARGET_ECHOE, ECHOE, ECHOE },
5771   { TARGET_ECHOK, TARGET_ECHOK, ECHOK, ECHOK },
5772   { TARGET_ECHONL, TARGET_ECHONL, ECHONL, ECHONL },
5773   { TARGET_NOFLSH, TARGET_NOFLSH, NOFLSH, NOFLSH },
5774   { TARGET_TOSTOP, TARGET_TOSTOP, TOSTOP, TOSTOP },
5775   { TARGET_ECHOCTL, TARGET_ECHOCTL, ECHOCTL, ECHOCTL },
5776   { TARGET_ECHOPRT, TARGET_ECHOPRT, ECHOPRT, ECHOPRT },
5777   { TARGET_ECHOKE, TARGET_ECHOKE, ECHOKE, ECHOKE },
5778   { TARGET_FLUSHO, TARGET_FLUSHO, FLUSHO, FLUSHO },
5779   { TARGET_PENDIN, TARGET_PENDIN, PENDIN, PENDIN },
5780   { TARGET_IEXTEN, TARGET_IEXTEN, IEXTEN, IEXTEN },
5781   { TARGET_EXTPROC, TARGET_EXTPROC, EXTPROC, EXTPROC},
5782 };
5783 
target_to_host_termios(void * dst,const void * src)5784 static void target_to_host_termios (void *dst, const void *src)
5785 {
5786     struct host_termios *host = dst;
5787     const struct target_termios *target = src;
5788 
5789     host->c_iflag =
5790         target_to_host_bitmask(tswap32(target->c_iflag), iflag_tbl);
5791     host->c_oflag =
5792         target_to_host_bitmask(tswap32(target->c_oflag), oflag_tbl);
5793     host->c_cflag =
5794         target_to_host_bitmask(tswap32(target->c_cflag), cflag_tbl);
5795     host->c_lflag =
5796         target_to_host_bitmask(tswap32(target->c_lflag), lflag_tbl);
5797     host->c_line = target->c_line;
5798 
5799     memset(host->c_cc, 0, sizeof(host->c_cc));
5800     host->c_cc[VINTR] = target->c_cc[TARGET_VINTR];
5801     host->c_cc[VQUIT] = target->c_cc[TARGET_VQUIT];
5802     host->c_cc[VERASE] = target->c_cc[TARGET_VERASE];
5803     host->c_cc[VKILL] = target->c_cc[TARGET_VKILL];
5804     host->c_cc[VEOF] = target->c_cc[TARGET_VEOF];
5805     host->c_cc[VTIME] = target->c_cc[TARGET_VTIME];
5806     host->c_cc[VMIN] = target->c_cc[TARGET_VMIN];
5807     host->c_cc[VSWTC] = target->c_cc[TARGET_VSWTC];
5808     host->c_cc[VSTART] = target->c_cc[TARGET_VSTART];
5809     host->c_cc[VSTOP] = target->c_cc[TARGET_VSTOP];
5810     host->c_cc[VSUSP] = target->c_cc[TARGET_VSUSP];
5811     host->c_cc[VEOL] = target->c_cc[TARGET_VEOL];
5812     host->c_cc[VREPRINT] = target->c_cc[TARGET_VREPRINT];
5813     host->c_cc[VDISCARD] = target->c_cc[TARGET_VDISCARD];
5814     host->c_cc[VWERASE] = target->c_cc[TARGET_VWERASE];
5815     host->c_cc[VLNEXT] = target->c_cc[TARGET_VLNEXT];
5816     host->c_cc[VEOL2] = target->c_cc[TARGET_VEOL2];
5817 }
5818 
host_to_target_termios(void * dst,const void * src)5819 static void host_to_target_termios (void *dst, const void *src)
5820 {
5821     struct target_termios *target = dst;
5822     const struct host_termios *host = src;
5823 
5824     target->c_iflag =
5825         tswap32(host_to_target_bitmask(host->c_iflag, iflag_tbl));
5826     target->c_oflag =
5827         tswap32(host_to_target_bitmask(host->c_oflag, oflag_tbl));
5828     target->c_cflag =
5829         tswap32(host_to_target_bitmask(host->c_cflag, cflag_tbl));
5830     target->c_lflag =
5831         tswap32(host_to_target_bitmask(host->c_lflag, lflag_tbl));
5832     target->c_line = host->c_line;
5833 
5834     memset(target->c_cc, 0, sizeof(target->c_cc));
5835     target->c_cc[TARGET_VINTR] = host->c_cc[VINTR];
5836     target->c_cc[TARGET_VQUIT] = host->c_cc[VQUIT];
5837     target->c_cc[TARGET_VERASE] = host->c_cc[VERASE];
5838     target->c_cc[TARGET_VKILL] = host->c_cc[VKILL];
5839     target->c_cc[TARGET_VEOF] = host->c_cc[VEOF];
5840     target->c_cc[TARGET_VTIME] = host->c_cc[VTIME];
5841     target->c_cc[TARGET_VMIN] = host->c_cc[VMIN];
5842     target->c_cc[TARGET_VSWTC] = host->c_cc[VSWTC];
5843     target->c_cc[TARGET_VSTART] = host->c_cc[VSTART];
5844     target->c_cc[TARGET_VSTOP] = host->c_cc[VSTOP];
5845     target->c_cc[TARGET_VSUSP] = host->c_cc[VSUSP];
5846     target->c_cc[TARGET_VEOL] = host->c_cc[VEOL];
5847     target->c_cc[TARGET_VREPRINT] = host->c_cc[VREPRINT];
5848     target->c_cc[TARGET_VDISCARD] = host->c_cc[VDISCARD];
5849     target->c_cc[TARGET_VWERASE] = host->c_cc[VWERASE];
5850     target->c_cc[TARGET_VLNEXT] = host->c_cc[VLNEXT];
5851     target->c_cc[TARGET_VEOL2] = host->c_cc[VEOL2];
5852 }
5853 
5854 static const StructEntry struct_termios_def = {
5855     .convert = { host_to_target_termios, target_to_host_termios },
5856     .size = { sizeof(struct target_termios), sizeof(struct host_termios) },
5857     .align = { __alignof__(struct target_termios), __alignof__(struct host_termios) },
5858     .print = print_termios,
5859 };
5860 
5861 /* If the host does not provide these bits, they may be safely discarded. */
5862 #ifndef MAP_SYNC
5863 #define MAP_SYNC 0
5864 #endif
5865 #ifndef MAP_UNINITIALIZED
5866 #define MAP_UNINITIALIZED 0
5867 #endif
5868 
5869 static const bitmask_transtbl mmap_flags_tbl[] = {
5870     { TARGET_MAP_FIXED, TARGET_MAP_FIXED, MAP_FIXED, MAP_FIXED },
5871     { TARGET_MAP_ANONYMOUS, TARGET_MAP_ANONYMOUS,
5872       MAP_ANONYMOUS, MAP_ANONYMOUS },
5873     { TARGET_MAP_GROWSDOWN, TARGET_MAP_GROWSDOWN,
5874       MAP_GROWSDOWN, MAP_GROWSDOWN },
5875     { TARGET_MAP_DENYWRITE, TARGET_MAP_DENYWRITE,
5876       MAP_DENYWRITE, MAP_DENYWRITE },
5877     { TARGET_MAP_EXECUTABLE, TARGET_MAP_EXECUTABLE,
5878       MAP_EXECUTABLE, MAP_EXECUTABLE },
5879     { TARGET_MAP_LOCKED, TARGET_MAP_LOCKED, MAP_LOCKED, MAP_LOCKED },
5880     { TARGET_MAP_NORESERVE, TARGET_MAP_NORESERVE,
5881       MAP_NORESERVE, MAP_NORESERVE },
5882     { TARGET_MAP_HUGETLB, TARGET_MAP_HUGETLB, MAP_HUGETLB, MAP_HUGETLB },
5883     /* MAP_STACK had been ignored by the kernel for quite some time.
5884        Recognize it for the target insofar as we do not want to pass
5885        it through to the host.  */
5886     { TARGET_MAP_STACK, TARGET_MAP_STACK, 0, 0 },
5887     { TARGET_MAP_NONBLOCK, TARGET_MAP_NONBLOCK, MAP_NONBLOCK, MAP_NONBLOCK },
5888     { TARGET_MAP_POPULATE, TARGET_MAP_POPULATE, MAP_POPULATE, MAP_POPULATE },
5889     { TARGET_MAP_FIXED_NOREPLACE, TARGET_MAP_FIXED_NOREPLACE,
5890       MAP_FIXED_NOREPLACE, MAP_FIXED_NOREPLACE },
5891     { TARGET_MAP_UNINITIALIZED, TARGET_MAP_UNINITIALIZED,
5892       MAP_UNINITIALIZED, MAP_UNINITIALIZED },
5893 };
5894 
5895 /*
5896  * Arrange for legacy / undefined architecture specific flags to be
5897  * ignored by mmap handling code.
5898  */
5899 #ifndef TARGET_MAP_32BIT
5900 #define TARGET_MAP_32BIT 0
5901 #endif
5902 #ifndef TARGET_MAP_HUGE_2MB
5903 #define TARGET_MAP_HUGE_2MB 0
5904 #endif
5905 #ifndef TARGET_MAP_HUGE_1GB
5906 #define TARGET_MAP_HUGE_1GB 0
5907 #endif
5908 
do_mmap(abi_ulong addr,abi_ulong len,int prot,int target_flags,int fd,off_t offset)5909 static abi_long do_mmap(abi_ulong addr, abi_ulong len, int prot,
5910                         int target_flags, int fd, off_t offset)
5911 {
5912     /*
5913      * The historical set of flags that all mmap types implicitly support.
5914      */
5915     enum {
5916         TARGET_LEGACY_MAP_MASK = TARGET_MAP_SHARED
5917                                | TARGET_MAP_PRIVATE
5918                                | TARGET_MAP_FIXED
5919                                | TARGET_MAP_ANONYMOUS
5920                                | TARGET_MAP_DENYWRITE
5921                                | TARGET_MAP_EXECUTABLE
5922                                | TARGET_MAP_UNINITIALIZED
5923                                | TARGET_MAP_GROWSDOWN
5924                                | TARGET_MAP_LOCKED
5925                                | TARGET_MAP_NORESERVE
5926                                | TARGET_MAP_POPULATE
5927                                | TARGET_MAP_NONBLOCK
5928                                | TARGET_MAP_STACK
5929                                | TARGET_MAP_HUGETLB
5930                                | TARGET_MAP_32BIT
5931                                | TARGET_MAP_HUGE_2MB
5932                                | TARGET_MAP_HUGE_1GB
5933     };
5934     int host_flags;
5935 
5936     switch (target_flags & TARGET_MAP_TYPE) {
5937     case TARGET_MAP_PRIVATE:
5938         host_flags = MAP_PRIVATE;
5939         break;
5940     case TARGET_MAP_SHARED:
5941         host_flags = MAP_SHARED;
5942         break;
5943     case TARGET_MAP_SHARED_VALIDATE:
5944         /*
5945          * MAP_SYNC is only supported for MAP_SHARED_VALIDATE, and is
5946          * therefore omitted from mmap_flags_tbl and TARGET_LEGACY_MAP_MASK.
5947          */
5948         if (target_flags & ~(TARGET_LEGACY_MAP_MASK | TARGET_MAP_SYNC)) {
5949             return -TARGET_EOPNOTSUPP;
5950         }
5951         host_flags = MAP_SHARED_VALIDATE;
5952         if (target_flags & TARGET_MAP_SYNC) {
5953             host_flags |= MAP_SYNC;
5954         }
5955         break;
5956     default:
5957         return -TARGET_EINVAL;
5958     }
5959     host_flags |= target_to_host_bitmask(target_flags, mmap_flags_tbl);
5960 
5961     return get_errno(target_mmap(addr, len, prot, host_flags, fd, offset));
5962 }
5963 
5964 /*
5965  * NOTE: TARGET_ABI32 is defined for TARGET_I386 (but not for TARGET_X86_64)
5966  *       TARGET_I386 is defined if TARGET_X86_64 is defined
5967  */
5968 #if defined(TARGET_I386)
5969 
5970 /* NOTE: there is really one LDT for all the threads */
5971 static uint8_t *ldt_table;
5972 
read_ldt(abi_ulong ptr,unsigned long bytecount)5973 static abi_long read_ldt(abi_ulong ptr, unsigned long bytecount)
5974 {
5975     int size;
5976     void *p;
5977 
5978     if (!ldt_table)
5979         return 0;
5980     size = TARGET_LDT_ENTRIES * TARGET_LDT_ENTRY_SIZE;
5981     if (size > bytecount)
5982         size = bytecount;
5983     p = lock_user(VERIFY_WRITE, ptr, size, 0);
5984     if (!p)
5985         return -TARGET_EFAULT;
5986     /* ??? Should this by byteswapped?  */
5987     memcpy(p, ldt_table, size);
5988     unlock_user(p, ptr, size);
5989     return size;
5990 }
5991 
5992 /* XXX: add locking support */
write_ldt(CPUX86State * env,abi_ulong ptr,unsigned long bytecount,int oldmode)5993 static abi_long write_ldt(CPUX86State *env,
5994                           abi_ulong ptr, unsigned long bytecount, int oldmode)
5995 {
5996     struct target_modify_ldt_ldt_s ldt_info;
5997     struct target_modify_ldt_ldt_s *target_ldt_info;
5998     int seg_32bit, contents, read_exec_only, limit_in_pages;
5999     int seg_not_present, useable, lm;
6000     uint32_t *lp, entry_1, entry_2;
6001 
6002     if (bytecount != sizeof(ldt_info))
6003         return -TARGET_EINVAL;
6004     if (!lock_user_struct(VERIFY_READ, target_ldt_info, ptr, 1))
6005         return -TARGET_EFAULT;
6006     ldt_info.entry_number = tswap32(target_ldt_info->entry_number);
6007     ldt_info.base_addr = tswapal(target_ldt_info->base_addr);
6008     ldt_info.limit = tswap32(target_ldt_info->limit);
6009     ldt_info.flags = tswap32(target_ldt_info->flags);
6010     unlock_user_struct(target_ldt_info, ptr, 0);
6011 
6012     if (ldt_info.entry_number >= TARGET_LDT_ENTRIES)
6013         return -TARGET_EINVAL;
6014     seg_32bit = ldt_info.flags & 1;
6015     contents = (ldt_info.flags >> 1) & 3;
6016     read_exec_only = (ldt_info.flags >> 3) & 1;
6017     limit_in_pages = (ldt_info.flags >> 4) & 1;
6018     seg_not_present = (ldt_info.flags >> 5) & 1;
6019     useable = (ldt_info.flags >> 6) & 1;
6020 #ifdef TARGET_ABI32
6021     lm = 0;
6022 #else
6023     lm = (ldt_info.flags >> 7) & 1;
6024 #endif
6025     if (contents == 3) {
6026         if (oldmode)
6027             return -TARGET_EINVAL;
6028         if (seg_not_present == 0)
6029             return -TARGET_EINVAL;
6030     }
6031     /* allocate the LDT */
6032     if (!ldt_table) {
6033         env->ldt.base = target_mmap(0,
6034                                     TARGET_LDT_ENTRIES * TARGET_LDT_ENTRY_SIZE,
6035                                     PROT_READ|PROT_WRITE,
6036                                     MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
6037         if (env->ldt.base == -1)
6038             return -TARGET_ENOMEM;
6039         memset(g2h_untagged(env->ldt.base), 0,
6040                TARGET_LDT_ENTRIES * TARGET_LDT_ENTRY_SIZE);
6041         env->ldt.limit = 0xffff;
6042         ldt_table = g2h_untagged(env->ldt.base);
6043     }
6044 
6045     /* NOTE: same code as Linux kernel */
6046     /* Allow LDTs to be cleared by the user. */
6047     if (ldt_info.base_addr == 0 && ldt_info.limit == 0) {
6048         if (oldmode ||
6049             (contents == 0		&&
6050              read_exec_only == 1	&&
6051              seg_32bit == 0		&&
6052              limit_in_pages == 0	&&
6053              seg_not_present == 1	&&
6054              useable == 0 )) {
6055             entry_1 = 0;
6056             entry_2 = 0;
6057             goto install;
6058         }
6059     }
6060 
6061     entry_1 = ((ldt_info.base_addr & 0x0000ffff) << 16) |
6062         (ldt_info.limit & 0x0ffff);
6063     entry_2 = (ldt_info.base_addr & 0xff000000) |
6064         ((ldt_info.base_addr & 0x00ff0000) >> 16) |
6065         (ldt_info.limit & 0xf0000) |
6066         ((read_exec_only ^ 1) << 9) |
6067         (contents << 10) |
6068         ((seg_not_present ^ 1) << 15) |
6069         (seg_32bit << 22) |
6070         (limit_in_pages << 23) |
6071         (lm << 21) |
6072         0x7000;
6073     if (!oldmode)
6074         entry_2 |= (useable << 20);
6075 
6076     /* Install the new entry ...  */
6077 install:
6078     lp = (uint32_t *)(ldt_table + (ldt_info.entry_number << 3));
6079     lp[0] = tswap32(entry_1);
6080     lp[1] = tswap32(entry_2);
6081     return 0;
6082 }
6083 
6084 /* specific and weird i386 syscalls */
do_modify_ldt(CPUX86State * env,int func,abi_ulong ptr,unsigned long bytecount)6085 static abi_long do_modify_ldt(CPUX86State *env, int func, abi_ulong ptr,
6086                               unsigned long bytecount)
6087 {
6088     abi_long ret;
6089 
6090     switch (func) {
6091     case 0:
6092         ret = read_ldt(ptr, bytecount);
6093         break;
6094     case 1:
6095         ret = write_ldt(env, ptr, bytecount, 1);
6096         break;
6097     case 0x11:
6098         ret = write_ldt(env, ptr, bytecount, 0);
6099         break;
6100     default:
6101         ret = -TARGET_ENOSYS;
6102         break;
6103     }
6104     return ret;
6105 }
6106 
6107 #if defined(TARGET_ABI32)
do_set_thread_area(CPUX86State * env,abi_ulong ptr)6108 abi_long do_set_thread_area(CPUX86State *env, abi_ulong ptr)
6109 {
6110     uint64_t *gdt_table = g2h_untagged(env->gdt.base);
6111     struct target_modify_ldt_ldt_s ldt_info;
6112     struct target_modify_ldt_ldt_s *target_ldt_info;
6113     int seg_32bit, contents, read_exec_only, limit_in_pages;
6114     int seg_not_present, useable, lm;
6115     uint32_t *lp, entry_1, entry_2;
6116     int i;
6117 
6118     lock_user_struct(VERIFY_WRITE, target_ldt_info, ptr, 1);
6119     if (!target_ldt_info)
6120         return -TARGET_EFAULT;
6121     ldt_info.entry_number = tswap32(target_ldt_info->entry_number);
6122     ldt_info.base_addr = tswapal(target_ldt_info->base_addr);
6123     ldt_info.limit = tswap32(target_ldt_info->limit);
6124     ldt_info.flags = tswap32(target_ldt_info->flags);
6125     if (ldt_info.entry_number == -1) {
6126         for (i=TARGET_GDT_ENTRY_TLS_MIN; i<=TARGET_GDT_ENTRY_TLS_MAX; i++) {
6127             if (gdt_table[i] == 0) {
6128                 ldt_info.entry_number = i;
6129                 target_ldt_info->entry_number = tswap32(i);
6130                 break;
6131             }
6132         }
6133     }
6134     unlock_user_struct(target_ldt_info, ptr, 1);
6135 
6136     if (ldt_info.entry_number < TARGET_GDT_ENTRY_TLS_MIN ||
6137         ldt_info.entry_number > TARGET_GDT_ENTRY_TLS_MAX)
6138            return -TARGET_EINVAL;
6139     seg_32bit = ldt_info.flags & 1;
6140     contents = (ldt_info.flags >> 1) & 3;
6141     read_exec_only = (ldt_info.flags >> 3) & 1;
6142     limit_in_pages = (ldt_info.flags >> 4) & 1;
6143     seg_not_present = (ldt_info.flags >> 5) & 1;
6144     useable = (ldt_info.flags >> 6) & 1;
6145 #ifdef TARGET_ABI32
6146     lm = 0;
6147 #else
6148     lm = (ldt_info.flags >> 7) & 1;
6149 #endif
6150 
6151     if (contents == 3) {
6152         if (seg_not_present == 0)
6153             return -TARGET_EINVAL;
6154     }
6155 
6156     /* NOTE: same code as Linux kernel */
6157     /* Allow LDTs to be cleared by the user. */
6158     if (ldt_info.base_addr == 0 && ldt_info.limit == 0) {
6159         if ((contents == 0             &&
6160              read_exec_only == 1       &&
6161              seg_32bit == 0            &&
6162              limit_in_pages == 0       &&
6163              seg_not_present == 1      &&
6164              useable == 0 )) {
6165             entry_1 = 0;
6166             entry_2 = 0;
6167             goto install;
6168         }
6169     }
6170 
6171     entry_1 = ((ldt_info.base_addr & 0x0000ffff) << 16) |
6172         (ldt_info.limit & 0x0ffff);
6173     entry_2 = (ldt_info.base_addr & 0xff000000) |
6174         ((ldt_info.base_addr & 0x00ff0000) >> 16) |
6175         (ldt_info.limit & 0xf0000) |
6176         ((read_exec_only ^ 1) << 9) |
6177         (contents << 10) |
6178         ((seg_not_present ^ 1) << 15) |
6179         (seg_32bit << 22) |
6180         (limit_in_pages << 23) |
6181         (useable << 20) |
6182         (lm << 21) |
6183         0x7000;
6184 
6185     /* Install the new entry ...  */
6186 install:
6187     lp = (uint32_t *)(gdt_table + ldt_info.entry_number);
6188     lp[0] = tswap32(entry_1);
6189     lp[1] = tswap32(entry_2);
6190     return 0;
6191 }
6192 
do_get_thread_area(CPUX86State * env,abi_ulong ptr)6193 static abi_long do_get_thread_area(CPUX86State *env, abi_ulong ptr)
6194 {
6195     struct target_modify_ldt_ldt_s *target_ldt_info;
6196     uint64_t *gdt_table = g2h_untagged(env->gdt.base);
6197     uint32_t base_addr, limit, flags;
6198     int seg_32bit, contents, read_exec_only, limit_in_pages, idx;
6199     int seg_not_present, useable, lm;
6200     uint32_t *lp, entry_1, entry_2;
6201 
6202     lock_user_struct(VERIFY_WRITE, target_ldt_info, ptr, 1);
6203     if (!target_ldt_info)
6204         return -TARGET_EFAULT;
6205     idx = tswap32(target_ldt_info->entry_number);
6206     if (idx < TARGET_GDT_ENTRY_TLS_MIN ||
6207         idx > TARGET_GDT_ENTRY_TLS_MAX) {
6208         unlock_user_struct(target_ldt_info, ptr, 1);
6209         return -TARGET_EINVAL;
6210     }
6211     lp = (uint32_t *)(gdt_table + idx);
6212     entry_1 = tswap32(lp[0]);
6213     entry_2 = tswap32(lp[1]);
6214 
6215     read_exec_only = ((entry_2 >> 9) & 1) ^ 1;
6216     contents = (entry_2 >> 10) & 3;
6217     seg_not_present = ((entry_2 >> 15) & 1) ^ 1;
6218     seg_32bit = (entry_2 >> 22) & 1;
6219     limit_in_pages = (entry_2 >> 23) & 1;
6220     useable = (entry_2 >> 20) & 1;
6221 #ifdef TARGET_ABI32
6222     lm = 0;
6223 #else
6224     lm = (entry_2 >> 21) & 1;
6225 #endif
6226     flags = (seg_32bit << 0) | (contents << 1) |
6227         (read_exec_only << 3) | (limit_in_pages << 4) |
6228         (seg_not_present << 5) | (useable << 6) | (lm << 7);
6229     limit = (entry_1 & 0xffff) | (entry_2  & 0xf0000);
6230     base_addr = (entry_1 >> 16) |
6231         (entry_2 & 0xff000000) |
6232         ((entry_2 & 0xff) << 16);
6233     target_ldt_info->base_addr = tswapal(base_addr);
6234     target_ldt_info->limit = tswap32(limit);
6235     target_ldt_info->flags = tswap32(flags);
6236     unlock_user_struct(target_ldt_info, ptr, 1);
6237     return 0;
6238 }
6239 
do_arch_prctl(CPUX86State * env,int code,abi_ulong addr)6240 abi_long do_arch_prctl(CPUX86State *env, int code, abi_ulong addr)
6241 {
6242     return -TARGET_ENOSYS;
6243 }
6244 #else
do_arch_prctl(CPUX86State * env,int code,abi_ulong addr)6245 abi_long do_arch_prctl(CPUX86State *env, int code, abi_ulong addr)
6246 {
6247     abi_long ret = 0;
6248     abi_ulong val;
6249     int idx;
6250 
6251     switch(code) {
6252     case TARGET_ARCH_SET_GS:
6253     case TARGET_ARCH_SET_FS:
6254         if (code == TARGET_ARCH_SET_GS)
6255             idx = R_GS;
6256         else
6257             idx = R_FS;
6258         cpu_x86_load_seg(env, idx, 0);
6259         env->segs[idx].base = addr;
6260         break;
6261     case TARGET_ARCH_GET_GS:
6262     case TARGET_ARCH_GET_FS:
6263         if (code == TARGET_ARCH_GET_GS)
6264             idx = R_GS;
6265         else
6266             idx = R_FS;
6267         val = env->segs[idx].base;
6268         if (put_user(val, addr, abi_ulong))
6269             ret = -TARGET_EFAULT;
6270         break;
6271     default:
6272         ret = -TARGET_EINVAL;
6273         break;
6274     }
6275     return ret;
6276 }
6277 #endif /* defined(TARGET_ABI32 */
6278 #endif /* defined(TARGET_I386) */
6279 
6280 /*
6281  * These constants are generic.  Supply any that are missing from the host.
6282  */
6283 #ifndef PR_SET_NAME
6284 # define PR_SET_NAME    15
6285 # define PR_GET_NAME    16
6286 #endif
6287 #ifndef PR_SET_FP_MODE
6288 # define PR_SET_FP_MODE 45
6289 # define PR_GET_FP_MODE 46
6290 # define PR_FP_MODE_FR   (1 << 0)
6291 # define PR_FP_MODE_FRE  (1 << 1)
6292 #endif
6293 #ifndef PR_SVE_SET_VL
6294 # define PR_SVE_SET_VL  50
6295 # define PR_SVE_GET_VL  51
6296 # define PR_SVE_VL_LEN_MASK  0xffff
6297 # define PR_SVE_VL_INHERIT   (1 << 17)
6298 #endif
6299 #ifndef PR_PAC_RESET_KEYS
6300 # define PR_PAC_RESET_KEYS  54
6301 # define PR_PAC_APIAKEY   (1 << 0)
6302 # define PR_PAC_APIBKEY   (1 << 1)
6303 # define PR_PAC_APDAKEY   (1 << 2)
6304 # define PR_PAC_APDBKEY   (1 << 3)
6305 # define PR_PAC_APGAKEY   (1 << 4)
6306 #endif
6307 #ifndef PR_SET_TAGGED_ADDR_CTRL
6308 # define PR_SET_TAGGED_ADDR_CTRL 55
6309 # define PR_GET_TAGGED_ADDR_CTRL 56
6310 # define PR_TAGGED_ADDR_ENABLE  (1UL << 0)
6311 #endif
6312 #ifndef PR_SET_IO_FLUSHER
6313 # define PR_SET_IO_FLUSHER 57
6314 # define PR_GET_IO_FLUSHER 58
6315 #endif
6316 #ifndef PR_SET_SYSCALL_USER_DISPATCH
6317 # define PR_SET_SYSCALL_USER_DISPATCH 59
6318 #endif
6319 #ifndef PR_SME_SET_VL
6320 # define PR_SME_SET_VL  63
6321 # define PR_SME_GET_VL  64
6322 # define PR_SME_VL_LEN_MASK  0xffff
6323 # define PR_SME_VL_INHERIT   (1 << 17)
6324 #endif
6325 
6326 #include "target_prctl.h"
6327 
do_prctl_inval0(CPUArchState * env)6328 static abi_long do_prctl_inval0(CPUArchState *env)
6329 {
6330     return -TARGET_EINVAL;
6331 }
6332 
do_prctl_inval1(CPUArchState * env,abi_long arg2)6333 static abi_long do_prctl_inval1(CPUArchState *env, abi_long arg2)
6334 {
6335     return -TARGET_EINVAL;
6336 }
6337 
6338 #ifndef do_prctl_get_fp_mode
6339 #define do_prctl_get_fp_mode do_prctl_inval0
6340 #endif
6341 #ifndef do_prctl_set_fp_mode
6342 #define do_prctl_set_fp_mode do_prctl_inval1
6343 #endif
6344 #ifndef do_prctl_sve_get_vl
6345 #define do_prctl_sve_get_vl do_prctl_inval0
6346 #endif
6347 #ifndef do_prctl_sve_set_vl
6348 #define do_prctl_sve_set_vl do_prctl_inval1
6349 #endif
6350 #ifndef do_prctl_reset_keys
6351 #define do_prctl_reset_keys do_prctl_inval1
6352 #endif
6353 #ifndef do_prctl_set_tagged_addr_ctrl
6354 #define do_prctl_set_tagged_addr_ctrl do_prctl_inval1
6355 #endif
6356 #ifndef do_prctl_get_tagged_addr_ctrl
6357 #define do_prctl_get_tagged_addr_ctrl do_prctl_inval0
6358 #endif
6359 #ifndef do_prctl_get_unalign
6360 #define do_prctl_get_unalign do_prctl_inval1
6361 #endif
6362 #ifndef do_prctl_set_unalign
6363 #define do_prctl_set_unalign do_prctl_inval1
6364 #endif
6365 #ifndef do_prctl_sme_get_vl
6366 #define do_prctl_sme_get_vl do_prctl_inval0
6367 #endif
6368 #ifndef do_prctl_sme_set_vl
6369 #define do_prctl_sme_set_vl do_prctl_inval1
6370 #endif
6371 
do_prctl(CPUArchState * env,abi_long option,abi_long arg2,abi_long arg3,abi_long arg4,abi_long arg5)6372 static abi_long do_prctl(CPUArchState *env, abi_long option, abi_long arg2,
6373                          abi_long arg3, abi_long arg4, abi_long arg5)
6374 {
6375     abi_long ret;
6376 
6377     switch (option) {
6378     case PR_GET_PDEATHSIG:
6379         {
6380             int deathsig;
6381             ret = get_errno(prctl(PR_GET_PDEATHSIG, &deathsig,
6382                                   arg3, arg4, arg5));
6383             if (!is_error(ret) &&
6384                 put_user_s32(host_to_target_signal(deathsig), arg2)) {
6385                 return -TARGET_EFAULT;
6386             }
6387             return ret;
6388         }
6389     case PR_SET_PDEATHSIG:
6390         return get_errno(prctl(PR_SET_PDEATHSIG, target_to_host_signal(arg2),
6391                                arg3, arg4, arg5));
6392     case PR_GET_NAME:
6393         {
6394             void *name = lock_user(VERIFY_WRITE, arg2, 16, 1);
6395             if (!name) {
6396                 return -TARGET_EFAULT;
6397             }
6398             ret = get_errno(prctl(PR_GET_NAME, (uintptr_t)name,
6399                                   arg3, arg4, arg5));
6400             unlock_user(name, arg2, 16);
6401             return ret;
6402         }
6403     case PR_SET_NAME:
6404         {
6405             void *name = lock_user(VERIFY_READ, arg2, 16, 1);
6406             if (!name) {
6407                 return -TARGET_EFAULT;
6408             }
6409             ret = get_errno(prctl(PR_SET_NAME, (uintptr_t)name,
6410                                   arg3, arg4, arg5));
6411             unlock_user(name, arg2, 0);
6412             return ret;
6413         }
6414     case PR_GET_FP_MODE:
6415         return do_prctl_get_fp_mode(env);
6416     case PR_SET_FP_MODE:
6417         return do_prctl_set_fp_mode(env, arg2);
6418     case PR_SVE_GET_VL:
6419         return do_prctl_sve_get_vl(env);
6420     case PR_SVE_SET_VL:
6421         return do_prctl_sve_set_vl(env, arg2);
6422     case PR_SME_GET_VL:
6423         return do_prctl_sme_get_vl(env);
6424     case PR_SME_SET_VL:
6425         return do_prctl_sme_set_vl(env, arg2);
6426     case PR_PAC_RESET_KEYS:
6427         if (arg3 || arg4 || arg5) {
6428             return -TARGET_EINVAL;
6429         }
6430         return do_prctl_reset_keys(env, arg2);
6431     case PR_SET_TAGGED_ADDR_CTRL:
6432         if (arg3 || arg4 || arg5) {
6433             return -TARGET_EINVAL;
6434         }
6435         return do_prctl_set_tagged_addr_ctrl(env, arg2);
6436     case PR_GET_TAGGED_ADDR_CTRL:
6437         if (arg2 || arg3 || arg4 || arg5) {
6438             return -TARGET_EINVAL;
6439         }
6440         return do_prctl_get_tagged_addr_ctrl(env);
6441 
6442     case PR_GET_UNALIGN:
6443         return do_prctl_get_unalign(env, arg2);
6444     case PR_SET_UNALIGN:
6445         return do_prctl_set_unalign(env, arg2);
6446 
6447     case PR_CAP_AMBIENT:
6448     case PR_CAPBSET_READ:
6449     case PR_CAPBSET_DROP:
6450     case PR_GET_DUMPABLE:
6451     case PR_SET_DUMPABLE:
6452     case PR_GET_KEEPCAPS:
6453     case PR_SET_KEEPCAPS:
6454     case PR_GET_SECUREBITS:
6455     case PR_SET_SECUREBITS:
6456     case PR_GET_TIMING:
6457     case PR_SET_TIMING:
6458     case PR_GET_TIMERSLACK:
6459     case PR_SET_TIMERSLACK:
6460     case PR_MCE_KILL:
6461     case PR_MCE_KILL_GET:
6462     case PR_GET_NO_NEW_PRIVS:
6463     case PR_SET_NO_NEW_PRIVS:
6464     case PR_GET_IO_FLUSHER:
6465     case PR_SET_IO_FLUSHER:
6466     case PR_SET_CHILD_SUBREAPER:
6467     case PR_GET_SPECULATION_CTRL:
6468     case PR_SET_SPECULATION_CTRL:
6469         /* Some prctl options have no pointer arguments and we can pass on. */
6470         return get_errno(prctl(option, arg2, arg3, arg4, arg5));
6471 
6472     case PR_GET_CHILD_SUBREAPER:
6473         {
6474             int val;
6475             ret = get_errno(prctl(PR_GET_CHILD_SUBREAPER, &val,
6476                                   arg3, arg4, arg5));
6477             if (!is_error(ret) && put_user_s32(val, arg2)) {
6478                 return -TARGET_EFAULT;
6479             }
6480             return ret;
6481         }
6482 
6483     case PR_GET_TID_ADDRESS:
6484         {
6485             TaskState *ts = get_task_state(env_cpu(env));
6486             return put_user_ual(ts->child_tidptr, arg2);
6487         }
6488 
6489     case PR_GET_FPEXC:
6490     case PR_SET_FPEXC:
6491         /* Was used for SPE on PowerPC. */
6492         return -TARGET_EINVAL;
6493 
6494     case PR_GET_ENDIAN:
6495     case PR_SET_ENDIAN:
6496     case PR_GET_FPEMU:
6497     case PR_SET_FPEMU:
6498     case PR_SET_MM:
6499     case PR_GET_SECCOMP:
6500     case PR_SET_SECCOMP:
6501     case PR_SET_SYSCALL_USER_DISPATCH:
6502     case PR_GET_THP_DISABLE:
6503     case PR_SET_THP_DISABLE:
6504     case PR_GET_TSC:
6505     case PR_SET_TSC:
6506         /* Disable to prevent the target disabling stuff we need. */
6507         return -TARGET_EINVAL;
6508 
6509     default:
6510         qemu_log_mask(LOG_UNIMP, "Unsupported prctl: " TARGET_ABI_FMT_ld "\n",
6511                       option);
6512         return -TARGET_EINVAL;
6513     }
6514 }
6515 
6516 #define NEW_STACK_SIZE 0x40000
6517 
6518 
6519 static pthread_mutex_t clone_lock = PTHREAD_MUTEX_INITIALIZER;
6520 typedef struct {
6521     CPUArchState *env;
6522     pthread_mutex_t mutex;
6523     pthread_cond_t cond;
6524     pthread_t thread;
6525     uint32_t tid;
6526     abi_ulong child_tidptr;
6527     abi_ulong parent_tidptr;
6528     sigset_t sigmask;
6529 } new_thread_info;
6530 
clone_func(void * arg)6531 static void *clone_func(void *arg)
6532 {
6533     new_thread_info *info = arg;
6534     CPUArchState *env;
6535     CPUState *cpu;
6536     TaskState *ts;
6537 
6538     rcu_register_thread();
6539     tcg_register_thread();
6540     env = info->env;
6541     cpu = env_cpu(env);
6542     thread_cpu = cpu;
6543     ts = get_task_state(cpu);
6544     info->tid = sys_gettid();
6545     task_settid(ts);
6546     if (info->child_tidptr)
6547         put_user_u32(info->tid, info->child_tidptr);
6548     if (info->parent_tidptr)
6549         put_user_u32(info->tid, info->parent_tidptr);
6550     qemu_guest_random_seed_thread_part2(cpu->random_seed);
6551     /* Enable signals.  */
6552     sigprocmask(SIG_SETMASK, &info->sigmask, NULL);
6553     /* Signal to the parent that we're ready.  */
6554     pthread_mutex_lock(&info->mutex);
6555     pthread_cond_broadcast(&info->cond);
6556     pthread_mutex_unlock(&info->mutex);
6557     /* Wait until the parent has finished initializing the tls state.  */
6558     pthread_mutex_lock(&clone_lock);
6559     pthread_mutex_unlock(&clone_lock);
6560     cpu_loop(env);
6561     /* never exits */
6562     return NULL;
6563 }
6564 
6565 /* do_fork() Must return host values and target errnos (unlike most
6566    do_*() functions). */
do_fork(CPUArchState * env,unsigned int flags,abi_ulong newsp,abi_ulong parent_tidptr,target_ulong newtls,abi_ulong child_tidptr)6567 static int do_fork(CPUArchState *env, unsigned int flags, abi_ulong newsp,
6568                    abi_ulong parent_tidptr, target_ulong newtls,
6569                    abi_ulong child_tidptr)
6570 {
6571     CPUState *cpu = env_cpu(env);
6572     int ret;
6573     TaskState *ts;
6574     CPUState *new_cpu;
6575     CPUArchState *new_env;
6576     sigset_t sigmask;
6577 
6578     flags &= ~CLONE_IGNORED_FLAGS;
6579 
6580     /* Emulate vfork() with fork() */
6581     if (flags & CLONE_VFORK)
6582         flags &= ~(CLONE_VFORK | CLONE_VM);
6583 
6584     if (flags & CLONE_VM) {
6585         TaskState *parent_ts = get_task_state(cpu);
6586         new_thread_info info;
6587         pthread_attr_t attr;
6588 
6589         if (((flags & CLONE_THREAD_FLAGS) != CLONE_THREAD_FLAGS) ||
6590             (flags & CLONE_INVALID_THREAD_FLAGS)) {
6591             return -TARGET_EINVAL;
6592         }
6593 
6594         ts = g_new0(TaskState, 1);
6595         init_task_state(ts);
6596 
6597         /* Grab a mutex so that thread setup appears atomic.  */
6598         pthread_mutex_lock(&clone_lock);
6599 
6600         /*
6601          * If this is our first additional thread, we need to ensure we
6602          * generate code for parallel execution and flush old translations.
6603          * Do this now so that the copy gets CF_PARALLEL too.
6604          */
6605         if (!tcg_cflags_has(cpu, CF_PARALLEL)) {
6606             tcg_cflags_set(cpu, CF_PARALLEL);
6607             tb_flush(cpu);
6608         }
6609 
6610         /* we create a new CPU instance. */
6611         new_env = cpu_copy(env);
6612         /* Init regs that differ from the parent.  */
6613         cpu_clone_regs_child(new_env, newsp, flags);
6614         cpu_clone_regs_parent(env, flags);
6615         new_cpu = env_cpu(new_env);
6616         new_cpu->opaque = ts;
6617         ts->bprm = parent_ts->bprm;
6618         ts->info = parent_ts->info;
6619         ts->signal_mask = parent_ts->signal_mask;
6620 
6621         if (flags & CLONE_CHILD_CLEARTID) {
6622             ts->child_tidptr = child_tidptr;
6623         }
6624 
6625         if (flags & CLONE_SETTLS) {
6626             cpu_set_tls (new_env, newtls);
6627         }
6628 
6629         memset(&info, 0, sizeof(info));
6630         pthread_mutex_init(&info.mutex, NULL);
6631         pthread_mutex_lock(&info.mutex);
6632         pthread_cond_init(&info.cond, NULL);
6633         info.env = new_env;
6634         if (flags & CLONE_CHILD_SETTID) {
6635             info.child_tidptr = child_tidptr;
6636         }
6637         if (flags & CLONE_PARENT_SETTID) {
6638             info.parent_tidptr = parent_tidptr;
6639         }
6640 
6641         ret = pthread_attr_init(&attr);
6642         ret = pthread_attr_setstacksize(&attr, NEW_STACK_SIZE);
6643         ret = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
6644         /* It is not safe to deliver signals until the child has finished
6645            initializing, so temporarily block all signals.  */
6646         sigfillset(&sigmask);
6647         sigprocmask(SIG_BLOCK, &sigmask, &info.sigmask);
6648         cpu->random_seed = qemu_guest_random_seed_thread_part1();
6649 
6650         ret = pthread_create(&info.thread, &attr, clone_func, &info);
6651         /* TODO: Free new CPU state if thread creation failed.  */
6652 
6653         sigprocmask(SIG_SETMASK, &info.sigmask, NULL);
6654         pthread_attr_destroy(&attr);
6655         if (ret == 0) {
6656             /* Wait for the child to initialize.  */
6657             pthread_cond_wait(&info.cond, &info.mutex);
6658             ret = info.tid;
6659         } else {
6660             ret = -1;
6661         }
6662         pthread_mutex_unlock(&info.mutex);
6663         pthread_cond_destroy(&info.cond);
6664         pthread_mutex_destroy(&info.mutex);
6665         pthread_mutex_unlock(&clone_lock);
6666     } else {
6667         /* if no CLONE_VM, we consider it is a fork */
6668         if (flags & CLONE_INVALID_FORK_FLAGS) {
6669             return -TARGET_EINVAL;
6670         }
6671 
6672         /* We can't support custom termination signals */
6673         if ((flags & CSIGNAL) != TARGET_SIGCHLD) {
6674             return -TARGET_EINVAL;
6675         }
6676 
6677 #if !defined(__NR_pidfd_open) || !defined(TARGET_NR_pidfd_open)
6678         if (flags & CLONE_PIDFD) {
6679             return -TARGET_EINVAL;
6680         }
6681 #endif
6682 
6683         /* Can not allow CLONE_PIDFD with CLONE_PARENT_SETTID */
6684         if ((flags & CLONE_PIDFD) && (flags & CLONE_PARENT_SETTID)) {
6685             return -TARGET_EINVAL;
6686         }
6687 
6688         if (block_signals()) {
6689             return -QEMU_ERESTARTSYS;
6690         }
6691 
6692         fork_start();
6693         ret = fork();
6694         if (ret == 0) {
6695             /* Child Process.  */
6696             cpu_clone_regs_child(env, newsp, flags);
6697             fork_end(ret);
6698             /* There is a race condition here.  The parent process could
6699                theoretically read the TID in the child process before the child
6700                tid is set.  This would require using either ptrace
6701                (not implemented) or having *_tidptr to point at a shared memory
6702                mapping.  We can't repeat the spinlock hack used above because
6703                the child process gets its own copy of the lock.  */
6704             if (flags & CLONE_CHILD_SETTID)
6705                 put_user_u32(sys_gettid(), child_tidptr);
6706             if (flags & CLONE_PARENT_SETTID)
6707                 put_user_u32(sys_gettid(), parent_tidptr);
6708             ts = get_task_state(cpu);
6709             if (flags & CLONE_SETTLS)
6710                 cpu_set_tls (env, newtls);
6711             if (flags & CLONE_CHILD_CLEARTID)
6712                 ts->child_tidptr = child_tidptr;
6713         } else {
6714             cpu_clone_regs_parent(env, flags);
6715             if (flags & CLONE_PIDFD) {
6716                 int pid_fd = 0;
6717 #if defined(__NR_pidfd_open) && defined(TARGET_NR_pidfd_open)
6718                 int pid_child = ret;
6719                 pid_fd = pidfd_open(pid_child, 0);
6720                 if (pid_fd >= 0) {
6721                         fcntl(pid_fd, F_SETFD, fcntl(pid_fd, F_GETFL)
6722                                                | FD_CLOEXEC);
6723                 } else {
6724                         pid_fd = 0;
6725                 }
6726 #endif
6727                 put_user_u32(pid_fd, parent_tidptr);
6728             }
6729             fork_end(ret);
6730         }
6731         g_assert(!cpu_in_exclusive_context(cpu));
6732     }
6733     return ret;
6734 }
6735 
6736 /* warning : doesn't handle linux specific flags... */
target_to_host_fcntl_cmd(int cmd)6737 static int target_to_host_fcntl_cmd(int cmd)
6738 {
6739     int ret;
6740 
6741     switch(cmd) {
6742     case TARGET_F_DUPFD:
6743     case TARGET_F_GETFD:
6744     case TARGET_F_SETFD:
6745     case TARGET_F_GETFL:
6746     case TARGET_F_SETFL:
6747     case TARGET_F_OFD_GETLK:
6748     case TARGET_F_OFD_SETLK:
6749     case TARGET_F_OFD_SETLKW:
6750         ret = cmd;
6751         break;
6752     case TARGET_F_GETLK:
6753         ret = F_GETLK;
6754         break;
6755     case TARGET_F_SETLK:
6756         ret = F_SETLK;
6757         break;
6758     case TARGET_F_SETLKW:
6759         ret = F_SETLKW;
6760         break;
6761     case TARGET_F_GETOWN:
6762         ret = F_GETOWN;
6763         break;
6764     case TARGET_F_SETOWN:
6765         ret = F_SETOWN;
6766         break;
6767     case TARGET_F_GETSIG:
6768         ret = F_GETSIG;
6769         break;
6770     case TARGET_F_SETSIG:
6771         ret = F_SETSIG;
6772         break;
6773 #if TARGET_ABI_BITS == 32
6774     case TARGET_F_GETLK64:
6775         ret = F_GETLK;
6776         break;
6777     case TARGET_F_SETLK64:
6778         ret = F_SETLK;
6779         break;
6780     case TARGET_F_SETLKW64:
6781         ret = F_SETLKW;
6782         break;
6783 #endif
6784     case TARGET_F_SETLEASE:
6785         ret = F_SETLEASE;
6786         break;
6787     case TARGET_F_GETLEASE:
6788         ret = F_GETLEASE;
6789         break;
6790 #ifdef F_DUPFD_CLOEXEC
6791     case TARGET_F_DUPFD_CLOEXEC:
6792         ret = F_DUPFD_CLOEXEC;
6793         break;
6794 #endif
6795     case TARGET_F_NOTIFY:
6796         ret = F_NOTIFY;
6797         break;
6798 #ifdef F_GETOWN_EX
6799     case TARGET_F_GETOWN_EX:
6800         ret = F_GETOWN_EX;
6801         break;
6802 #endif
6803 #ifdef F_SETOWN_EX
6804     case TARGET_F_SETOWN_EX:
6805         ret = F_SETOWN_EX;
6806         break;
6807 #endif
6808 #ifdef F_SETPIPE_SZ
6809     case TARGET_F_SETPIPE_SZ:
6810         ret = F_SETPIPE_SZ;
6811         break;
6812     case TARGET_F_GETPIPE_SZ:
6813         ret = F_GETPIPE_SZ;
6814         break;
6815 #endif
6816 #ifdef F_ADD_SEALS
6817     case TARGET_F_ADD_SEALS:
6818         ret = F_ADD_SEALS;
6819         break;
6820     case TARGET_F_GET_SEALS:
6821         ret = F_GET_SEALS;
6822         break;
6823 #endif
6824     default:
6825         ret = -TARGET_EINVAL;
6826         break;
6827     }
6828 
6829 #if defined(__powerpc64__)
6830     /* On PPC64, glibc headers has the F_*LK* defined to 12, 13 and 14 and
6831      * is not supported by kernel. The glibc fcntl call actually adjusts
6832      * them to 5, 6 and 7 before making the syscall(). Since we make the
6833      * syscall directly, adjust to what is supported by the kernel.
6834      */
6835     if (ret >= F_GETLK && ret <= F_SETLKW) {
6836         ret -= F_GETLK - 5;
6837     }
6838 #endif
6839 
6840     return ret;
6841 }
6842 
6843 #define FLOCK_TRANSTBL \
6844     switch (type) { \
6845     TRANSTBL_CONVERT(F_RDLCK); \
6846     TRANSTBL_CONVERT(F_WRLCK); \
6847     TRANSTBL_CONVERT(F_UNLCK); \
6848     }
6849 
target_to_host_flock(int type)6850 static int target_to_host_flock(int type)
6851 {
6852 #define TRANSTBL_CONVERT(a) case TARGET_##a: return a
6853     FLOCK_TRANSTBL
6854 #undef  TRANSTBL_CONVERT
6855     return -TARGET_EINVAL;
6856 }
6857 
host_to_target_flock(int type)6858 static int host_to_target_flock(int type)
6859 {
6860 #define TRANSTBL_CONVERT(a) case a: return TARGET_##a
6861     FLOCK_TRANSTBL
6862 #undef  TRANSTBL_CONVERT
6863     /* if we don't know how to convert the value coming
6864      * from the host we copy to the target field as-is
6865      */
6866     return type;
6867 }
6868 
copy_from_user_flock(struct flock * fl,abi_ulong target_flock_addr)6869 static inline abi_long copy_from_user_flock(struct flock *fl,
6870                                             abi_ulong target_flock_addr)
6871 {
6872     struct target_flock *target_fl;
6873     int l_type;
6874 
6875     if (!lock_user_struct(VERIFY_READ, target_fl, target_flock_addr, 1)) {
6876         return -TARGET_EFAULT;
6877     }
6878 
6879     __get_user(l_type, &target_fl->l_type);
6880     l_type = target_to_host_flock(l_type);
6881     if (l_type < 0) {
6882         return l_type;
6883     }
6884     fl->l_type = l_type;
6885     __get_user(fl->l_whence, &target_fl->l_whence);
6886     __get_user(fl->l_start, &target_fl->l_start);
6887     __get_user(fl->l_len, &target_fl->l_len);
6888     __get_user(fl->l_pid, &target_fl->l_pid);
6889     unlock_user_struct(target_fl, target_flock_addr, 0);
6890     return 0;
6891 }
6892 
copy_to_user_flock(abi_ulong target_flock_addr,const struct flock * fl)6893 static inline abi_long copy_to_user_flock(abi_ulong target_flock_addr,
6894                                           const struct flock *fl)
6895 {
6896     struct target_flock *target_fl;
6897     short l_type;
6898 
6899     if (!lock_user_struct(VERIFY_WRITE, target_fl, target_flock_addr, 0)) {
6900         return -TARGET_EFAULT;
6901     }
6902 
6903     l_type = host_to_target_flock(fl->l_type);
6904     __put_user(l_type, &target_fl->l_type);
6905     __put_user(fl->l_whence, &target_fl->l_whence);
6906     __put_user(fl->l_start, &target_fl->l_start);
6907     __put_user(fl->l_len, &target_fl->l_len);
6908     __put_user(fl->l_pid, &target_fl->l_pid);
6909     unlock_user_struct(target_fl, target_flock_addr, 1);
6910     return 0;
6911 }
6912 
6913 typedef abi_long from_flock64_fn(struct flock *fl, abi_ulong target_addr);
6914 typedef abi_long to_flock64_fn(abi_ulong target_addr, const struct flock *fl);
6915 
6916 #if defined(TARGET_ARM) && TARGET_ABI_BITS == 32
6917 struct target_oabi_flock64 {
6918     abi_short l_type;
6919     abi_short l_whence;
6920     abi_llong l_start;
6921     abi_llong l_len;
6922     abi_int   l_pid;
6923 } QEMU_PACKED;
6924 
copy_from_user_oabi_flock64(struct flock * fl,abi_ulong target_flock_addr)6925 static inline abi_long copy_from_user_oabi_flock64(struct flock *fl,
6926                                                    abi_ulong target_flock_addr)
6927 {
6928     struct target_oabi_flock64 *target_fl;
6929     int l_type;
6930 
6931     if (!lock_user_struct(VERIFY_READ, target_fl, target_flock_addr, 1)) {
6932         return -TARGET_EFAULT;
6933     }
6934 
6935     __get_user(l_type, &target_fl->l_type);
6936     l_type = target_to_host_flock(l_type);
6937     if (l_type < 0) {
6938         return l_type;
6939     }
6940     fl->l_type = l_type;
6941     __get_user(fl->l_whence, &target_fl->l_whence);
6942     __get_user(fl->l_start, &target_fl->l_start);
6943     __get_user(fl->l_len, &target_fl->l_len);
6944     __get_user(fl->l_pid, &target_fl->l_pid);
6945     unlock_user_struct(target_fl, target_flock_addr, 0);
6946     return 0;
6947 }
6948 
copy_to_user_oabi_flock64(abi_ulong target_flock_addr,const struct flock * fl)6949 static inline abi_long copy_to_user_oabi_flock64(abi_ulong target_flock_addr,
6950                                                  const struct flock *fl)
6951 {
6952     struct target_oabi_flock64 *target_fl;
6953     short l_type;
6954 
6955     if (!lock_user_struct(VERIFY_WRITE, target_fl, target_flock_addr, 0)) {
6956         return -TARGET_EFAULT;
6957     }
6958 
6959     l_type = host_to_target_flock(fl->l_type);
6960     __put_user(l_type, &target_fl->l_type);
6961     __put_user(fl->l_whence, &target_fl->l_whence);
6962     __put_user(fl->l_start, &target_fl->l_start);
6963     __put_user(fl->l_len, &target_fl->l_len);
6964     __put_user(fl->l_pid, &target_fl->l_pid);
6965     unlock_user_struct(target_fl, target_flock_addr, 1);
6966     return 0;
6967 }
6968 #endif
6969 
copy_from_user_flock64(struct flock * fl,abi_ulong target_flock_addr)6970 static inline abi_long copy_from_user_flock64(struct flock *fl,
6971                                               abi_ulong target_flock_addr)
6972 {
6973     struct target_flock64 *target_fl;
6974     int l_type;
6975 
6976     if (!lock_user_struct(VERIFY_READ, target_fl, target_flock_addr, 1)) {
6977         return -TARGET_EFAULT;
6978     }
6979 
6980     __get_user(l_type, &target_fl->l_type);
6981     l_type = target_to_host_flock(l_type);
6982     if (l_type < 0) {
6983         return l_type;
6984     }
6985     fl->l_type = l_type;
6986     __get_user(fl->l_whence, &target_fl->l_whence);
6987     __get_user(fl->l_start, &target_fl->l_start);
6988     __get_user(fl->l_len, &target_fl->l_len);
6989     __get_user(fl->l_pid, &target_fl->l_pid);
6990     unlock_user_struct(target_fl, target_flock_addr, 0);
6991     return 0;
6992 }
6993 
copy_to_user_flock64(abi_ulong target_flock_addr,const struct flock * fl)6994 static inline abi_long copy_to_user_flock64(abi_ulong target_flock_addr,
6995                                             const struct flock *fl)
6996 {
6997     struct target_flock64 *target_fl;
6998     short l_type;
6999 
7000     if (!lock_user_struct(VERIFY_WRITE, target_fl, target_flock_addr, 0)) {
7001         return -TARGET_EFAULT;
7002     }
7003 
7004     l_type = host_to_target_flock(fl->l_type);
7005     __put_user(l_type, &target_fl->l_type);
7006     __put_user(fl->l_whence, &target_fl->l_whence);
7007     __put_user(fl->l_start, &target_fl->l_start);
7008     __put_user(fl->l_len, &target_fl->l_len);
7009     __put_user(fl->l_pid, &target_fl->l_pid);
7010     unlock_user_struct(target_fl, target_flock_addr, 1);
7011     return 0;
7012 }
7013 
do_fcntl(int fd,int cmd,abi_ulong arg)7014 static abi_long do_fcntl(int fd, int cmd, abi_ulong arg)
7015 {
7016     struct flock fl;
7017 #ifdef F_GETOWN_EX
7018     struct f_owner_ex fox;
7019     struct target_f_owner_ex *target_fox;
7020 #endif
7021     abi_long ret;
7022     int host_cmd = target_to_host_fcntl_cmd(cmd);
7023 
7024     if (host_cmd == -TARGET_EINVAL)
7025 	    return host_cmd;
7026 
7027     switch(cmd) {
7028     case TARGET_F_GETLK:
7029         ret = copy_from_user_flock(&fl, arg);
7030         if (ret) {
7031             return ret;
7032         }
7033         ret = get_errno(safe_fcntl(fd, host_cmd, &fl));
7034         if (ret == 0) {
7035             ret = copy_to_user_flock(arg, &fl);
7036         }
7037         break;
7038 
7039     case TARGET_F_SETLK:
7040     case TARGET_F_SETLKW:
7041         ret = copy_from_user_flock(&fl, arg);
7042         if (ret) {
7043             return ret;
7044         }
7045         ret = get_errno(safe_fcntl(fd, host_cmd, &fl));
7046         break;
7047 
7048     case TARGET_F_GETLK64:
7049     case TARGET_F_OFD_GETLK:
7050         ret = copy_from_user_flock64(&fl, arg);
7051         if (ret) {
7052             return ret;
7053         }
7054         ret = get_errno(safe_fcntl(fd, host_cmd, &fl));
7055         if (ret == 0) {
7056             ret = copy_to_user_flock64(arg, &fl);
7057         }
7058         break;
7059     case TARGET_F_SETLK64:
7060     case TARGET_F_SETLKW64:
7061     case TARGET_F_OFD_SETLK:
7062     case TARGET_F_OFD_SETLKW:
7063         ret = copy_from_user_flock64(&fl, arg);
7064         if (ret) {
7065             return ret;
7066         }
7067         ret = get_errno(safe_fcntl(fd, host_cmd, &fl));
7068         break;
7069 
7070     case TARGET_F_GETFL:
7071         ret = get_errno(safe_fcntl(fd, host_cmd, arg));
7072         if (ret >= 0) {
7073             ret = host_to_target_bitmask(ret, fcntl_flags_tbl);
7074             /* tell 32-bit guests it uses largefile on 64-bit hosts: */
7075             if (O_LARGEFILE == 0 && HOST_LONG_BITS == 64) {
7076                 ret |= TARGET_O_LARGEFILE;
7077             }
7078         }
7079         break;
7080 
7081     case TARGET_F_SETFL:
7082         ret = get_errno(safe_fcntl(fd, host_cmd,
7083                                    target_to_host_bitmask(arg,
7084                                                           fcntl_flags_tbl)));
7085         break;
7086 
7087 #ifdef F_GETOWN_EX
7088     case TARGET_F_GETOWN_EX:
7089         ret = get_errno(safe_fcntl(fd, host_cmd, &fox));
7090         if (ret >= 0) {
7091             if (!lock_user_struct(VERIFY_WRITE, target_fox, arg, 0))
7092                 return -TARGET_EFAULT;
7093             target_fox->type = tswap32(fox.type);
7094             target_fox->pid = tswap32(fox.pid);
7095             unlock_user_struct(target_fox, arg, 1);
7096         }
7097         break;
7098 #endif
7099 
7100 #ifdef F_SETOWN_EX
7101     case TARGET_F_SETOWN_EX:
7102         if (!lock_user_struct(VERIFY_READ, target_fox, arg, 1))
7103             return -TARGET_EFAULT;
7104         fox.type = tswap32(target_fox->type);
7105         fox.pid = tswap32(target_fox->pid);
7106         unlock_user_struct(target_fox, arg, 0);
7107         ret = get_errno(safe_fcntl(fd, host_cmd, &fox));
7108         break;
7109 #endif
7110 
7111     case TARGET_F_SETSIG:
7112         ret = get_errno(safe_fcntl(fd, host_cmd, target_to_host_signal(arg)));
7113         break;
7114 
7115     case TARGET_F_GETSIG:
7116         ret = host_to_target_signal(get_errno(safe_fcntl(fd, host_cmd, arg)));
7117         break;
7118 
7119     case TARGET_F_SETOWN:
7120     case TARGET_F_GETOWN:
7121     case TARGET_F_SETLEASE:
7122     case TARGET_F_GETLEASE:
7123     case TARGET_F_SETPIPE_SZ:
7124     case TARGET_F_GETPIPE_SZ:
7125     case TARGET_F_ADD_SEALS:
7126     case TARGET_F_GET_SEALS:
7127         ret = get_errno(safe_fcntl(fd, host_cmd, arg));
7128         break;
7129 
7130     default:
7131         ret = get_errno(safe_fcntl(fd, cmd, arg));
7132         break;
7133     }
7134     return ret;
7135 }
7136 
7137 #ifdef USE_UID16
7138 
high2lowuid(int uid)7139 static inline int high2lowuid(int uid)
7140 {
7141     if (uid > 65535)
7142         return 65534;
7143     else
7144         return uid;
7145 }
7146 
high2lowgid(int gid)7147 static inline int high2lowgid(int gid)
7148 {
7149     if (gid > 65535)
7150         return 65534;
7151     else
7152         return gid;
7153 }
7154 
low2highuid(int uid)7155 static inline int low2highuid(int uid)
7156 {
7157     if ((int16_t)uid == -1)
7158         return -1;
7159     else
7160         return uid;
7161 }
7162 
low2highgid(int gid)7163 static inline int low2highgid(int gid)
7164 {
7165     if ((int16_t)gid == -1)
7166         return -1;
7167     else
7168         return gid;
7169 }
tswapid(int id)7170 static inline int tswapid(int id)
7171 {
7172     return tswap16(id);
7173 }
7174 
7175 #define put_user_id(x, gaddr) put_user_u16(x, gaddr)
7176 
7177 #else /* !USE_UID16 */
high2lowuid(int uid)7178 static inline int high2lowuid(int uid)
7179 {
7180     return uid;
7181 }
high2lowgid(int gid)7182 static inline int high2lowgid(int gid)
7183 {
7184     return gid;
7185 }
low2highuid(int uid)7186 static inline int low2highuid(int uid)
7187 {
7188     return uid;
7189 }
low2highgid(int gid)7190 static inline int low2highgid(int gid)
7191 {
7192     return gid;
7193 }
tswapid(int id)7194 static inline int tswapid(int id)
7195 {
7196     return tswap32(id);
7197 }
7198 
7199 #define put_user_id(x, gaddr) put_user_u32(x, gaddr)
7200 
7201 #endif /* USE_UID16 */
7202 
7203 /* We must do direct syscalls for setting UID/GID, because we want to
7204  * implement the Linux system call semantics of "change only for this thread",
7205  * not the libc/POSIX semantics of "change for all threads in process".
7206  * (See http://ewontfix.com/17/ for more details.)
7207  * We use the 32-bit version of the syscalls if present; if it is not
7208  * then either the host architecture supports 32-bit UIDs natively with
7209  * the standard syscall, or the 16-bit UID is the best we can do.
7210  */
7211 #ifdef __NR_setuid32
7212 #define __NR_sys_setuid __NR_setuid32
7213 #else
7214 #define __NR_sys_setuid __NR_setuid
7215 #endif
7216 #ifdef __NR_setgid32
7217 #define __NR_sys_setgid __NR_setgid32
7218 #else
7219 #define __NR_sys_setgid __NR_setgid
7220 #endif
7221 #ifdef __NR_setresuid32
7222 #define __NR_sys_setresuid __NR_setresuid32
7223 #else
7224 #define __NR_sys_setresuid __NR_setresuid
7225 #endif
7226 #ifdef __NR_setresgid32
7227 #define __NR_sys_setresgid __NR_setresgid32
7228 #else
7229 #define __NR_sys_setresgid __NR_setresgid
7230 #endif
7231 #ifdef __NR_setgroups32
7232 #define __NR_sys_setgroups __NR_setgroups32
7233 #else
7234 #define __NR_sys_setgroups __NR_setgroups
7235 #endif
7236 #ifdef __NR_sys_setreuid32
7237 #define __NR_sys_setreuid __NR_setreuid32
7238 #else
7239 #define __NR_sys_setreuid __NR_setreuid
7240 #endif
7241 #ifdef __NR_sys_setregid32
7242 #define __NR_sys_setregid __NR_setregid32
7243 #else
7244 #define __NR_sys_setregid __NR_setregid
7245 #endif
7246 
7247 _syscall1(int, sys_setuid, uid_t, uid)
7248 _syscall1(int, sys_setgid, gid_t, gid)
7249 _syscall3(int, sys_setresuid, uid_t, ruid, uid_t, euid, uid_t, suid)
7250 _syscall3(int, sys_setresgid, gid_t, rgid, gid_t, egid, gid_t, sgid)
7251 _syscall2(int, sys_setgroups, int, size, gid_t *, grouplist)
7252 _syscall2(int, sys_setreuid, uid_t, ruid, uid_t, euid);
7253 _syscall2(int, sys_setregid, gid_t, rgid, gid_t, egid);
7254 
syscall_init(void)7255 void syscall_init(void)
7256 {
7257     IOCTLEntry *ie;
7258     const argtype *arg_type;
7259     int size;
7260 
7261     thunk_init(STRUCT_MAX);
7262 
7263 #define STRUCT(name, ...) thunk_register_struct(STRUCT_ ## name, #name, struct_ ## name ## _def);
7264 #define STRUCT_SPECIAL(name) thunk_register_struct_direct(STRUCT_ ## name, #name, &struct_ ## name ## _def);
7265 #include "syscall_types.h"
7266 #undef STRUCT
7267 #undef STRUCT_SPECIAL
7268 
7269     /* we patch the ioctl size if necessary. We rely on the fact that
7270        no ioctl has all the bits at '1' in the size field */
7271     ie = ioctl_entries;
7272     while (ie->target_cmd != 0) {
7273         if (((ie->target_cmd >> TARGET_IOC_SIZESHIFT) & TARGET_IOC_SIZEMASK) ==
7274             TARGET_IOC_SIZEMASK) {
7275             arg_type = ie->arg_type;
7276             if (arg_type[0] != TYPE_PTR) {
7277                 fprintf(stderr, "cannot patch size for ioctl 0x%x\n",
7278                         ie->target_cmd);
7279                 exit(1);
7280             }
7281             arg_type++;
7282             size = thunk_type_size(arg_type, 0);
7283             ie->target_cmd = (ie->target_cmd &
7284                               ~(TARGET_IOC_SIZEMASK << TARGET_IOC_SIZESHIFT)) |
7285                 (size << TARGET_IOC_SIZESHIFT);
7286         }
7287 
7288         /* automatic consistency check if same arch */
7289 #if (defined(__i386__) && defined(TARGET_I386) && defined(TARGET_ABI32)) || \
7290     (defined(__x86_64__) && defined(TARGET_X86_64))
7291         if (unlikely(ie->target_cmd != ie->host_cmd)) {
7292             fprintf(stderr, "ERROR: ioctl(%s): target=0x%x host=0x%x\n",
7293                     ie->name, ie->target_cmd, ie->host_cmd);
7294         }
7295 #endif
7296         ie++;
7297     }
7298 }
7299 
7300 #ifdef TARGET_NR_truncate64
target_truncate64(CPUArchState * cpu_env,const char * arg1,abi_long arg2,abi_long arg3,abi_long arg4)7301 static inline abi_long target_truncate64(CPUArchState *cpu_env, const char *arg1,
7302                                          abi_long arg2,
7303                                          abi_long arg3,
7304                                          abi_long arg4)
7305 {
7306     if (regpairs_aligned(cpu_env, TARGET_NR_truncate64)) {
7307         arg2 = arg3;
7308         arg3 = arg4;
7309     }
7310     return get_errno(truncate(arg1, target_offset64(arg2, arg3)));
7311 }
7312 #endif
7313 
7314 #ifdef TARGET_NR_ftruncate64
target_ftruncate64(CPUArchState * cpu_env,abi_long arg1,abi_long arg2,abi_long arg3,abi_long arg4)7315 static inline abi_long target_ftruncate64(CPUArchState *cpu_env, abi_long arg1,
7316                                           abi_long arg2,
7317                                           abi_long arg3,
7318                                           abi_long arg4)
7319 {
7320     if (regpairs_aligned(cpu_env, TARGET_NR_ftruncate64)) {
7321         arg2 = arg3;
7322         arg3 = arg4;
7323     }
7324     return get_errno(ftruncate(arg1, target_offset64(arg2, arg3)));
7325 }
7326 #endif
7327 
7328 #if defined(TARGET_NR_timer_settime) || \
7329     (defined(TARGET_NR_timerfd_settime) && defined(CONFIG_TIMERFD))
target_to_host_itimerspec(struct itimerspec * host_its,abi_ulong target_addr)7330 static inline abi_long target_to_host_itimerspec(struct itimerspec *host_its,
7331                                                  abi_ulong target_addr)
7332 {
7333     if (target_to_host_timespec(&host_its->it_interval, target_addr +
7334                                 offsetof(struct target_itimerspec,
7335                                          it_interval)) ||
7336         target_to_host_timespec(&host_its->it_value, target_addr +
7337                                 offsetof(struct target_itimerspec,
7338                                          it_value))) {
7339         return -TARGET_EFAULT;
7340     }
7341 
7342     return 0;
7343 }
7344 #endif
7345 
7346 #if defined(TARGET_NR_timer_settime64) || \
7347     (defined(TARGET_NR_timerfd_settime64) && defined(CONFIG_TIMERFD))
target_to_host_itimerspec64(struct itimerspec * host_its,abi_ulong target_addr)7348 static inline abi_long target_to_host_itimerspec64(struct itimerspec *host_its,
7349                                                    abi_ulong target_addr)
7350 {
7351     if (target_to_host_timespec64(&host_its->it_interval, target_addr +
7352                                   offsetof(struct target__kernel_itimerspec,
7353                                            it_interval)) ||
7354         target_to_host_timespec64(&host_its->it_value, target_addr +
7355                                   offsetof(struct target__kernel_itimerspec,
7356                                            it_value))) {
7357         return -TARGET_EFAULT;
7358     }
7359 
7360     return 0;
7361 }
7362 #endif
7363 
7364 #if ((defined(TARGET_NR_timerfd_gettime) || \
7365       defined(TARGET_NR_timerfd_settime)) && defined(CONFIG_TIMERFD)) || \
7366       defined(TARGET_NR_timer_gettime) || defined(TARGET_NR_timer_settime)
host_to_target_itimerspec(abi_ulong target_addr,struct itimerspec * host_its)7367 static inline abi_long host_to_target_itimerspec(abi_ulong target_addr,
7368                                                  struct itimerspec *host_its)
7369 {
7370     if (host_to_target_timespec(target_addr + offsetof(struct target_itimerspec,
7371                                                        it_interval),
7372                                 &host_its->it_interval) ||
7373         host_to_target_timespec(target_addr + offsetof(struct target_itimerspec,
7374                                                        it_value),
7375                                 &host_its->it_value)) {
7376         return -TARGET_EFAULT;
7377     }
7378     return 0;
7379 }
7380 #endif
7381 
7382 #if ((defined(TARGET_NR_timerfd_gettime64) || \
7383       defined(TARGET_NR_timerfd_settime64)) && defined(CONFIG_TIMERFD)) || \
7384       defined(TARGET_NR_timer_gettime64) || defined(TARGET_NR_timer_settime64)
host_to_target_itimerspec64(abi_ulong target_addr,struct itimerspec * host_its)7385 static inline abi_long host_to_target_itimerspec64(abi_ulong target_addr,
7386                                                    struct itimerspec *host_its)
7387 {
7388     if (host_to_target_timespec64(target_addr +
7389                                   offsetof(struct target__kernel_itimerspec,
7390                                            it_interval),
7391                                   &host_its->it_interval) ||
7392         host_to_target_timespec64(target_addr +
7393                                   offsetof(struct target__kernel_itimerspec,
7394                                            it_value),
7395                                   &host_its->it_value)) {
7396         return -TARGET_EFAULT;
7397     }
7398     return 0;
7399 }
7400 #endif
7401 
7402 #if defined(TARGET_NR_adjtimex) || \
7403     (defined(TARGET_NR_clock_adjtime) && defined(CONFIG_CLOCK_ADJTIME))
target_to_host_timex(struct timex * host_tx,abi_long target_addr)7404 static inline abi_long target_to_host_timex(struct timex *host_tx,
7405                                             abi_long target_addr)
7406 {
7407     struct target_timex *target_tx;
7408 
7409     if (!lock_user_struct(VERIFY_READ, target_tx, target_addr, 1)) {
7410         return -TARGET_EFAULT;
7411     }
7412 
7413     __get_user(host_tx->modes, &target_tx->modes);
7414     __get_user(host_tx->offset, &target_tx->offset);
7415     __get_user(host_tx->freq, &target_tx->freq);
7416     __get_user(host_tx->maxerror, &target_tx->maxerror);
7417     __get_user(host_tx->esterror, &target_tx->esterror);
7418     __get_user(host_tx->status, &target_tx->status);
7419     __get_user(host_tx->constant, &target_tx->constant);
7420     __get_user(host_tx->precision, &target_tx->precision);
7421     __get_user(host_tx->tolerance, &target_tx->tolerance);
7422     __get_user(host_tx->time.tv_sec, &target_tx->time.tv_sec);
7423     __get_user(host_tx->time.tv_usec, &target_tx->time.tv_usec);
7424     __get_user(host_tx->tick, &target_tx->tick);
7425     __get_user(host_tx->ppsfreq, &target_tx->ppsfreq);
7426     __get_user(host_tx->jitter, &target_tx->jitter);
7427     __get_user(host_tx->shift, &target_tx->shift);
7428     __get_user(host_tx->stabil, &target_tx->stabil);
7429     __get_user(host_tx->jitcnt, &target_tx->jitcnt);
7430     __get_user(host_tx->calcnt, &target_tx->calcnt);
7431     __get_user(host_tx->errcnt, &target_tx->errcnt);
7432     __get_user(host_tx->stbcnt, &target_tx->stbcnt);
7433     __get_user(host_tx->tai, &target_tx->tai);
7434 
7435     unlock_user_struct(target_tx, target_addr, 0);
7436     return 0;
7437 }
7438 
host_to_target_timex(abi_long target_addr,struct timex * host_tx)7439 static inline abi_long host_to_target_timex(abi_long target_addr,
7440                                             struct timex *host_tx)
7441 {
7442     struct target_timex *target_tx;
7443 
7444     if (!lock_user_struct(VERIFY_WRITE, target_tx, target_addr, 0)) {
7445         return -TARGET_EFAULT;
7446     }
7447 
7448     __put_user(host_tx->modes, &target_tx->modes);
7449     __put_user(host_tx->offset, &target_tx->offset);
7450     __put_user(host_tx->freq, &target_tx->freq);
7451     __put_user(host_tx->maxerror, &target_tx->maxerror);
7452     __put_user(host_tx->esterror, &target_tx->esterror);
7453     __put_user(host_tx->status, &target_tx->status);
7454     __put_user(host_tx->constant, &target_tx->constant);
7455     __put_user(host_tx->precision, &target_tx->precision);
7456     __put_user(host_tx->tolerance, &target_tx->tolerance);
7457     __put_user(host_tx->time.tv_sec, &target_tx->time.tv_sec);
7458     __put_user(host_tx->time.tv_usec, &target_tx->time.tv_usec);
7459     __put_user(host_tx->tick, &target_tx->tick);
7460     __put_user(host_tx->ppsfreq, &target_tx->ppsfreq);
7461     __put_user(host_tx->jitter, &target_tx->jitter);
7462     __put_user(host_tx->shift, &target_tx->shift);
7463     __put_user(host_tx->stabil, &target_tx->stabil);
7464     __put_user(host_tx->jitcnt, &target_tx->jitcnt);
7465     __put_user(host_tx->calcnt, &target_tx->calcnt);
7466     __put_user(host_tx->errcnt, &target_tx->errcnt);
7467     __put_user(host_tx->stbcnt, &target_tx->stbcnt);
7468     __put_user(host_tx->tai, &target_tx->tai);
7469 
7470     unlock_user_struct(target_tx, target_addr, 1);
7471     return 0;
7472 }
7473 #endif
7474 
7475 
7476 #if defined(TARGET_NR_clock_adjtime64) && defined(CONFIG_CLOCK_ADJTIME)
target_to_host_timex64(struct timex * host_tx,abi_long target_addr)7477 static inline abi_long target_to_host_timex64(struct timex *host_tx,
7478                                               abi_long target_addr)
7479 {
7480     struct target__kernel_timex *target_tx;
7481 
7482     if (copy_from_user_timeval64(&host_tx->time, target_addr +
7483                                  offsetof(struct target__kernel_timex,
7484                                           time))) {
7485         return -TARGET_EFAULT;
7486     }
7487 
7488     if (!lock_user_struct(VERIFY_READ, target_tx, target_addr, 1)) {
7489         return -TARGET_EFAULT;
7490     }
7491 
7492     __get_user(host_tx->modes, &target_tx->modes);
7493     __get_user(host_tx->offset, &target_tx->offset);
7494     __get_user(host_tx->freq, &target_tx->freq);
7495     __get_user(host_tx->maxerror, &target_tx->maxerror);
7496     __get_user(host_tx->esterror, &target_tx->esterror);
7497     __get_user(host_tx->status, &target_tx->status);
7498     __get_user(host_tx->constant, &target_tx->constant);
7499     __get_user(host_tx->precision, &target_tx->precision);
7500     __get_user(host_tx->tolerance, &target_tx->tolerance);
7501     __get_user(host_tx->tick, &target_tx->tick);
7502     __get_user(host_tx->ppsfreq, &target_tx->ppsfreq);
7503     __get_user(host_tx->jitter, &target_tx->jitter);
7504     __get_user(host_tx->shift, &target_tx->shift);
7505     __get_user(host_tx->stabil, &target_tx->stabil);
7506     __get_user(host_tx->jitcnt, &target_tx->jitcnt);
7507     __get_user(host_tx->calcnt, &target_tx->calcnt);
7508     __get_user(host_tx->errcnt, &target_tx->errcnt);
7509     __get_user(host_tx->stbcnt, &target_tx->stbcnt);
7510     __get_user(host_tx->tai, &target_tx->tai);
7511 
7512     unlock_user_struct(target_tx, target_addr, 0);
7513     return 0;
7514 }
7515 
host_to_target_timex64(abi_long target_addr,struct timex * host_tx)7516 static inline abi_long host_to_target_timex64(abi_long target_addr,
7517                                               struct timex *host_tx)
7518 {
7519     struct target__kernel_timex *target_tx;
7520 
7521    if (copy_to_user_timeval64(target_addr +
7522                               offsetof(struct target__kernel_timex, time),
7523                               &host_tx->time)) {
7524         return -TARGET_EFAULT;
7525     }
7526 
7527     if (!lock_user_struct(VERIFY_WRITE, target_tx, target_addr, 0)) {
7528         return -TARGET_EFAULT;
7529     }
7530 
7531     __put_user(host_tx->modes, &target_tx->modes);
7532     __put_user(host_tx->offset, &target_tx->offset);
7533     __put_user(host_tx->freq, &target_tx->freq);
7534     __put_user(host_tx->maxerror, &target_tx->maxerror);
7535     __put_user(host_tx->esterror, &target_tx->esterror);
7536     __put_user(host_tx->status, &target_tx->status);
7537     __put_user(host_tx->constant, &target_tx->constant);
7538     __put_user(host_tx->precision, &target_tx->precision);
7539     __put_user(host_tx->tolerance, &target_tx->tolerance);
7540     __put_user(host_tx->tick, &target_tx->tick);
7541     __put_user(host_tx->ppsfreq, &target_tx->ppsfreq);
7542     __put_user(host_tx->jitter, &target_tx->jitter);
7543     __put_user(host_tx->shift, &target_tx->shift);
7544     __put_user(host_tx->stabil, &target_tx->stabil);
7545     __put_user(host_tx->jitcnt, &target_tx->jitcnt);
7546     __put_user(host_tx->calcnt, &target_tx->calcnt);
7547     __put_user(host_tx->errcnt, &target_tx->errcnt);
7548     __put_user(host_tx->stbcnt, &target_tx->stbcnt);
7549     __put_user(host_tx->tai, &target_tx->tai);
7550 
7551     unlock_user_struct(target_tx, target_addr, 1);
7552     return 0;
7553 }
7554 #endif
7555 
7556 #ifndef HAVE_SIGEV_NOTIFY_THREAD_ID
7557 #define sigev_notify_thread_id _sigev_un._tid
7558 #endif
7559 
target_to_host_sigevent(struct sigevent * host_sevp,abi_ulong target_addr)7560 static inline abi_long target_to_host_sigevent(struct sigevent *host_sevp,
7561                                                abi_ulong target_addr)
7562 {
7563     struct target_sigevent *target_sevp;
7564 
7565     if (!lock_user_struct(VERIFY_READ, target_sevp, target_addr, 1)) {
7566         return -TARGET_EFAULT;
7567     }
7568 
7569     /* This union is awkward on 64 bit systems because it has a 32 bit
7570      * integer and a pointer in it; we follow the conversion approach
7571      * used for handling sigval types in signal.c so the guest should get
7572      * the correct value back even if we did a 64 bit byteswap and it's
7573      * using the 32 bit integer.
7574      */
7575     host_sevp->sigev_value.sival_ptr =
7576         (void *)(uintptr_t)tswapal(target_sevp->sigev_value.sival_ptr);
7577     host_sevp->sigev_signo =
7578         target_to_host_signal(tswap32(target_sevp->sigev_signo));
7579     host_sevp->sigev_notify = tswap32(target_sevp->sigev_notify);
7580     host_sevp->sigev_notify_thread_id = tswap32(target_sevp->_sigev_un._tid);
7581 
7582     unlock_user_struct(target_sevp, target_addr, 1);
7583     return 0;
7584 }
7585 
7586 #if defined(TARGET_NR_mlockall)
target_to_host_mlockall_arg(int arg)7587 static inline int target_to_host_mlockall_arg(int arg)
7588 {
7589     int result = 0;
7590 
7591     if (arg & TARGET_MCL_CURRENT) {
7592         result |= MCL_CURRENT;
7593     }
7594     if (arg & TARGET_MCL_FUTURE) {
7595         result |= MCL_FUTURE;
7596     }
7597 #ifdef MCL_ONFAULT
7598     if (arg & TARGET_MCL_ONFAULT) {
7599         result |= MCL_ONFAULT;
7600     }
7601 #endif
7602 
7603     return result;
7604 }
7605 #endif
7606 
target_to_host_msync_arg(abi_long arg)7607 static inline int target_to_host_msync_arg(abi_long arg)
7608 {
7609     return ((arg & TARGET_MS_ASYNC) ? MS_ASYNC : 0) |
7610            ((arg & TARGET_MS_INVALIDATE) ? MS_INVALIDATE : 0) |
7611            ((arg & TARGET_MS_SYNC) ? MS_SYNC : 0) |
7612            (arg & ~(TARGET_MS_ASYNC | TARGET_MS_INVALIDATE | TARGET_MS_SYNC));
7613 }
7614 
7615 #if (defined(TARGET_NR_stat64) || defined(TARGET_NR_lstat64) ||     \
7616      defined(TARGET_NR_fstat64) || defined(TARGET_NR_fstatat64) ||  \
7617      defined(TARGET_NR_newfstatat))
host_to_target_stat64(CPUArchState * cpu_env,abi_ulong target_addr,struct stat * host_st)7618 static inline abi_long host_to_target_stat64(CPUArchState *cpu_env,
7619                                              abi_ulong target_addr,
7620                                              struct stat *host_st)
7621 {
7622 #if defined(TARGET_ARM) && defined(TARGET_ABI32)
7623     if (cpu_env->eabi) {
7624         struct target_eabi_stat64 *target_st;
7625 
7626         if (!lock_user_struct(VERIFY_WRITE, target_st, target_addr, 0))
7627             return -TARGET_EFAULT;
7628         memset(target_st, 0, sizeof(struct target_eabi_stat64));
7629         __put_user(host_st->st_dev, &target_st->st_dev);
7630         __put_user(host_st->st_ino, &target_st->st_ino);
7631 #ifdef TARGET_STAT64_HAS_BROKEN_ST_INO
7632         __put_user(host_st->st_ino, &target_st->__st_ino);
7633 #endif
7634         __put_user(host_st->st_mode, &target_st->st_mode);
7635         __put_user(host_st->st_nlink, &target_st->st_nlink);
7636         __put_user(host_st->st_uid, &target_st->st_uid);
7637         __put_user(host_st->st_gid, &target_st->st_gid);
7638         __put_user(host_st->st_rdev, &target_st->st_rdev);
7639         __put_user(host_st->st_size, &target_st->st_size);
7640         __put_user(host_st->st_blksize, &target_st->st_blksize);
7641         __put_user(host_st->st_blocks, &target_st->st_blocks);
7642         __put_user(host_st->st_atime, &target_st->target_st_atime);
7643         __put_user(host_st->st_mtime, &target_st->target_st_mtime);
7644         __put_user(host_st->st_ctime, &target_st->target_st_ctime);
7645 #ifdef HAVE_STRUCT_STAT_ST_ATIM
7646         __put_user(host_st->st_atim.tv_nsec, &target_st->target_st_atime_nsec);
7647         __put_user(host_st->st_mtim.tv_nsec, &target_st->target_st_mtime_nsec);
7648         __put_user(host_st->st_ctim.tv_nsec, &target_st->target_st_ctime_nsec);
7649 #endif
7650         unlock_user_struct(target_st, target_addr, 1);
7651     } else
7652 #endif
7653     {
7654 #if defined(TARGET_HAS_STRUCT_STAT64)
7655         struct target_stat64 *target_st;
7656 #else
7657         struct target_stat *target_st;
7658 #endif
7659 
7660         if (!lock_user_struct(VERIFY_WRITE, target_st, target_addr, 0))
7661             return -TARGET_EFAULT;
7662         memset(target_st, 0, sizeof(*target_st));
7663         __put_user(host_st->st_dev, &target_st->st_dev);
7664         __put_user(host_st->st_ino, &target_st->st_ino);
7665 #ifdef TARGET_STAT64_HAS_BROKEN_ST_INO
7666         __put_user(host_st->st_ino, &target_st->__st_ino);
7667 #endif
7668         __put_user(host_st->st_mode, &target_st->st_mode);
7669         __put_user(host_st->st_nlink, &target_st->st_nlink);
7670         __put_user(host_st->st_uid, &target_st->st_uid);
7671         __put_user(host_st->st_gid, &target_st->st_gid);
7672         __put_user(host_st->st_rdev, &target_st->st_rdev);
7673         /* XXX: better use of kernel struct */
7674         __put_user(host_st->st_size, &target_st->st_size);
7675         __put_user(host_st->st_blksize, &target_st->st_blksize);
7676         __put_user(host_st->st_blocks, &target_st->st_blocks);
7677         __put_user(host_st->st_atime, &target_st->target_st_atime);
7678         __put_user(host_st->st_mtime, &target_st->target_st_mtime);
7679         __put_user(host_st->st_ctime, &target_st->target_st_ctime);
7680 #ifdef HAVE_STRUCT_STAT_ST_ATIM
7681         __put_user(host_st->st_atim.tv_nsec, &target_st->target_st_atime_nsec);
7682         __put_user(host_st->st_mtim.tv_nsec, &target_st->target_st_mtime_nsec);
7683         __put_user(host_st->st_ctim.tv_nsec, &target_st->target_st_ctime_nsec);
7684 #endif
7685         unlock_user_struct(target_st, target_addr, 1);
7686     }
7687 
7688     return 0;
7689 }
7690 #endif
7691 
7692 #if defined(TARGET_NR_statx) && defined(__NR_statx)
host_to_target_statx(struct target_statx * host_stx,abi_ulong target_addr)7693 static inline abi_long host_to_target_statx(struct target_statx *host_stx,
7694                                             abi_ulong target_addr)
7695 {
7696     struct target_statx *target_stx;
7697 
7698     if (!lock_user_struct(VERIFY_WRITE, target_stx, target_addr,  0)) {
7699         return -TARGET_EFAULT;
7700     }
7701     memset(target_stx, 0, sizeof(*target_stx));
7702 
7703     __put_user(host_stx->stx_mask, &target_stx->stx_mask);
7704     __put_user(host_stx->stx_blksize, &target_stx->stx_blksize);
7705     __put_user(host_stx->stx_attributes, &target_stx->stx_attributes);
7706     __put_user(host_stx->stx_nlink, &target_stx->stx_nlink);
7707     __put_user(host_stx->stx_uid, &target_stx->stx_uid);
7708     __put_user(host_stx->stx_gid, &target_stx->stx_gid);
7709     __put_user(host_stx->stx_mode, &target_stx->stx_mode);
7710     __put_user(host_stx->stx_ino, &target_stx->stx_ino);
7711     __put_user(host_stx->stx_size, &target_stx->stx_size);
7712     __put_user(host_stx->stx_blocks, &target_stx->stx_blocks);
7713     __put_user(host_stx->stx_attributes_mask, &target_stx->stx_attributes_mask);
7714     __put_user(host_stx->stx_atime.tv_sec, &target_stx->stx_atime.tv_sec);
7715     __put_user(host_stx->stx_atime.tv_nsec, &target_stx->stx_atime.tv_nsec);
7716     __put_user(host_stx->stx_btime.tv_sec, &target_stx->stx_btime.tv_sec);
7717     __put_user(host_stx->stx_btime.tv_nsec, &target_stx->stx_btime.tv_nsec);
7718     __put_user(host_stx->stx_ctime.tv_sec, &target_stx->stx_ctime.tv_sec);
7719     __put_user(host_stx->stx_ctime.tv_nsec, &target_stx->stx_ctime.tv_nsec);
7720     __put_user(host_stx->stx_mtime.tv_sec, &target_stx->stx_mtime.tv_sec);
7721     __put_user(host_stx->stx_mtime.tv_nsec, &target_stx->stx_mtime.tv_nsec);
7722     __put_user(host_stx->stx_rdev_major, &target_stx->stx_rdev_major);
7723     __put_user(host_stx->stx_rdev_minor, &target_stx->stx_rdev_minor);
7724     __put_user(host_stx->stx_dev_major, &target_stx->stx_dev_major);
7725     __put_user(host_stx->stx_dev_minor, &target_stx->stx_dev_minor);
7726 
7727     unlock_user_struct(target_stx, target_addr, 1);
7728 
7729     return 0;
7730 }
7731 #endif
7732 
do_sys_futex(int * uaddr,int op,int val,const struct timespec * timeout,int * uaddr2,int val3)7733 static int do_sys_futex(int *uaddr, int op, int val,
7734                          const struct timespec *timeout, int *uaddr2,
7735                          int val3)
7736 {
7737 #if HOST_LONG_BITS == 64
7738 #if defined(__NR_futex)
7739     /* always a 64-bit time_t, it doesn't define _time64 version  */
7740     return sys_futex(uaddr, op, val, timeout, uaddr2, val3);
7741 
7742 #endif
7743 #else /* HOST_LONG_BITS == 64 */
7744 #if defined(__NR_futex_time64)
7745     if (sizeof(timeout->tv_sec) == 8) {
7746         /* _time64 function on 32bit arch */
7747         return sys_futex_time64(uaddr, op, val, timeout, uaddr2, val3);
7748     }
7749 #endif
7750 #if defined(__NR_futex)
7751     /* old function on 32bit arch */
7752     return sys_futex(uaddr, op, val, timeout, uaddr2, val3);
7753 #endif
7754 #endif /* HOST_LONG_BITS == 64 */
7755     g_assert_not_reached();
7756 }
7757 
do_safe_futex(int * uaddr,int op,int val,const struct timespec * timeout,int * uaddr2,int val3)7758 static int do_safe_futex(int *uaddr, int op, int val,
7759                          const struct timespec *timeout, int *uaddr2,
7760                          int val3)
7761 {
7762 #if HOST_LONG_BITS == 64
7763 #if defined(__NR_futex)
7764     /* always a 64-bit time_t, it doesn't define _time64 version  */
7765     return get_errno(safe_futex(uaddr, op, val, timeout, uaddr2, val3));
7766 #endif
7767 #else /* HOST_LONG_BITS == 64 */
7768 #if defined(__NR_futex_time64)
7769     if (sizeof(timeout->tv_sec) == 8) {
7770         /* _time64 function on 32bit arch */
7771         return get_errno(safe_futex_time64(uaddr, op, val, timeout, uaddr2,
7772                                            val3));
7773     }
7774 #endif
7775 #if defined(__NR_futex)
7776     /* old function on 32bit arch */
7777     return get_errno(safe_futex(uaddr, op, val, timeout, uaddr2, val3));
7778 #endif
7779 #endif /* HOST_LONG_BITS == 64 */
7780     return -TARGET_ENOSYS;
7781 }
7782 
7783 /* ??? Using host futex calls even when target atomic operations
7784    are not really atomic probably breaks things.  However implementing
7785    futexes locally would make futexes shared between multiple processes
7786    tricky.  However they're probably useless because guest atomic
7787    operations won't work either.  */
7788 #if defined(TARGET_NR_futex) || defined(TARGET_NR_futex_time64)
do_futex(CPUState * cpu,bool time64,target_ulong uaddr,int op,int val,target_ulong timeout,target_ulong uaddr2,int val3)7789 static int do_futex(CPUState *cpu, bool time64, target_ulong uaddr,
7790                     int op, int val, target_ulong timeout,
7791                     target_ulong uaddr2, int val3)
7792 {
7793     struct timespec ts, *pts = NULL;
7794     void *haddr2 = NULL;
7795     int base_op;
7796 
7797     /* We assume FUTEX_* constants are the same on both host and target. */
7798 #ifdef FUTEX_CMD_MASK
7799     base_op = op & FUTEX_CMD_MASK;
7800 #else
7801     base_op = op;
7802 #endif
7803     switch (base_op) {
7804     case FUTEX_WAIT:
7805     case FUTEX_WAIT_BITSET:
7806         val = tswap32(val);
7807         break;
7808     case FUTEX_WAIT_REQUEUE_PI:
7809         val = tswap32(val);
7810         haddr2 = g2h(cpu, uaddr2);
7811         break;
7812     case FUTEX_LOCK_PI:
7813     case FUTEX_LOCK_PI2:
7814         break;
7815     case FUTEX_WAKE:
7816     case FUTEX_WAKE_BITSET:
7817     case FUTEX_TRYLOCK_PI:
7818     case FUTEX_UNLOCK_PI:
7819         timeout = 0;
7820         break;
7821     case FUTEX_FD:
7822         val = target_to_host_signal(val);
7823         timeout = 0;
7824         break;
7825     case FUTEX_CMP_REQUEUE:
7826     case FUTEX_CMP_REQUEUE_PI:
7827         val3 = tswap32(val3);
7828         /* fall through */
7829     case FUTEX_REQUEUE:
7830     case FUTEX_WAKE_OP:
7831         /*
7832          * For these, the 4th argument is not TIMEOUT, but VAL2.
7833          * But the prototype of do_safe_futex takes a pointer, so
7834          * insert casts to satisfy the compiler.  We do not need
7835          * to tswap VAL2 since it's not compared to guest memory.
7836           */
7837         pts = (struct timespec *)(uintptr_t)timeout;
7838         timeout = 0;
7839         haddr2 = g2h(cpu, uaddr2);
7840         break;
7841     default:
7842         return -TARGET_ENOSYS;
7843     }
7844     if (timeout) {
7845         pts = &ts;
7846         if (time64
7847             ? target_to_host_timespec64(pts, timeout)
7848             : target_to_host_timespec(pts, timeout)) {
7849             return -TARGET_EFAULT;
7850         }
7851     }
7852     return do_safe_futex(g2h(cpu, uaddr), op, val, pts, haddr2, val3);
7853 }
7854 #endif
7855 
7856 #if defined(TARGET_NR_name_to_handle_at) && defined(CONFIG_OPEN_BY_HANDLE)
do_name_to_handle_at(abi_long dirfd,abi_long pathname,abi_long handle,abi_long mount_id,abi_long flags)7857 static abi_long do_name_to_handle_at(abi_long dirfd, abi_long pathname,
7858                                      abi_long handle, abi_long mount_id,
7859                                      abi_long flags)
7860 {
7861     struct file_handle *target_fh;
7862     struct file_handle *fh;
7863     int mid = 0;
7864     abi_long ret;
7865     char *name;
7866     unsigned int size, total_size;
7867 
7868     if (get_user_s32(size, handle)) {
7869         return -TARGET_EFAULT;
7870     }
7871 
7872     name = lock_user_string(pathname);
7873     if (!name) {
7874         return -TARGET_EFAULT;
7875     }
7876 
7877     total_size = sizeof(struct file_handle) + size;
7878     target_fh = lock_user(VERIFY_WRITE, handle, total_size, 0);
7879     if (!target_fh) {
7880         unlock_user(name, pathname, 0);
7881         return -TARGET_EFAULT;
7882     }
7883 
7884     fh = g_malloc0(total_size);
7885     fh->handle_bytes = size;
7886 
7887     ret = get_errno(name_to_handle_at(dirfd, path(name), fh, &mid, flags));
7888     unlock_user(name, pathname, 0);
7889 
7890     /* man name_to_handle_at(2):
7891      * Other than the use of the handle_bytes field, the caller should treat
7892      * the file_handle structure as an opaque data type
7893      */
7894 
7895     memcpy(target_fh, fh, total_size);
7896     target_fh->handle_bytes = tswap32(fh->handle_bytes);
7897     target_fh->handle_type = tswap32(fh->handle_type);
7898     g_free(fh);
7899     unlock_user(target_fh, handle, total_size);
7900 
7901     if (put_user_s32(mid, mount_id)) {
7902         return -TARGET_EFAULT;
7903     }
7904 
7905     return ret;
7906 
7907 }
7908 #endif
7909 
7910 #if defined(TARGET_NR_open_by_handle_at) && defined(CONFIG_OPEN_BY_HANDLE)
do_open_by_handle_at(abi_long mount_fd,abi_long handle,abi_long flags)7911 static abi_long do_open_by_handle_at(abi_long mount_fd, abi_long handle,
7912                                      abi_long flags)
7913 {
7914     struct file_handle *target_fh;
7915     struct file_handle *fh;
7916     unsigned int size, total_size;
7917     abi_long ret;
7918 
7919     if (get_user_s32(size, handle)) {
7920         return -TARGET_EFAULT;
7921     }
7922 
7923     total_size = sizeof(struct file_handle) + size;
7924     target_fh = lock_user(VERIFY_READ, handle, total_size, 1);
7925     if (!target_fh) {
7926         return -TARGET_EFAULT;
7927     }
7928 
7929     fh = g_memdup(target_fh, total_size);
7930     fh->handle_bytes = size;
7931     fh->handle_type = tswap32(target_fh->handle_type);
7932 
7933     ret = get_errno(open_by_handle_at(mount_fd, fh,
7934                     target_to_host_bitmask(flags, fcntl_flags_tbl)));
7935 
7936     g_free(fh);
7937 
7938     unlock_user(target_fh, handle, total_size);
7939 
7940     return ret;
7941 }
7942 #endif
7943 
7944 #if defined(TARGET_NR_signalfd) || defined(TARGET_NR_signalfd4)
7945 
do_signalfd4(int fd,abi_long mask,int flags)7946 static abi_long do_signalfd4(int fd, abi_long mask, int flags)
7947 {
7948     int host_flags;
7949     target_sigset_t *target_mask;
7950     sigset_t host_mask;
7951     abi_long ret;
7952 
7953     if (flags & ~(TARGET_O_NONBLOCK_MASK | TARGET_O_CLOEXEC)) {
7954         return -TARGET_EINVAL;
7955     }
7956     if (!lock_user_struct(VERIFY_READ, target_mask, mask, 1)) {
7957         return -TARGET_EFAULT;
7958     }
7959 
7960     target_to_host_sigset(&host_mask, target_mask);
7961 
7962     host_flags = target_to_host_bitmask(flags, fcntl_flags_tbl);
7963 
7964     ret = get_errno(signalfd(fd, &host_mask, host_flags));
7965     if (ret >= 0) {
7966         fd_trans_register(ret, &target_signalfd_trans);
7967     }
7968 
7969     unlock_user_struct(target_mask, mask, 0);
7970 
7971     return ret;
7972 }
7973 #endif
7974 
7975 /* Map host to target signal numbers for the wait family of syscalls.
7976    Assume all other status bits are the same.  */
host_to_target_waitstatus(int status)7977 int host_to_target_waitstatus(int status)
7978 {
7979     if (WIFSIGNALED(status)) {
7980         return host_to_target_signal(WTERMSIG(status)) | (status & ~0x7f);
7981     }
7982     if (WIFSTOPPED(status)) {
7983         return (host_to_target_signal(WSTOPSIG(status)) << 8)
7984                | (status & 0xff);
7985     }
7986     return status;
7987 }
7988 
open_self_cmdline(CPUArchState * cpu_env,int fd)7989 static int open_self_cmdline(CPUArchState *cpu_env, int fd)
7990 {
7991     CPUState *cpu = env_cpu(cpu_env);
7992     struct linux_binprm *bprm = get_task_state(cpu)->bprm;
7993     int i;
7994 
7995     for (i = 0; i < bprm->argc; i++) {
7996         size_t len = strlen(bprm->argv[i]) + 1;
7997 
7998         if (write(fd, bprm->argv[i], len) != len) {
7999             return -1;
8000         }
8001     }
8002 
8003     return 0;
8004 }
8005 
8006 struct open_self_maps_data {
8007     TaskState *ts;
8008     IntervalTreeRoot *host_maps;
8009     int fd;
8010     bool smaps;
8011 };
8012 
8013 /*
8014  * Subroutine to output one line of /proc/self/maps,
8015  * or one region of /proc/self/smaps.
8016  */
8017 
8018 #ifdef TARGET_HPPA
8019 # define test_stack(S, E, L)  (E == L)
8020 #else
8021 # define test_stack(S, E, L)  (S == L)
8022 #endif
8023 
open_self_maps_4(const struct open_self_maps_data * d,const MapInfo * mi,abi_ptr start,abi_ptr end,unsigned flags)8024 static void open_self_maps_4(const struct open_self_maps_data *d,
8025                              const MapInfo *mi, abi_ptr start,
8026                              abi_ptr end, unsigned flags)
8027 {
8028     const struct image_info *info = d->ts->info;
8029     const char *path = mi->path;
8030     uint64_t offset;
8031     int fd = d->fd;
8032     int count;
8033 
8034     if (test_stack(start, end, info->stack_limit)) {
8035         path = "[stack]";
8036     } else if (start == info->brk) {
8037         path = "[heap]";
8038     } else if (start == info->vdso) {
8039         path = "[vdso]";
8040 #ifdef TARGET_X86_64
8041     } else if (start == TARGET_VSYSCALL_PAGE) {
8042         path = "[vsyscall]";
8043 #endif
8044     }
8045 
8046     /* Except null device (MAP_ANON), adjust offset for this fragment. */
8047     offset = mi->offset;
8048     if (mi->dev) {
8049         uintptr_t hstart = (uintptr_t)g2h_untagged(start);
8050         offset += hstart - mi->itree.start;
8051     }
8052 
8053     count = dprintf(fd, TARGET_ABI_FMT_ptr "-" TARGET_ABI_FMT_ptr
8054                     " %c%c%c%c %08" PRIx64 " %02x:%02x %"PRId64,
8055                     start, end,
8056                     (flags & PAGE_READ) ? 'r' : '-',
8057                     (flags & PAGE_WRITE_ORG) ? 'w' : '-',
8058                     (flags & PAGE_EXEC) ? 'x' : '-',
8059                     mi->is_priv ? 'p' : 's',
8060                     offset, major(mi->dev), minor(mi->dev),
8061                     (uint64_t)mi->inode);
8062     if (path) {
8063         dprintf(fd, "%*s%s\n", 73 - count, "", path);
8064     } else {
8065         dprintf(fd, "\n");
8066     }
8067 
8068     if (d->smaps) {
8069         unsigned long size = end - start;
8070         unsigned long page_size_kb = TARGET_PAGE_SIZE >> 10;
8071         unsigned long size_kb = size >> 10;
8072 
8073         dprintf(fd, "Size:                  %lu kB\n"
8074                 "KernelPageSize:        %lu kB\n"
8075                 "MMUPageSize:           %lu kB\n"
8076                 "Rss:                   0 kB\n"
8077                 "Pss:                   0 kB\n"
8078                 "Pss_Dirty:             0 kB\n"
8079                 "Shared_Clean:          0 kB\n"
8080                 "Shared_Dirty:          0 kB\n"
8081                 "Private_Clean:         0 kB\n"
8082                 "Private_Dirty:         0 kB\n"
8083                 "Referenced:            0 kB\n"
8084                 "Anonymous:             %lu kB\n"
8085                 "LazyFree:              0 kB\n"
8086                 "AnonHugePages:         0 kB\n"
8087                 "ShmemPmdMapped:        0 kB\n"
8088                 "FilePmdMapped:         0 kB\n"
8089                 "Shared_Hugetlb:        0 kB\n"
8090                 "Private_Hugetlb:       0 kB\n"
8091                 "Swap:                  0 kB\n"
8092                 "SwapPss:               0 kB\n"
8093                 "Locked:                0 kB\n"
8094                 "THPeligible:    0\n"
8095                 "VmFlags:%s%s%s%s%s%s%s%s\n",
8096                 size_kb, page_size_kb, page_size_kb,
8097                 (flags & PAGE_ANON ? size_kb : 0),
8098                 (flags & PAGE_READ) ? " rd" : "",
8099                 (flags & PAGE_WRITE_ORG) ? " wr" : "",
8100                 (flags & PAGE_EXEC) ? " ex" : "",
8101                 mi->is_priv ? "" : " sh",
8102                 (flags & PAGE_READ) ? " mr" : "",
8103                 (flags & PAGE_WRITE_ORG) ? " mw" : "",
8104                 (flags & PAGE_EXEC) ? " me" : "",
8105                 mi->is_priv ? "" : " ms");
8106     }
8107 }
8108 
8109 /*
8110  * Callback for walk_memory_regions, when read_self_maps() fails.
8111  * Proceed without the benefit of host /proc/self/maps cross-check.
8112  */
open_self_maps_3(void * opaque,target_ulong guest_start,target_ulong guest_end,unsigned long flags)8113 static int open_self_maps_3(void *opaque, target_ulong guest_start,
8114                             target_ulong guest_end, unsigned long flags)
8115 {
8116     static const MapInfo mi = { .is_priv = true };
8117 
8118     open_self_maps_4(opaque, &mi, guest_start, guest_end, flags);
8119     return 0;
8120 }
8121 
8122 /*
8123  * Callback for walk_memory_regions, when read_self_maps() succeeds.
8124  */
open_self_maps_2(void * opaque,target_ulong guest_start,target_ulong guest_end,unsigned long flags)8125 static int open_self_maps_2(void *opaque, target_ulong guest_start,
8126                             target_ulong guest_end, unsigned long flags)
8127 {
8128     const struct open_self_maps_data *d = opaque;
8129     uintptr_t host_start = (uintptr_t)g2h_untagged(guest_start);
8130     uintptr_t host_last = (uintptr_t)g2h_untagged(guest_end - 1);
8131 
8132 #ifdef TARGET_X86_64
8133     /*
8134      * Because of the extremely high position of the page within the guest
8135      * virtual address space, this is not backed by host memory at all.
8136      * Therefore the loop below would fail.  This is the only instance
8137      * of not having host backing memory.
8138      */
8139     if (guest_start == TARGET_VSYSCALL_PAGE) {
8140         return open_self_maps_3(opaque, guest_start, guest_end, flags);
8141     }
8142 #endif
8143 
8144     while (1) {
8145         IntervalTreeNode *n =
8146             interval_tree_iter_first(d->host_maps, host_start, host_start);
8147         MapInfo *mi = container_of(n, MapInfo, itree);
8148         uintptr_t this_hlast = MIN(host_last, n->last);
8149         target_ulong this_gend = h2g(this_hlast) + 1;
8150 
8151         open_self_maps_4(d, mi, guest_start, this_gend, flags);
8152 
8153         if (this_hlast == host_last) {
8154             return 0;
8155         }
8156         host_start = this_hlast + 1;
8157         guest_start = h2g(host_start);
8158     }
8159 }
8160 
open_self_maps_1(CPUArchState * env,int fd,bool smaps)8161 static int open_self_maps_1(CPUArchState *env, int fd, bool smaps)
8162 {
8163     struct open_self_maps_data d = {
8164         .ts = get_task_state(env_cpu(env)),
8165         .fd = fd,
8166         .smaps = smaps
8167     };
8168 
8169     mmap_lock();
8170     d.host_maps = read_self_maps();
8171     if (d.host_maps) {
8172         walk_memory_regions(&d, open_self_maps_2);
8173         free_self_maps(d.host_maps);
8174     } else {
8175         walk_memory_regions(&d, open_self_maps_3);
8176     }
8177     mmap_unlock();
8178     return 0;
8179 }
8180 
open_self_maps(CPUArchState * cpu_env,int fd)8181 static int open_self_maps(CPUArchState *cpu_env, int fd)
8182 {
8183     return open_self_maps_1(cpu_env, fd, false);
8184 }
8185 
open_self_smaps(CPUArchState * cpu_env,int fd)8186 static int open_self_smaps(CPUArchState *cpu_env, int fd)
8187 {
8188     return open_self_maps_1(cpu_env, fd, true);
8189 }
8190 
open_self_stat(CPUArchState * cpu_env,int fd)8191 static int open_self_stat(CPUArchState *cpu_env, int fd)
8192 {
8193     CPUState *cpu = env_cpu(cpu_env);
8194     TaskState *ts = get_task_state(cpu);
8195     g_autoptr(GString) buf = g_string_new(NULL);
8196     int i;
8197 
8198     for (i = 0; i < 44; i++) {
8199         if (i == 0) {
8200             /* pid */
8201             g_string_printf(buf, FMT_pid " ", getpid());
8202         } else if (i == 1) {
8203             /* app name */
8204             gchar *bin = g_strrstr(ts->bprm->argv[0], "/");
8205             bin = bin ? bin + 1 : ts->bprm->argv[0];
8206             g_string_printf(buf, "(%.15s) ", bin);
8207         } else if (i == 2) {
8208             /* task state */
8209             g_string_assign(buf, "R "); /* we are running right now */
8210         } else if (i == 3) {
8211             /* ppid */
8212             g_string_printf(buf, FMT_pid " ", getppid());
8213         } else if (i == 19) {
8214             /* num_threads */
8215             int cpus = 0;
8216             WITH_RCU_READ_LOCK_GUARD() {
8217                 CPUState *cpu_iter;
8218                 CPU_FOREACH(cpu_iter) {
8219                     cpus++;
8220                 }
8221             }
8222             g_string_printf(buf, "%d ", cpus);
8223         } else if (i == 21) {
8224             /* starttime */
8225             g_string_printf(buf, "%" PRIu64 " ", ts->start_boottime);
8226         } else if (i == 27) {
8227             /* stack bottom */
8228             g_string_printf(buf, TARGET_ABI_FMT_ld " ", ts->info->start_stack);
8229         } else {
8230             /* for the rest, there is MasterCard */
8231             g_string_printf(buf, "0%c", i == 43 ? '\n' : ' ');
8232         }
8233 
8234         if (write(fd, buf->str, buf->len) != buf->len) {
8235             return -1;
8236         }
8237     }
8238 
8239     return 0;
8240 }
8241 
open_self_auxv(CPUArchState * cpu_env,int fd)8242 static int open_self_auxv(CPUArchState *cpu_env, int fd)
8243 {
8244     CPUState *cpu = env_cpu(cpu_env);
8245     TaskState *ts = get_task_state(cpu);
8246     abi_ulong auxv = ts->info->saved_auxv;
8247     abi_ulong len = ts->info->auxv_len;
8248     char *ptr;
8249 
8250     /*
8251      * Auxiliary vector is stored in target process stack.
8252      * read in whole auxv vector and copy it to file
8253      */
8254     ptr = lock_user(VERIFY_READ, auxv, len, 0);
8255     if (ptr != NULL) {
8256         while (len > 0) {
8257             ssize_t r;
8258             r = write(fd, ptr, len);
8259             if (r <= 0) {
8260                 break;
8261             }
8262             len -= r;
8263             ptr += r;
8264         }
8265         lseek(fd, 0, SEEK_SET);
8266         unlock_user(ptr, auxv, len);
8267     }
8268 
8269     return 0;
8270 }
8271 
is_proc_myself(const char * filename,const char * entry)8272 static int is_proc_myself(const char *filename, const char *entry)
8273 {
8274     if (!strncmp(filename, "/proc/", strlen("/proc/"))) {
8275         filename += strlen("/proc/");
8276         if (!strncmp(filename, "self/", strlen("self/"))) {
8277             filename += strlen("self/");
8278         } else if (*filename >= '1' && *filename <= '9') {
8279             char myself[80];
8280             snprintf(myself, sizeof(myself), "%d/", getpid());
8281             if (!strncmp(filename, myself, strlen(myself))) {
8282                 filename += strlen(myself);
8283             } else {
8284                 return 0;
8285             }
8286         } else {
8287             return 0;
8288         }
8289         if (!strcmp(filename, entry)) {
8290             return 1;
8291         }
8292     }
8293     return 0;
8294 }
8295 
excp_dump_file(FILE * logfile,CPUArchState * env,const char * fmt,int code)8296 static void excp_dump_file(FILE *logfile, CPUArchState *env,
8297                       const char *fmt, int code)
8298 {
8299     if (logfile) {
8300         CPUState *cs = env_cpu(env);
8301 
8302         fprintf(logfile, fmt, code);
8303         fprintf(logfile, "Failing executable: %s\n", exec_path);
8304         cpu_dump_state(cs, logfile, 0);
8305         open_self_maps(env, fileno(logfile));
8306     }
8307 }
8308 
target_exception_dump(CPUArchState * env,const char * fmt,int code)8309 void target_exception_dump(CPUArchState *env, const char *fmt, int code)
8310 {
8311     /* dump to console */
8312     excp_dump_file(stderr, env, fmt, code);
8313 
8314     /* dump to log file */
8315     if (qemu_log_separate()) {
8316         FILE *logfile = qemu_log_trylock();
8317 
8318         excp_dump_file(logfile, env, fmt, code);
8319         qemu_log_unlock(logfile);
8320     }
8321 }
8322 
8323 #include "target_proc.h"
8324 
8325 #if HOST_BIG_ENDIAN != TARGET_BIG_ENDIAN || \
8326     defined(HAVE_ARCH_PROC_CPUINFO) || \
8327     defined(HAVE_ARCH_PROC_HARDWARE)
is_proc(const char * filename,const char * entry)8328 static int is_proc(const char *filename, const char *entry)
8329 {
8330     return strcmp(filename, entry) == 0;
8331 }
8332 #endif
8333 
8334 #if HOST_BIG_ENDIAN != TARGET_BIG_ENDIAN
open_net_route(CPUArchState * cpu_env,int fd)8335 static int open_net_route(CPUArchState *cpu_env, int fd)
8336 {
8337     FILE *fp;
8338     char *line = NULL;
8339     size_t len = 0;
8340     ssize_t read;
8341 
8342     fp = fopen("/proc/net/route", "r");
8343     if (fp == NULL) {
8344         return -1;
8345     }
8346 
8347     /* read header */
8348 
8349     read = getline(&line, &len, fp);
8350     dprintf(fd, "%s", line);
8351 
8352     /* read routes */
8353 
8354     while ((read = getline(&line, &len, fp)) != -1) {
8355         char iface[16];
8356         uint32_t dest, gw, mask;
8357         unsigned int flags, refcnt, use, metric, mtu, window, irtt;
8358         int fields;
8359 
8360         fields = sscanf(line,
8361                         "%s\t%08x\t%08x\t%04x\t%d\t%d\t%d\t%08x\t%d\t%u\t%u\n",
8362                         iface, &dest, &gw, &flags, &refcnt, &use, &metric,
8363                         &mask, &mtu, &window, &irtt);
8364         if (fields != 11) {
8365             continue;
8366         }
8367         dprintf(fd, "%s\t%08x\t%08x\t%04x\t%d\t%d\t%d\t%08x\t%d\t%u\t%u\n",
8368                 iface, tswap32(dest), tswap32(gw), flags, refcnt, use,
8369                 metric, tswap32(mask), mtu, window, irtt);
8370     }
8371 
8372     free(line);
8373     fclose(fp);
8374 
8375     return 0;
8376 }
8377 #endif
8378 
maybe_do_fake_open(CPUArchState * cpu_env,int dirfd,const char * fname,int flags,mode_t mode,int openat2_resolve,bool safe)8379 static int maybe_do_fake_open(CPUArchState *cpu_env, int dirfd,
8380                               const char *fname, int flags, mode_t mode,
8381                               int openat2_resolve, bool safe)
8382 {
8383     g_autofree char *proc_name = NULL;
8384     const char *pathname;
8385     struct fake_open {
8386         const char *filename;
8387         int (*fill)(CPUArchState *cpu_env, int fd);
8388         int (*cmp)(const char *s1, const char *s2);
8389     };
8390     const struct fake_open *fake_open;
8391     static const struct fake_open fakes[] = {
8392         { "maps", open_self_maps, is_proc_myself },
8393         { "smaps", open_self_smaps, is_proc_myself },
8394         { "stat", open_self_stat, is_proc_myself },
8395         { "auxv", open_self_auxv, is_proc_myself },
8396         { "cmdline", open_self_cmdline, is_proc_myself },
8397 #if HOST_BIG_ENDIAN != TARGET_BIG_ENDIAN
8398         { "/proc/net/route", open_net_route, is_proc },
8399 #endif
8400 #if defined(HAVE_ARCH_PROC_CPUINFO)
8401         { "/proc/cpuinfo", open_cpuinfo, is_proc },
8402 #endif
8403 #if defined(HAVE_ARCH_PROC_HARDWARE)
8404         { "/proc/hardware", open_hardware, is_proc },
8405 #endif
8406         { NULL, NULL, NULL }
8407     };
8408 
8409     /* if this is a file from /proc/ filesystem, expand full name */
8410     proc_name = realpath(fname, NULL);
8411     if (proc_name && strncmp(proc_name, "/proc/", 6) == 0) {
8412         pathname = proc_name;
8413     } else {
8414         pathname = fname;
8415     }
8416 
8417     if (is_proc_myself(pathname, "exe")) {
8418         /* Honor openat2 resolve flags */
8419         if ((openat2_resolve & RESOLVE_NO_MAGICLINKS) ||
8420             (openat2_resolve & RESOLVE_NO_SYMLINKS)) {
8421             errno = ELOOP;
8422             return -1;
8423         }
8424         if (safe) {
8425             return safe_openat(dirfd, exec_path, flags, mode);
8426         } else {
8427             return openat(dirfd, exec_path, flags, mode);
8428         }
8429     }
8430 
8431     for (fake_open = fakes; fake_open->filename; fake_open++) {
8432         if (fake_open->cmp(pathname, fake_open->filename)) {
8433             break;
8434         }
8435     }
8436 
8437     if (fake_open->filename) {
8438         const char *tmpdir;
8439         char filename[PATH_MAX];
8440         int fd, r;
8441 
8442         fd = memfd_create("qemu-open", 0);
8443         if (fd < 0) {
8444             if (errno != ENOSYS) {
8445                 return fd;
8446             }
8447             /* create temporary file to map stat to */
8448             tmpdir = getenv("TMPDIR");
8449             if (!tmpdir)
8450                 tmpdir = "/tmp";
8451             snprintf(filename, sizeof(filename), "%s/qemu-open.XXXXXX", tmpdir);
8452             fd = mkstemp(filename);
8453             if (fd < 0) {
8454                 return fd;
8455             }
8456             unlink(filename);
8457         }
8458 
8459         if ((r = fake_open->fill(cpu_env, fd))) {
8460             int e = errno;
8461             close(fd);
8462             errno = e;
8463             return r;
8464         }
8465         lseek(fd, 0, SEEK_SET);
8466 
8467         return fd;
8468     }
8469 
8470     return -2;
8471 }
8472 
do_guest_openat(CPUArchState * cpu_env,int dirfd,const char * pathname,int flags,mode_t mode,bool safe)8473 int do_guest_openat(CPUArchState *cpu_env, int dirfd, const char *pathname,
8474                     int flags, mode_t mode, bool safe)
8475 {
8476     int fd = maybe_do_fake_open(cpu_env, dirfd, pathname, flags, mode, 0, safe);
8477     if (fd > -2) {
8478         return fd;
8479     }
8480 
8481     if (safe) {
8482         return safe_openat(dirfd, path(pathname), flags, mode);
8483     } else {
8484         return openat(dirfd, path(pathname), flags, mode);
8485     }
8486 }
8487 
8488 
do_openat2(CPUArchState * cpu_env,abi_long dirfd,abi_ptr guest_pathname,abi_ptr guest_open_how,abi_ulong guest_size)8489 static int do_openat2(CPUArchState *cpu_env, abi_long dirfd,
8490                       abi_ptr guest_pathname, abi_ptr guest_open_how,
8491                       abi_ulong guest_size)
8492 {
8493     struct open_how_ver0 how = {0};
8494     char *pathname;
8495     int ret;
8496 
8497     if (guest_size < sizeof(struct target_open_how_ver0)) {
8498         return -TARGET_EINVAL;
8499     }
8500     ret = copy_struct_from_user(&how, sizeof(how), guest_open_how, guest_size);
8501     if (ret) {
8502         if (ret == -TARGET_E2BIG) {
8503             qemu_log_mask(LOG_UNIMP,
8504                           "Unimplemented openat2 open_how size: "
8505                           TARGET_ABI_FMT_lu "\n", guest_size);
8506         }
8507         return ret;
8508     }
8509     pathname = lock_user_string(guest_pathname);
8510     if (!pathname) {
8511         return -TARGET_EFAULT;
8512     }
8513 
8514     how.flags = target_to_host_bitmask(tswap64(how.flags), fcntl_flags_tbl);
8515     how.mode = tswap64(how.mode);
8516     how.resolve = tswap64(how.resolve);
8517     int fd = maybe_do_fake_open(cpu_env, dirfd, pathname, how.flags, how.mode,
8518                                 how.resolve, true);
8519     if (fd > -2) {
8520         ret = get_errno(fd);
8521     } else {
8522         ret = get_errno(safe_openat2(dirfd, pathname, &how,
8523                                      sizeof(struct open_how_ver0)));
8524     }
8525 
8526     fd_trans_unregister(ret);
8527     unlock_user(pathname, guest_pathname, 0);
8528     return ret;
8529 }
8530 
do_guest_readlink(const char * pathname,char * buf,size_t bufsiz)8531 ssize_t do_guest_readlink(const char *pathname, char *buf, size_t bufsiz)
8532 {
8533     ssize_t ret;
8534 
8535     if (!pathname || !buf) {
8536         errno = EFAULT;
8537         return -1;
8538     }
8539 
8540     if (!bufsiz) {
8541         /* Short circuit this for the magic exe check. */
8542         errno = EINVAL;
8543         return -1;
8544     }
8545 
8546     if (is_proc_myself((const char *)pathname, "exe")) {
8547         /*
8548          * Don't worry about sign mismatch as earlier mapping
8549          * logic would have thrown a bad address error.
8550          */
8551         ret = MIN(strlen(exec_path), bufsiz);
8552         /* We cannot NUL terminate the string. */
8553         memcpy(buf, exec_path, ret);
8554     } else {
8555         ret = readlink(path(pathname), buf, bufsiz);
8556     }
8557 
8558     return ret;
8559 }
8560 
do_execv(CPUArchState * cpu_env,int dirfd,abi_long pathname,abi_long guest_argp,abi_long guest_envp,int flags,bool is_execveat)8561 static int do_execv(CPUArchState *cpu_env, int dirfd,
8562                     abi_long pathname, abi_long guest_argp,
8563                     abi_long guest_envp, int flags, bool is_execveat)
8564 {
8565     int ret;
8566     char **argp, **envp;
8567     int argc, envc;
8568     abi_ulong gp;
8569     abi_ulong addr;
8570     char **q;
8571     void *p;
8572 
8573     argc = 0;
8574 
8575     for (gp = guest_argp; gp; gp += sizeof(abi_ulong)) {
8576         if (get_user_ual(addr, gp)) {
8577             return -TARGET_EFAULT;
8578         }
8579         if (!addr) {
8580             break;
8581         }
8582         argc++;
8583     }
8584     envc = 0;
8585     for (gp = guest_envp; gp; gp += sizeof(abi_ulong)) {
8586         if (get_user_ual(addr, gp)) {
8587             return -TARGET_EFAULT;
8588         }
8589         if (!addr) {
8590             break;
8591         }
8592         envc++;
8593     }
8594 
8595     argp = g_new0(char *, argc + 1);
8596     envp = g_new0(char *, envc + 1);
8597 
8598     for (gp = guest_argp, q = argp; gp; gp += sizeof(abi_ulong), q++) {
8599         if (get_user_ual(addr, gp)) {
8600             goto execve_efault;
8601         }
8602         if (!addr) {
8603             break;
8604         }
8605         *q = lock_user_string(addr);
8606         if (!*q) {
8607             goto execve_efault;
8608         }
8609     }
8610     *q = NULL;
8611 
8612     for (gp = guest_envp, q = envp; gp; gp += sizeof(abi_ulong), q++) {
8613         if (get_user_ual(addr, gp)) {
8614             goto execve_efault;
8615         }
8616         if (!addr) {
8617             break;
8618         }
8619         *q = lock_user_string(addr);
8620         if (!*q) {
8621             goto execve_efault;
8622         }
8623     }
8624     *q = NULL;
8625 
8626     /*
8627      * Although execve() is not an interruptible syscall it is
8628      * a special case where we must use the safe_syscall wrapper:
8629      * if we allow a signal to happen before we make the host
8630      * syscall then we will 'lose' it, because at the point of
8631      * execve the process leaves QEMU's control. So we use the
8632      * safe syscall wrapper to ensure that we either take the
8633      * signal as a guest signal, or else it does not happen
8634      * before the execve completes and makes it the other
8635      * program's problem.
8636      */
8637     p = lock_user_string(pathname);
8638     if (!p) {
8639         goto execve_efault;
8640     }
8641 
8642     const char *exe = p;
8643     if (is_proc_myself(p, "exe")) {
8644         exe = exec_path;
8645     }
8646     ret = is_execveat
8647         ? safe_execveat(dirfd, exe, argp, envp, flags)
8648         : safe_execve(exe, argp, envp);
8649     ret = get_errno(ret);
8650 
8651     unlock_user(p, pathname, 0);
8652 
8653     goto execve_end;
8654 
8655 execve_efault:
8656     ret = -TARGET_EFAULT;
8657 
8658 execve_end:
8659     for (gp = guest_argp, q = argp; *q; gp += sizeof(abi_ulong), q++) {
8660         if (get_user_ual(addr, gp) || !addr) {
8661             break;
8662         }
8663         unlock_user(*q, addr, 0);
8664     }
8665     for (gp = guest_envp, q = envp; *q; gp += sizeof(abi_ulong), q++) {
8666         if (get_user_ual(addr, gp) || !addr) {
8667             break;
8668         }
8669         unlock_user(*q, addr, 0);
8670     }
8671 
8672     g_free(argp);
8673     g_free(envp);
8674     return ret;
8675 }
8676 
8677 #define TIMER_MAGIC 0x0caf0000
8678 #define TIMER_MAGIC_MASK 0xffff0000
8679 
8680 /* Convert QEMU provided timer ID back to internal 16bit index format */
get_timer_id(abi_long arg)8681 static target_timer_t get_timer_id(abi_long arg)
8682 {
8683     target_timer_t timerid = arg;
8684 
8685     if ((timerid & TIMER_MAGIC_MASK) != TIMER_MAGIC) {
8686         return -TARGET_EINVAL;
8687     }
8688 
8689     timerid &= 0xffff;
8690 
8691     if (timerid >= ARRAY_SIZE(g_posix_timers)) {
8692         return -TARGET_EINVAL;
8693     }
8694 
8695     return timerid;
8696 }
8697 
target_to_host_cpu_mask(unsigned long * host_mask,size_t host_size,abi_ulong target_addr,size_t target_size)8698 static int target_to_host_cpu_mask(unsigned long *host_mask,
8699                                    size_t host_size,
8700                                    abi_ulong target_addr,
8701                                    size_t target_size)
8702 {
8703     unsigned target_bits = sizeof(abi_ulong) * 8;
8704     unsigned host_bits = sizeof(*host_mask) * 8;
8705     abi_ulong *target_mask;
8706     unsigned i, j;
8707 
8708     assert(host_size >= target_size);
8709 
8710     target_mask = lock_user(VERIFY_READ, target_addr, target_size, 1);
8711     if (!target_mask) {
8712         return -TARGET_EFAULT;
8713     }
8714     memset(host_mask, 0, host_size);
8715 
8716     for (i = 0 ; i < target_size / sizeof(abi_ulong); i++) {
8717         unsigned bit = i * target_bits;
8718         abi_ulong val;
8719 
8720         __get_user(val, &target_mask[i]);
8721         for (j = 0; j < target_bits; j++, bit++) {
8722             if (val & (1UL << j)) {
8723                 host_mask[bit / host_bits] |= 1UL << (bit % host_bits);
8724             }
8725         }
8726     }
8727 
8728     unlock_user(target_mask, target_addr, 0);
8729     return 0;
8730 }
8731 
host_to_target_cpu_mask(const unsigned long * host_mask,size_t host_size,abi_ulong target_addr,size_t target_size)8732 static int host_to_target_cpu_mask(const unsigned long *host_mask,
8733                                    size_t host_size,
8734                                    abi_ulong target_addr,
8735                                    size_t target_size)
8736 {
8737     unsigned target_bits = sizeof(abi_ulong) * 8;
8738     unsigned host_bits = sizeof(*host_mask) * 8;
8739     abi_ulong *target_mask;
8740     unsigned i, j;
8741 
8742     assert(host_size >= target_size);
8743 
8744     target_mask = lock_user(VERIFY_WRITE, target_addr, target_size, 0);
8745     if (!target_mask) {
8746         return -TARGET_EFAULT;
8747     }
8748 
8749     for (i = 0 ; i < target_size / sizeof(abi_ulong); i++) {
8750         unsigned bit = i * target_bits;
8751         abi_ulong val = 0;
8752 
8753         for (j = 0; j < target_bits; j++, bit++) {
8754             if (host_mask[bit / host_bits] & (1UL << (bit % host_bits))) {
8755                 val |= 1UL << j;
8756             }
8757         }
8758         __put_user(val, &target_mask[i]);
8759     }
8760 
8761     unlock_user(target_mask, target_addr, target_size);
8762     return 0;
8763 }
8764 
8765 #ifdef TARGET_NR_getdents
do_getdents(abi_long dirfd,abi_long arg2,abi_long count)8766 static int do_getdents(abi_long dirfd, abi_long arg2, abi_long count)
8767 {
8768     g_autofree void *hdirp = NULL;
8769     void *tdirp;
8770     int hlen, hoff, toff;
8771     int hreclen, treclen;
8772     off_t prev_diroff = 0;
8773 
8774     hdirp = g_try_malloc(count);
8775     if (!hdirp) {
8776         return -TARGET_ENOMEM;
8777     }
8778 
8779 #ifdef EMULATE_GETDENTS_WITH_GETDENTS
8780     hlen = sys_getdents(dirfd, hdirp, count);
8781 #else
8782     hlen = sys_getdents64(dirfd, hdirp, count);
8783 #endif
8784 
8785     hlen = get_errno(hlen);
8786     if (is_error(hlen)) {
8787         return hlen;
8788     }
8789 
8790     tdirp = lock_user(VERIFY_WRITE, arg2, count, 0);
8791     if (!tdirp) {
8792         return -TARGET_EFAULT;
8793     }
8794 
8795     for (hoff = toff = 0; hoff < hlen; hoff += hreclen, toff += treclen) {
8796 #ifdef EMULATE_GETDENTS_WITH_GETDENTS
8797         struct linux_dirent *hde = hdirp + hoff;
8798 #else
8799         struct linux_dirent64 *hde = hdirp + hoff;
8800 #endif
8801         struct target_dirent *tde = tdirp + toff;
8802         int namelen;
8803         uint8_t type;
8804 
8805         namelen = strlen(hde->d_name);
8806         hreclen = hde->d_reclen;
8807         treclen = offsetof(struct target_dirent, d_name) + namelen + 2;
8808         treclen = QEMU_ALIGN_UP(treclen, __alignof(struct target_dirent));
8809 
8810         if (toff + treclen > count) {
8811             /*
8812              * If the host struct is smaller than the target struct, or
8813              * requires less alignment and thus packs into less space,
8814              * then the host can return more entries than we can pass
8815              * on to the guest.
8816              */
8817             if (toff == 0) {
8818                 toff = -TARGET_EINVAL; /* result buffer is too small */
8819                 break;
8820             }
8821             /*
8822              * Return what we have, resetting the file pointer to the
8823              * location of the first record not returned.
8824              */
8825             lseek(dirfd, prev_diroff, SEEK_SET);
8826             break;
8827         }
8828 
8829         prev_diroff = hde->d_off;
8830         tde->d_ino = tswapal(hde->d_ino);
8831         tde->d_off = tswapal(hde->d_off);
8832         tde->d_reclen = tswap16(treclen);
8833         memcpy(tde->d_name, hde->d_name, namelen + 1);
8834 
8835         /*
8836          * The getdents type is in what was formerly a padding byte at the
8837          * end of the structure.
8838          */
8839 #ifdef EMULATE_GETDENTS_WITH_GETDENTS
8840         type = *((uint8_t *)hde + hreclen - 1);
8841 #else
8842         type = hde->d_type;
8843 #endif
8844         *((uint8_t *)tde + treclen - 1) = type;
8845     }
8846 
8847     unlock_user(tdirp, arg2, toff);
8848     return toff;
8849 }
8850 #endif /* TARGET_NR_getdents */
8851 
8852 #if defined(TARGET_NR_getdents64) && defined(__NR_getdents64)
do_getdents64(abi_long dirfd,abi_long arg2,abi_long count)8853 static int do_getdents64(abi_long dirfd, abi_long arg2, abi_long count)
8854 {
8855     g_autofree void *hdirp = NULL;
8856     void *tdirp;
8857     int hlen, hoff, toff;
8858     int hreclen, treclen;
8859     off_t prev_diroff = 0;
8860 
8861     hdirp = g_try_malloc(count);
8862     if (!hdirp) {
8863         return -TARGET_ENOMEM;
8864     }
8865 
8866     hlen = get_errno(sys_getdents64(dirfd, hdirp, count));
8867     if (is_error(hlen)) {
8868         return hlen;
8869     }
8870 
8871     tdirp = lock_user(VERIFY_WRITE, arg2, count, 0);
8872     if (!tdirp) {
8873         return -TARGET_EFAULT;
8874     }
8875 
8876     for (hoff = toff = 0; hoff < hlen; hoff += hreclen, toff += treclen) {
8877         struct linux_dirent64 *hde = hdirp + hoff;
8878         struct target_dirent64 *tde = tdirp + toff;
8879         int namelen;
8880 
8881         namelen = strlen(hde->d_name) + 1;
8882         hreclen = hde->d_reclen;
8883         treclen = offsetof(struct target_dirent64, d_name) + namelen;
8884         treclen = QEMU_ALIGN_UP(treclen, __alignof(struct target_dirent64));
8885 
8886         if (toff + treclen > count) {
8887             /*
8888              * If the host struct is smaller than the target struct, or
8889              * requires less alignment and thus packs into less space,
8890              * then the host can return more entries than we can pass
8891              * on to the guest.
8892              */
8893             if (toff == 0) {
8894                 toff = -TARGET_EINVAL; /* result buffer is too small */
8895                 break;
8896             }
8897             /*
8898              * Return what we have, resetting the file pointer to the
8899              * location of the first record not returned.
8900              */
8901             lseek(dirfd, prev_diroff, SEEK_SET);
8902             break;
8903         }
8904 
8905         prev_diroff = hde->d_off;
8906         tde->d_ino = tswap64(hde->d_ino);
8907         tde->d_off = tswap64(hde->d_off);
8908         tde->d_reclen = tswap16(treclen);
8909         tde->d_type = hde->d_type;
8910         memcpy(tde->d_name, hde->d_name, namelen);
8911     }
8912 
8913     unlock_user(tdirp, arg2, toff);
8914     return toff;
8915 }
8916 #endif /* TARGET_NR_getdents64 */
8917 
8918 #if defined(TARGET_NR_riscv_hwprobe)
8919 
8920 #define RISCV_HWPROBE_KEY_MVENDORID     0
8921 #define RISCV_HWPROBE_KEY_MARCHID       1
8922 #define RISCV_HWPROBE_KEY_MIMPID        2
8923 
8924 #define RISCV_HWPROBE_KEY_BASE_BEHAVIOR 3
8925 #define     RISCV_HWPROBE_BASE_BEHAVIOR_IMA (1 << 0)
8926 
8927 #define RISCV_HWPROBE_KEY_IMA_EXT_0         4
8928 #define     RISCV_HWPROBE_IMA_FD            (1 << 0)
8929 #define     RISCV_HWPROBE_IMA_C             (1 << 1)
8930 #define     RISCV_HWPROBE_IMA_V             (1 << 2)
8931 #define     RISCV_HWPROBE_EXT_ZBA           (1 << 3)
8932 #define     RISCV_HWPROBE_EXT_ZBB           (1 << 4)
8933 #define     RISCV_HWPROBE_EXT_ZBS           (1 << 5)
8934 #define     RISCV_HWPROBE_EXT_ZICBOZ        (1 << 6)
8935 #define     RISCV_HWPROBE_EXT_ZBC           (1 << 7)
8936 #define     RISCV_HWPROBE_EXT_ZBKB          (1 << 8)
8937 #define     RISCV_HWPROBE_EXT_ZBKC          (1 << 9)
8938 #define     RISCV_HWPROBE_EXT_ZBKX          (1 << 10)
8939 #define     RISCV_HWPROBE_EXT_ZKND          (1 << 11)
8940 #define     RISCV_HWPROBE_EXT_ZKNE          (1 << 12)
8941 #define     RISCV_HWPROBE_EXT_ZKNH          (1 << 13)
8942 #define     RISCV_HWPROBE_EXT_ZKSED         (1 << 14)
8943 #define     RISCV_HWPROBE_EXT_ZKSH          (1 << 15)
8944 #define     RISCV_HWPROBE_EXT_ZKT           (1 << 16)
8945 #define     RISCV_HWPROBE_EXT_ZVBB          (1 << 17)
8946 #define     RISCV_HWPROBE_EXT_ZVBC          (1 << 18)
8947 #define     RISCV_HWPROBE_EXT_ZVKB          (1 << 19)
8948 #define     RISCV_HWPROBE_EXT_ZVKG          (1 << 20)
8949 #define     RISCV_HWPROBE_EXT_ZVKNED        (1 << 21)
8950 #define     RISCV_HWPROBE_EXT_ZVKNHA        (1 << 22)
8951 #define     RISCV_HWPROBE_EXT_ZVKNHB        (1 << 23)
8952 #define     RISCV_HWPROBE_EXT_ZVKSED        (1 << 24)
8953 #define     RISCV_HWPROBE_EXT_ZVKSH         (1 << 25)
8954 #define     RISCV_HWPROBE_EXT_ZVKT          (1 << 26)
8955 #define     RISCV_HWPROBE_EXT_ZFH           (1 << 27)
8956 #define     RISCV_HWPROBE_EXT_ZFHMIN        (1 << 28)
8957 #define     RISCV_HWPROBE_EXT_ZIHINTNTL     (1 << 29)
8958 #define     RISCV_HWPROBE_EXT_ZVFH          (1 << 30)
8959 #define     RISCV_HWPROBE_EXT_ZVFHMIN       (1ULL << 31)
8960 #define     RISCV_HWPROBE_EXT_ZFA           (1ULL << 32)
8961 #define     RISCV_HWPROBE_EXT_ZTSO          (1ULL << 33)
8962 #define     RISCV_HWPROBE_EXT_ZACAS         (1ULL << 34)
8963 #define     RISCV_HWPROBE_EXT_ZICOND        (1ULL << 35)
8964 
8965 #define RISCV_HWPROBE_KEY_CPUPERF_0     5
8966 #define     RISCV_HWPROBE_MISALIGNED_UNKNOWN     (0 << 0)
8967 #define     RISCV_HWPROBE_MISALIGNED_EMULATED    (1 << 0)
8968 #define     RISCV_HWPROBE_MISALIGNED_SLOW        (2 << 0)
8969 #define     RISCV_HWPROBE_MISALIGNED_FAST        (3 << 0)
8970 #define     RISCV_HWPROBE_MISALIGNED_UNSUPPORTED (4 << 0)
8971 #define     RISCV_HWPROBE_MISALIGNED_MASK        (7 << 0)
8972 
8973 #define RISCV_HWPROBE_KEY_ZICBOZ_BLOCK_SIZE 6
8974 
8975 struct riscv_hwprobe {
8976     abi_llong  key;
8977     abi_ullong value;
8978 };
8979 
risc_hwprobe_fill_pairs(CPURISCVState * env,struct riscv_hwprobe * pair,size_t pair_count)8980 static void risc_hwprobe_fill_pairs(CPURISCVState *env,
8981                                     struct riscv_hwprobe *pair,
8982                                     size_t pair_count)
8983 {
8984     const RISCVCPUConfig *cfg = riscv_cpu_cfg(env);
8985 
8986     for (; pair_count > 0; pair_count--, pair++) {
8987         abi_llong key;
8988         abi_ullong value;
8989         __put_user(0, &pair->value);
8990         __get_user(key, &pair->key);
8991         switch (key) {
8992         case RISCV_HWPROBE_KEY_MVENDORID:
8993             __put_user(cfg->mvendorid, &pair->value);
8994             break;
8995         case RISCV_HWPROBE_KEY_MARCHID:
8996             __put_user(cfg->marchid, &pair->value);
8997             break;
8998         case RISCV_HWPROBE_KEY_MIMPID:
8999             __put_user(cfg->mimpid, &pair->value);
9000             break;
9001         case RISCV_HWPROBE_KEY_BASE_BEHAVIOR:
9002             value = riscv_has_ext(env, RVI) &&
9003                     riscv_has_ext(env, RVM) &&
9004                     riscv_has_ext(env, RVA) ?
9005                     RISCV_HWPROBE_BASE_BEHAVIOR_IMA : 0;
9006             __put_user(value, &pair->value);
9007             break;
9008         case RISCV_HWPROBE_KEY_IMA_EXT_0:
9009             value = riscv_has_ext(env, RVF) &&
9010                     riscv_has_ext(env, RVD) ?
9011                     RISCV_HWPROBE_IMA_FD : 0;
9012             value |= riscv_has_ext(env, RVC) ?
9013                      RISCV_HWPROBE_IMA_C : 0;
9014             value |= riscv_has_ext(env, RVV) ?
9015                      RISCV_HWPROBE_IMA_V : 0;
9016             value |= cfg->ext_zba ?
9017                      RISCV_HWPROBE_EXT_ZBA : 0;
9018             value |= cfg->ext_zbb ?
9019                      RISCV_HWPROBE_EXT_ZBB : 0;
9020             value |= cfg->ext_zbs ?
9021                      RISCV_HWPROBE_EXT_ZBS : 0;
9022             value |= cfg->ext_zicboz ?
9023                      RISCV_HWPROBE_EXT_ZICBOZ : 0;
9024             value |= cfg->ext_zbc ?
9025                      RISCV_HWPROBE_EXT_ZBC : 0;
9026             value |= cfg->ext_zbkb ?
9027                      RISCV_HWPROBE_EXT_ZBKB : 0;
9028             value |= cfg->ext_zbkc ?
9029                      RISCV_HWPROBE_EXT_ZBKC : 0;
9030             value |= cfg->ext_zbkx ?
9031                      RISCV_HWPROBE_EXT_ZBKX : 0;
9032             value |= cfg->ext_zknd ?
9033                      RISCV_HWPROBE_EXT_ZKND : 0;
9034             value |= cfg->ext_zkne ?
9035                      RISCV_HWPROBE_EXT_ZKNE : 0;
9036             value |= cfg->ext_zknh ?
9037                      RISCV_HWPROBE_EXT_ZKNH : 0;
9038             value |= cfg->ext_zksed ?
9039                      RISCV_HWPROBE_EXT_ZKSED : 0;
9040             value |= cfg->ext_zksh ?
9041                      RISCV_HWPROBE_EXT_ZKSH : 0;
9042             value |= cfg->ext_zkt ?
9043                      RISCV_HWPROBE_EXT_ZKT : 0;
9044             value |= cfg->ext_zvbb ?
9045                      RISCV_HWPROBE_EXT_ZVBB : 0;
9046             value |= cfg->ext_zvbc ?
9047                      RISCV_HWPROBE_EXT_ZVBC : 0;
9048             value |= cfg->ext_zvkb ?
9049                      RISCV_HWPROBE_EXT_ZVKB : 0;
9050             value |= cfg->ext_zvkg ?
9051                      RISCV_HWPROBE_EXT_ZVKG : 0;
9052             value |= cfg->ext_zvkned ?
9053                      RISCV_HWPROBE_EXT_ZVKNED : 0;
9054             value |= cfg->ext_zvknha ?
9055                      RISCV_HWPROBE_EXT_ZVKNHA : 0;
9056             value |= cfg->ext_zvknhb ?
9057                      RISCV_HWPROBE_EXT_ZVKNHB : 0;
9058             value |= cfg->ext_zvksed ?
9059                      RISCV_HWPROBE_EXT_ZVKSED : 0;
9060             value |= cfg->ext_zvksh ?
9061                      RISCV_HWPROBE_EXT_ZVKSH : 0;
9062             value |= cfg->ext_zvkt ?
9063                      RISCV_HWPROBE_EXT_ZVKT : 0;
9064             value |= cfg->ext_zfh ?
9065                      RISCV_HWPROBE_EXT_ZFH : 0;
9066             value |= cfg->ext_zfhmin ?
9067                      RISCV_HWPROBE_EXT_ZFHMIN : 0;
9068             value |= cfg->ext_zihintntl ?
9069                      RISCV_HWPROBE_EXT_ZIHINTNTL : 0;
9070             value |= cfg->ext_zvfh ?
9071                      RISCV_HWPROBE_EXT_ZVFH : 0;
9072             value |= cfg->ext_zvfhmin ?
9073                      RISCV_HWPROBE_EXT_ZVFHMIN : 0;
9074             value |= cfg->ext_zfa ?
9075                      RISCV_HWPROBE_EXT_ZFA : 0;
9076             value |= cfg->ext_ztso ?
9077                      RISCV_HWPROBE_EXT_ZTSO : 0;
9078             value |= cfg->ext_zacas ?
9079                      RISCV_HWPROBE_EXT_ZACAS : 0;
9080             value |= cfg->ext_zicond ?
9081                      RISCV_HWPROBE_EXT_ZICOND : 0;
9082             __put_user(value, &pair->value);
9083             break;
9084         case RISCV_HWPROBE_KEY_CPUPERF_0:
9085             __put_user(RISCV_HWPROBE_MISALIGNED_FAST, &pair->value);
9086             break;
9087         case RISCV_HWPROBE_KEY_ZICBOZ_BLOCK_SIZE:
9088             value = cfg->ext_zicboz ? cfg->cboz_blocksize : 0;
9089             __put_user(value, &pair->value);
9090             break;
9091         default:
9092             __put_user(-1, &pair->key);
9093             break;
9094         }
9095     }
9096 }
9097 
cpu_set_valid(abi_long arg3,abi_long arg4)9098 static int cpu_set_valid(abi_long arg3, abi_long arg4)
9099 {
9100     int ret, i, tmp;
9101     size_t host_mask_size, target_mask_size;
9102     unsigned long *host_mask;
9103 
9104     /*
9105      * cpu_set_t represent CPU masks as bit masks of type unsigned long *.
9106      * arg3 contains the cpu count.
9107      */
9108     tmp = (8 * sizeof(abi_ulong));
9109     target_mask_size = ((arg3 + tmp - 1) / tmp) * sizeof(abi_ulong);
9110     host_mask_size = (target_mask_size + (sizeof(*host_mask) - 1)) &
9111                      ~(sizeof(*host_mask) - 1);
9112 
9113     host_mask = alloca(host_mask_size);
9114 
9115     ret = target_to_host_cpu_mask(host_mask, host_mask_size,
9116                                   arg4, target_mask_size);
9117     if (ret != 0) {
9118         return ret;
9119     }
9120 
9121     for (i = 0 ; i < host_mask_size / sizeof(*host_mask); i++) {
9122         if (host_mask[i] != 0) {
9123             return 0;
9124         }
9125     }
9126     return -TARGET_EINVAL;
9127 }
9128 
do_riscv_hwprobe(CPUArchState * cpu_env,abi_long arg1,abi_long arg2,abi_long arg3,abi_long arg4,abi_long arg5)9129 static abi_long do_riscv_hwprobe(CPUArchState *cpu_env, abi_long arg1,
9130                                  abi_long arg2, abi_long arg3,
9131                                  abi_long arg4, abi_long arg5)
9132 {
9133     int ret;
9134     struct riscv_hwprobe *host_pairs;
9135 
9136     /* flags must be 0 */
9137     if (arg5 != 0) {
9138         return -TARGET_EINVAL;
9139     }
9140 
9141     /* check cpu_set */
9142     if (arg3 != 0) {
9143         ret = cpu_set_valid(arg3, arg4);
9144         if (ret != 0) {
9145             return ret;
9146         }
9147     } else if (arg4 != 0) {
9148         return -TARGET_EINVAL;
9149     }
9150 
9151     /* no pairs */
9152     if (arg2 == 0) {
9153         return 0;
9154     }
9155 
9156     host_pairs = lock_user(VERIFY_WRITE, arg1,
9157                            sizeof(*host_pairs) * (size_t)arg2, 0);
9158     if (host_pairs == NULL) {
9159         return -TARGET_EFAULT;
9160     }
9161     risc_hwprobe_fill_pairs(cpu_env, host_pairs, arg2);
9162     unlock_user(host_pairs, arg1, sizeof(*host_pairs) * (size_t)arg2);
9163     return 0;
9164 }
9165 #endif /* TARGET_NR_riscv_hwprobe */
9166 
9167 #if defined(TARGET_NR_pivot_root) && defined(__NR_pivot_root)
_syscall2(int,pivot_root,const char *,new_root,const char *,put_old)9168 _syscall2(int, pivot_root, const char *, new_root, const char *, put_old)
9169 #endif
9170 
9171 #if defined(TARGET_NR_open_tree) && defined(__NR_open_tree)
9172 #define __NR_sys_open_tree __NR_open_tree
9173 _syscall3(int, sys_open_tree, int, __dfd, const char *, __filename,
9174           unsigned int, __flags)
9175 #endif
9176 
9177 #if defined(TARGET_NR_move_mount) && defined(__NR_move_mount)
9178 #define __NR_sys_move_mount __NR_move_mount
9179 _syscall5(int, sys_move_mount, int, __from_dfd, const char *, __from_pathname,
9180            int, __to_dfd, const char *, __to_pathname, unsigned int, flag)
9181 #endif
9182 
9183 /* This is an internal helper for do_syscall so that it is easier
9184  * to have a single return point, so that actions, such as logging
9185  * of syscall results, can be performed.
9186  * All errnos that do_syscall() returns must be -TARGET_<errcode>.
9187  */
9188 static abi_long do_syscall1(CPUArchState *cpu_env, int num, abi_long arg1,
9189                             abi_long arg2, abi_long arg3, abi_long arg4,
9190                             abi_long arg5, abi_long arg6, abi_long arg7,
9191                             abi_long arg8)
9192 {
9193     CPUState *cpu = env_cpu(cpu_env);
9194     abi_long ret;
9195 #if defined(TARGET_NR_stat) || defined(TARGET_NR_stat64) \
9196     || defined(TARGET_NR_lstat) || defined(TARGET_NR_lstat64) \
9197     || defined(TARGET_NR_fstat) || defined(TARGET_NR_fstat64) \
9198     || defined(TARGET_NR_statx)
9199     struct stat st;
9200 #endif
9201 #if defined(TARGET_NR_statfs) || defined(TARGET_NR_statfs64) \
9202     || defined(TARGET_NR_fstatfs)
9203     struct statfs stfs;
9204 #endif
9205     void *p;
9206 
9207     switch(num) {
9208     case TARGET_NR_exit:
9209         /* In old applications this may be used to implement _exit(2).
9210            However in threaded applications it is used for thread termination,
9211            and _exit_group is used for application termination.
9212            Do thread termination if we have more then one thread.  */
9213 
9214         if (block_signals()) {
9215             return -QEMU_ERESTARTSYS;
9216         }
9217 
9218         pthread_mutex_lock(&clone_lock);
9219 
9220         if (CPU_NEXT(first_cpu)) {
9221             TaskState *ts = get_task_state(cpu);
9222 
9223             if (ts->child_tidptr) {
9224                 put_user_u32(0, ts->child_tidptr);
9225                 do_sys_futex(g2h(cpu, ts->child_tidptr),
9226                              FUTEX_WAKE, INT_MAX, NULL, NULL, 0);
9227             }
9228 
9229             object_unparent(OBJECT(cpu));
9230             object_unref(OBJECT(cpu));
9231             /*
9232              * At this point the CPU should be unrealized and removed
9233              * from cpu lists. We can clean-up the rest of the thread
9234              * data without the lock held.
9235              */
9236 
9237             pthread_mutex_unlock(&clone_lock);
9238 
9239             thread_cpu = NULL;
9240             g_free(ts);
9241             rcu_unregister_thread();
9242             pthread_exit(NULL);
9243         }
9244 
9245         pthread_mutex_unlock(&clone_lock);
9246         preexit_cleanup(cpu_env, arg1);
9247         _exit(arg1);
9248         return 0; /* avoid warning */
9249     case TARGET_NR_read:
9250         if (arg2 == 0 && arg3 == 0) {
9251             return get_errno(safe_read(arg1, 0, 0));
9252         } else {
9253             if (!(p = lock_user(VERIFY_WRITE, arg2, arg3, 0)))
9254                 return -TARGET_EFAULT;
9255             ret = get_errno(safe_read(arg1, p, arg3));
9256             if (ret >= 0 &&
9257                 fd_trans_host_to_target_data(arg1)) {
9258                 ret = fd_trans_host_to_target_data(arg1)(p, ret);
9259             }
9260             unlock_user(p, arg2, ret);
9261         }
9262         return ret;
9263     case TARGET_NR_write:
9264         if (arg2 == 0 && arg3 == 0) {
9265             return get_errno(safe_write(arg1, 0, 0));
9266         }
9267         if (!(p = lock_user(VERIFY_READ, arg2, arg3, 1)))
9268             return -TARGET_EFAULT;
9269         if (fd_trans_target_to_host_data(arg1)) {
9270             void *copy = g_malloc(arg3);
9271             memcpy(copy, p, arg3);
9272             ret = fd_trans_target_to_host_data(arg1)(copy, arg3);
9273             if (ret >= 0) {
9274                 ret = get_errno(safe_write(arg1, copy, ret));
9275             }
9276             g_free(copy);
9277         } else {
9278             ret = get_errno(safe_write(arg1, p, arg3));
9279         }
9280         unlock_user(p, arg2, 0);
9281         return ret;
9282 
9283 #ifdef TARGET_NR_open
9284     case TARGET_NR_open:
9285         if (!(p = lock_user_string(arg1)))
9286             return -TARGET_EFAULT;
9287         ret = get_errno(do_guest_openat(cpu_env, AT_FDCWD, p,
9288                                   target_to_host_bitmask(arg2, fcntl_flags_tbl),
9289                                   arg3, true));
9290         fd_trans_unregister(ret);
9291         unlock_user(p, arg1, 0);
9292         return ret;
9293 #endif
9294     case TARGET_NR_openat:
9295         if (!(p = lock_user_string(arg2)))
9296             return -TARGET_EFAULT;
9297         ret = get_errno(do_guest_openat(cpu_env, arg1, p,
9298                                   target_to_host_bitmask(arg3, fcntl_flags_tbl),
9299                                   arg4, true));
9300         fd_trans_unregister(ret);
9301         unlock_user(p, arg2, 0);
9302         return ret;
9303     case TARGET_NR_openat2:
9304         ret = do_openat2(cpu_env, arg1, arg2, arg3, arg4);
9305         return ret;
9306 #if defined(TARGET_NR_name_to_handle_at) && defined(CONFIG_OPEN_BY_HANDLE)
9307     case TARGET_NR_name_to_handle_at:
9308         ret = do_name_to_handle_at(arg1, arg2, arg3, arg4, arg5);
9309         return ret;
9310 #endif
9311 #if defined(TARGET_NR_open_by_handle_at) && defined(CONFIG_OPEN_BY_HANDLE)
9312     case TARGET_NR_open_by_handle_at:
9313         ret = do_open_by_handle_at(arg1, arg2, arg3);
9314         fd_trans_unregister(ret);
9315         return ret;
9316 #endif
9317 #if defined(__NR_pidfd_open) && defined(TARGET_NR_pidfd_open)
9318     case TARGET_NR_pidfd_open:
9319         return get_errno(pidfd_open(arg1, arg2));
9320 #endif
9321 #if defined(__NR_pidfd_send_signal) && defined(TARGET_NR_pidfd_send_signal)
9322     case TARGET_NR_pidfd_send_signal:
9323         {
9324             siginfo_t uinfo, *puinfo;
9325 
9326             if (arg3) {
9327                 p = lock_user(VERIFY_READ, arg3, sizeof(target_siginfo_t), 1);
9328                 if (!p) {
9329                     return -TARGET_EFAULT;
9330                  }
9331                  target_to_host_siginfo(&uinfo, p);
9332                  unlock_user(p, arg3, 0);
9333                  puinfo = &uinfo;
9334             } else {
9335                  puinfo = NULL;
9336             }
9337             ret = get_errno(pidfd_send_signal(arg1, target_to_host_signal(arg2),
9338                                               puinfo, arg4));
9339         }
9340         return ret;
9341 #endif
9342 #if defined(__NR_pidfd_getfd) && defined(TARGET_NR_pidfd_getfd)
9343     case TARGET_NR_pidfd_getfd:
9344         return get_errno(pidfd_getfd(arg1, arg2, arg3));
9345 #endif
9346     case TARGET_NR_close:
9347         fd_trans_unregister(arg1);
9348         return get_errno(close(arg1));
9349 #if defined(__NR_close_range) && defined(TARGET_NR_close_range)
9350     case TARGET_NR_close_range:
9351         ret = get_errno(sys_close_range(arg1, arg2, arg3));
9352         if (ret == 0 && !(arg3 & CLOSE_RANGE_CLOEXEC)) {
9353             abi_long fd, maxfd;
9354             maxfd = MIN(arg2, target_fd_max);
9355             for (fd = arg1; fd < maxfd; fd++) {
9356                 fd_trans_unregister(fd);
9357             }
9358         }
9359         return ret;
9360 #endif
9361 
9362     case TARGET_NR_brk:
9363         return do_brk(arg1);
9364 #ifdef TARGET_NR_fork
9365     case TARGET_NR_fork:
9366         return get_errno(do_fork(cpu_env, TARGET_SIGCHLD, 0, 0, 0, 0));
9367 #endif
9368 #ifdef TARGET_NR_waitpid
9369     case TARGET_NR_waitpid:
9370         {
9371             int status;
9372             ret = get_errno(safe_wait4(arg1, &status, arg3, 0));
9373             if (!is_error(ret) && arg2 && ret
9374                 && put_user_s32(host_to_target_waitstatus(status), arg2))
9375                 return -TARGET_EFAULT;
9376         }
9377         return ret;
9378 #endif
9379 #ifdef TARGET_NR_waitid
9380     case TARGET_NR_waitid:
9381         {
9382             struct rusage ru;
9383             siginfo_t info;
9384 
9385             ret = get_errno(safe_waitid(arg1, arg2, (arg3 ? &info : NULL),
9386                                         arg4, (arg5 ? &ru : NULL)));
9387             if (!is_error(ret)) {
9388                 if (arg3) {
9389                     p = lock_user(VERIFY_WRITE, arg3,
9390                                   sizeof(target_siginfo_t), 0);
9391                     if (!p) {
9392                         return -TARGET_EFAULT;
9393                     }
9394                     host_to_target_siginfo(p, &info);
9395                     unlock_user(p, arg3, sizeof(target_siginfo_t));
9396                 }
9397                 if (arg5 && host_to_target_rusage(arg5, &ru)) {
9398                     return -TARGET_EFAULT;
9399                 }
9400             }
9401         }
9402         return ret;
9403 #endif
9404 #ifdef TARGET_NR_creat /* not on alpha */
9405     case TARGET_NR_creat:
9406         if (!(p = lock_user_string(arg1)))
9407             return -TARGET_EFAULT;
9408         ret = get_errno(creat(p, arg2));
9409         fd_trans_unregister(ret);
9410         unlock_user(p, arg1, 0);
9411         return ret;
9412 #endif
9413 #ifdef TARGET_NR_link
9414     case TARGET_NR_link:
9415         {
9416             void * p2;
9417             p = lock_user_string(arg1);
9418             p2 = lock_user_string(arg2);
9419             if (!p || !p2)
9420                 ret = -TARGET_EFAULT;
9421             else
9422                 ret = get_errno(link(p, p2));
9423             unlock_user(p2, arg2, 0);
9424             unlock_user(p, arg1, 0);
9425         }
9426         return ret;
9427 #endif
9428 #if defined(TARGET_NR_linkat)
9429     case TARGET_NR_linkat:
9430         {
9431             void * p2 = NULL;
9432             if (!arg2 || !arg4)
9433                 return -TARGET_EFAULT;
9434             p  = lock_user_string(arg2);
9435             p2 = lock_user_string(arg4);
9436             if (!p || !p2)
9437                 ret = -TARGET_EFAULT;
9438             else
9439                 ret = get_errno(linkat(arg1, p, arg3, p2, arg5));
9440             unlock_user(p, arg2, 0);
9441             unlock_user(p2, arg4, 0);
9442         }
9443         return ret;
9444 #endif
9445 #ifdef TARGET_NR_unlink
9446     case TARGET_NR_unlink:
9447         if (!(p = lock_user_string(arg1)))
9448             return -TARGET_EFAULT;
9449         ret = get_errno(unlink(p));
9450         unlock_user(p, arg1, 0);
9451         return ret;
9452 #endif
9453 #if defined(TARGET_NR_unlinkat)
9454     case TARGET_NR_unlinkat:
9455         if (!(p = lock_user_string(arg2)))
9456             return -TARGET_EFAULT;
9457         ret = get_errno(unlinkat(arg1, p, arg3));
9458         unlock_user(p, arg2, 0);
9459         return ret;
9460 #endif
9461     case TARGET_NR_execveat:
9462         return do_execv(cpu_env, arg1, arg2, arg3, arg4, arg5, true);
9463     case TARGET_NR_execve:
9464         return do_execv(cpu_env, AT_FDCWD, arg1, arg2, arg3, 0, false);
9465     case TARGET_NR_chdir:
9466         if (!(p = lock_user_string(arg1)))
9467             return -TARGET_EFAULT;
9468         ret = get_errno(chdir(p));
9469         unlock_user(p, arg1, 0);
9470         return ret;
9471 #ifdef TARGET_NR_time
9472     case TARGET_NR_time:
9473         {
9474             time_t host_time;
9475             ret = get_errno(time(&host_time));
9476             if (!is_error(ret)
9477                 && arg1
9478                 && put_user_sal(host_time, arg1))
9479                 return -TARGET_EFAULT;
9480         }
9481         return ret;
9482 #endif
9483 #ifdef TARGET_NR_mknod
9484     case TARGET_NR_mknod:
9485         if (!(p = lock_user_string(arg1)))
9486             return -TARGET_EFAULT;
9487         ret = get_errno(mknod(p, arg2, arg3));
9488         unlock_user(p, arg1, 0);
9489         return ret;
9490 #endif
9491 #if defined(TARGET_NR_mknodat)
9492     case TARGET_NR_mknodat:
9493         if (!(p = lock_user_string(arg2)))
9494             return -TARGET_EFAULT;
9495         ret = get_errno(mknodat(arg1, p, arg3, arg4));
9496         unlock_user(p, arg2, 0);
9497         return ret;
9498 #endif
9499 #ifdef TARGET_NR_chmod
9500     case TARGET_NR_chmod:
9501         if (!(p = lock_user_string(arg1)))
9502             return -TARGET_EFAULT;
9503         ret = get_errno(chmod(p, arg2));
9504         unlock_user(p, arg1, 0);
9505         return ret;
9506 #endif
9507 #ifdef TARGET_NR_lseek
9508     case TARGET_NR_lseek:
9509         return get_errno(lseek(arg1, arg2, arg3));
9510 #endif
9511 #if defined(TARGET_NR_getxpid) && defined(TARGET_ALPHA)
9512     /* Alpha specific */
9513     case TARGET_NR_getxpid:
9514         cpu_env->ir[IR_A4] = getppid();
9515         return get_errno(getpid());
9516 #endif
9517 #ifdef TARGET_NR_getpid
9518     case TARGET_NR_getpid:
9519         return get_errno(getpid());
9520 #endif
9521     case TARGET_NR_mount:
9522         {
9523             /* need to look at the data field */
9524             void *p2, *p3;
9525 
9526             if (arg1) {
9527                 p = lock_user_string(arg1);
9528                 if (!p) {
9529                     return -TARGET_EFAULT;
9530                 }
9531             } else {
9532                 p = NULL;
9533             }
9534 
9535             p2 = lock_user_string(arg2);
9536             if (!p2) {
9537                 if (arg1) {
9538                     unlock_user(p, arg1, 0);
9539                 }
9540                 return -TARGET_EFAULT;
9541             }
9542 
9543             if (arg3) {
9544                 p3 = lock_user_string(arg3);
9545                 if (!p3) {
9546                     if (arg1) {
9547                         unlock_user(p, arg1, 0);
9548                     }
9549                     unlock_user(p2, arg2, 0);
9550                     return -TARGET_EFAULT;
9551                 }
9552             } else {
9553                 p3 = NULL;
9554             }
9555 
9556             /* FIXME - arg5 should be locked, but it isn't clear how to
9557              * do that since it's not guaranteed to be a NULL-terminated
9558              * string.
9559              */
9560             if (!arg5) {
9561                 ret = mount(p, p2, p3, (unsigned long)arg4, NULL);
9562             } else {
9563                 ret = mount(p, p2, p3, (unsigned long)arg4, g2h(cpu, arg5));
9564             }
9565             ret = get_errno(ret);
9566 
9567             if (arg1) {
9568                 unlock_user(p, arg1, 0);
9569             }
9570             unlock_user(p2, arg2, 0);
9571             if (arg3) {
9572                 unlock_user(p3, arg3, 0);
9573             }
9574         }
9575         return ret;
9576 #if defined(TARGET_NR_umount) || defined(TARGET_NR_oldumount)
9577 #if defined(TARGET_NR_umount)
9578     case TARGET_NR_umount:
9579 #endif
9580 #if defined(TARGET_NR_oldumount)
9581     case TARGET_NR_oldumount:
9582 #endif
9583         if (!(p = lock_user_string(arg1)))
9584             return -TARGET_EFAULT;
9585         ret = get_errno(umount(p));
9586         unlock_user(p, arg1, 0);
9587         return ret;
9588 #endif
9589 #if defined(TARGET_NR_move_mount) && defined(__NR_move_mount)
9590     case TARGET_NR_move_mount:
9591         {
9592             void *p2, *p4;
9593 
9594             if (!arg2 || !arg4) {
9595                 return -TARGET_EFAULT;
9596             }
9597 
9598             p2 = lock_user_string(arg2);
9599             if (!p2) {
9600                 return -TARGET_EFAULT;
9601             }
9602 
9603             p4 = lock_user_string(arg4);
9604             if (!p4) {
9605                 unlock_user(p2, arg2, 0);
9606                 return -TARGET_EFAULT;
9607             }
9608             ret = get_errno(sys_move_mount(arg1, p2, arg3, p4, arg5));
9609 
9610             unlock_user(p2, arg2, 0);
9611             unlock_user(p4, arg4, 0);
9612 
9613             return ret;
9614         }
9615 #endif
9616 #if defined(TARGET_NR_open_tree) && defined(__NR_open_tree)
9617     case TARGET_NR_open_tree:
9618         {
9619             void *p2;
9620             int host_flags;
9621 
9622             if (!arg2) {
9623                 return -TARGET_EFAULT;
9624             }
9625 
9626             p2 = lock_user_string(arg2);
9627             if (!p2) {
9628                 return -TARGET_EFAULT;
9629             }
9630 
9631             host_flags = arg3 & ~TARGET_O_CLOEXEC;
9632             if (arg3 & TARGET_O_CLOEXEC) {
9633                 host_flags |= O_CLOEXEC;
9634             }
9635 
9636             ret = get_errno(sys_open_tree(arg1, p2, host_flags));
9637 
9638             unlock_user(p2, arg2, 0);
9639 
9640             return ret;
9641         }
9642 #endif
9643 #ifdef TARGET_NR_stime /* not on alpha */
9644     case TARGET_NR_stime:
9645         {
9646             struct timespec ts;
9647             ts.tv_nsec = 0;
9648             if (get_user_sal(ts.tv_sec, arg1)) {
9649                 return -TARGET_EFAULT;
9650             }
9651             return get_errno(clock_settime(CLOCK_REALTIME, &ts));
9652         }
9653 #endif
9654 #ifdef TARGET_NR_alarm /* not on alpha */
9655     case TARGET_NR_alarm:
9656         return alarm(arg1);
9657 #endif
9658 #ifdef TARGET_NR_pause /* not on alpha */
9659     case TARGET_NR_pause:
9660         if (!block_signals()) {
9661             sigsuspend(&get_task_state(cpu)->signal_mask);
9662         }
9663         return -TARGET_EINTR;
9664 #endif
9665 #ifdef TARGET_NR_utime
9666     case TARGET_NR_utime:
9667         {
9668             struct utimbuf tbuf, *host_tbuf;
9669             struct target_utimbuf *target_tbuf;
9670             if (arg2) {
9671                 if (!lock_user_struct(VERIFY_READ, target_tbuf, arg2, 1))
9672                     return -TARGET_EFAULT;
9673                 tbuf.actime = tswapal(target_tbuf->actime);
9674                 tbuf.modtime = tswapal(target_tbuf->modtime);
9675                 unlock_user_struct(target_tbuf, arg2, 0);
9676                 host_tbuf = &tbuf;
9677             } else {
9678                 host_tbuf = NULL;
9679             }
9680             if (!(p = lock_user_string(arg1)))
9681                 return -TARGET_EFAULT;
9682             ret = get_errno(utime(p, host_tbuf));
9683             unlock_user(p, arg1, 0);
9684         }
9685         return ret;
9686 #endif
9687 #ifdef TARGET_NR_utimes
9688     case TARGET_NR_utimes:
9689         {
9690             struct timeval *tvp, tv[2];
9691             if (arg2) {
9692                 if (copy_from_user_timeval(&tv[0], arg2)
9693                     || copy_from_user_timeval(&tv[1],
9694                                               arg2 + sizeof(struct target_timeval)))
9695                     return -TARGET_EFAULT;
9696                 tvp = tv;
9697             } else {
9698                 tvp = NULL;
9699             }
9700             if (!(p = lock_user_string(arg1)))
9701                 return -TARGET_EFAULT;
9702             ret = get_errno(utimes(p, tvp));
9703             unlock_user(p, arg1, 0);
9704         }
9705         return ret;
9706 #endif
9707 #if defined(TARGET_NR_futimesat)
9708     case TARGET_NR_futimesat:
9709         {
9710             struct timeval *tvp, tv[2];
9711             if (arg3) {
9712                 if (copy_from_user_timeval(&tv[0], arg3)
9713                     || copy_from_user_timeval(&tv[1],
9714                                               arg3 + sizeof(struct target_timeval)))
9715                     return -TARGET_EFAULT;
9716                 tvp = tv;
9717             } else {
9718                 tvp = NULL;
9719             }
9720             if (!(p = lock_user_string(arg2))) {
9721                 return -TARGET_EFAULT;
9722             }
9723             ret = get_errno(futimesat(arg1, path(p), tvp));
9724             unlock_user(p, arg2, 0);
9725         }
9726         return ret;
9727 #endif
9728 #ifdef TARGET_NR_access
9729     case TARGET_NR_access:
9730         if (!(p = lock_user_string(arg1))) {
9731             return -TARGET_EFAULT;
9732         }
9733         ret = get_errno(access(path(p), arg2));
9734         unlock_user(p, arg1, 0);
9735         return ret;
9736 #endif
9737 #if defined(TARGET_NR_faccessat) && defined(__NR_faccessat)
9738     case TARGET_NR_faccessat:
9739         if (!(p = lock_user_string(arg2))) {
9740             return -TARGET_EFAULT;
9741         }
9742         ret = get_errno(faccessat(arg1, p, arg3, 0));
9743         unlock_user(p, arg2, 0);
9744         return ret;
9745 #endif
9746 #if defined(TARGET_NR_faccessat2)
9747     case TARGET_NR_faccessat2:
9748         if (!(p = lock_user_string(arg2))) {
9749             return -TARGET_EFAULT;
9750         }
9751         ret = get_errno(faccessat(arg1, p, arg3, arg4));
9752         unlock_user(p, arg2, 0);
9753         return ret;
9754 #endif
9755 #ifdef TARGET_NR_nice /* not on alpha */
9756     case TARGET_NR_nice:
9757         return get_errno(nice(arg1));
9758 #endif
9759     case TARGET_NR_sync:
9760         sync();
9761         return 0;
9762 #if defined(TARGET_NR_syncfs) && defined(CONFIG_SYNCFS)
9763     case TARGET_NR_syncfs:
9764         return get_errno(syncfs(arg1));
9765 #endif
9766     case TARGET_NR_kill:
9767         return get_errno(safe_kill(arg1, target_to_host_signal(arg2)));
9768 #ifdef TARGET_NR_rename
9769     case TARGET_NR_rename:
9770         {
9771             void *p2;
9772             p = lock_user_string(arg1);
9773             p2 = lock_user_string(arg2);
9774             if (!p || !p2)
9775                 ret = -TARGET_EFAULT;
9776             else
9777                 ret = get_errno(rename(p, p2));
9778             unlock_user(p2, arg2, 0);
9779             unlock_user(p, arg1, 0);
9780         }
9781         return ret;
9782 #endif
9783 #if defined(TARGET_NR_renameat)
9784     case TARGET_NR_renameat:
9785         {
9786             void *p2;
9787             p  = lock_user_string(arg2);
9788             p2 = lock_user_string(arg4);
9789             if (!p || !p2)
9790                 ret = -TARGET_EFAULT;
9791             else
9792                 ret = get_errno(renameat(arg1, p, arg3, p2));
9793             unlock_user(p2, arg4, 0);
9794             unlock_user(p, arg2, 0);
9795         }
9796         return ret;
9797 #endif
9798 #if defined(TARGET_NR_renameat2)
9799     case TARGET_NR_renameat2:
9800         {
9801             void *p2;
9802             p  = lock_user_string(arg2);
9803             p2 = lock_user_string(arg4);
9804             if (!p || !p2) {
9805                 ret = -TARGET_EFAULT;
9806             } else {
9807                 ret = get_errno(sys_renameat2(arg1, p, arg3, p2, arg5));
9808             }
9809             unlock_user(p2, arg4, 0);
9810             unlock_user(p, arg2, 0);
9811         }
9812         return ret;
9813 #endif
9814 #ifdef TARGET_NR_mkdir
9815     case TARGET_NR_mkdir:
9816         if (!(p = lock_user_string(arg1)))
9817             return -TARGET_EFAULT;
9818         ret = get_errno(mkdir(p, arg2));
9819         unlock_user(p, arg1, 0);
9820         return ret;
9821 #endif
9822 #if defined(TARGET_NR_mkdirat)
9823     case TARGET_NR_mkdirat:
9824         if (!(p = lock_user_string(arg2)))
9825             return -TARGET_EFAULT;
9826         ret = get_errno(mkdirat(arg1, p, arg3));
9827         unlock_user(p, arg2, 0);
9828         return ret;
9829 #endif
9830 #ifdef TARGET_NR_rmdir
9831     case TARGET_NR_rmdir:
9832         if (!(p = lock_user_string(arg1)))
9833             return -TARGET_EFAULT;
9834         ret = get_errno(rmdir(p));
9835         unlock_user(p, arg1, 0);
9836         return ret;
9837 #endif
9838     case TARGET_NR_dup:
9839         ret = get_errno(dup(arg1));
9840         if (ret >= 0) {
9841             fd_trans_dup(arg1, ret);
9842         }
9843         return ret;
9844 #ifdef TARGET_NR_pipe
9845     case TARGET_NR_pipe:
9846         return do_pipe(cpu_env, arg1, 0, 0);
9847 #endif
9848 #ifdef TARGET_NR_pipe2
9849     case TARGET_NR_pipe2:
9850         return do_pipe(cpu_env, arg1,
9851                        target_to_host_bitmask(arg2, fcntl_flags_tbl), 1);
9852 #endif
9853     case TARGET_NR_times:
9854         {
9855             struct target_tms *tmsp;
9856             struct tms tms;
9857             ret = get_errno(times(&tms));
9858             if (arg1) {
9859                 tmsp = lock_user(VERIFY_WRITE, arg1, sizeof(struct target_tms), 0);
9860                 if (!tmsp)
9861                     return -TARGET_EFAULT;
9862                 tmsp->tms_utime = tswapal(host_to_target_clock_t(tms.tms_utime));
9863                 tmsp->tms_stime = tswapal(host_to_target_clock_t(tms.tms_stime));
9864                 tmsp->tms_cutime = tswapal(host_to_target_clock_t(tms.tms_cutime));
9865                 tmsp->tms_cstime = tswapal(host_to_target_clock_t(tms.tms_cstime));
9866             }
9867             if (!is_error(ret))
9868                 ret = host_to_target_clock_t(ret);
9869         }
9870         return ret;
9871     case TARGET_NR_acct:
9872         if (arg1 == 0) {
9873             ret = get_errno(acct(NULL));
9874         } else {
9875             if (!(p = lock_user_string(arg1))) {
9876                 return -TARGET_EFAULT;
9877             }
9878             ret = get_errno(acct(path(p)));
9879             unlock_user(p, arg1, 0);
9880         }
9881         return ret;
9882 #ifdef TARGET_NR_umount2
9883     case TARGET_NR_umount2:
9884         if (!(p = lock_user_string(arg1)))
9885             return -TARGET_EFAULT;
9886         ret = get_errno(umount2(p, arg2));
9887         unlock_user(p, arg1, 0);
9888         return ret;
9889 #endif
9890     case TARGET_NR_ioctl:
9891         return do_ioctl(arg1, arg2, arg3);
9892 #ifdef TARGET_NR_fcntl
9893     case TARGET_NR_fcntl:
9894         return do_fcntl(arg1, arg2, arg3);
9895 #endif
9896     case TARGET_NR_setpgid:
9897         return get_errno(setpgid(arg1, arg2));
9898     case TARGET_NR_umask:
9899         return get_errno(umask(arg1));
9900     case TARGET_NR_chroot:
9901         if (!(p = lock_user_string(arg1)))
9902             return -TARGET_EFAULT;
9903         ret = get_errno(chroot(p));
9904         unlock_user(p, arg1, 0);
9905         return ret;
9906 #ifdef TARGET_NR_dup2
9907     case TARGET_NR_dup2:
9908         ret = get_errno(dup2(arg1, arg2));
9909         if (ret >= 0) {
9910             fd_trans_dup(arg1, arg2);
9911         }
9912         return ret;
9913 #endif
9914 #if defined(CONFIG_DUP3) && defined(TARGET_NR_dup3)
9915     case TARGET_NR_dup3:
9916     {
9917         int host_flags;
9918 
9919         if ((arg3 & ~TARGET_O_CLOEXEC) != 0) {
9920             return -EINVAL;
9921         }
9922         host_flags = target_to_host_bitmask(arg3, fcntl_flags_tbl);
9923         ret = get_errno(dup3(arg1, arg2, host_flags));
9924         if (ret >= 0) {
9925             fd_trans_dup(arg1, arg2);
9926         }
9927         return ret;
9928     }
9929 #endif
9930 #ifdef TARGET_NR_getppid /* not on alpha */
9931     case TARGET_NR_getppid:
9932         return get_errno(getppid());
9933 #endif
9934 #ifdef TARGET_NR_getpgrp
9935     case TARGET_NR_getpgrp:
9936         return get_errno(getpgrp());
9937 #endif
9938     case TARGET_NR_setsid:
9939         return get_errno(setsid());
9940 #ifdef TARGET_NR_sigaction
9941     case TARGET_NR_sigaction:
9942         {
9943 #if defined(TARGET_MIPS)
9944 	    struct target_sigaction act, oact, *pact, *old_act;
9945 
9946 	    if (arg2) {
9947                 if (!lock_user_struct(VERIFY_READ, old_act, arg2, 1))
9948                     return -TARGET_EFAULT;
9949 		act._sa_handler = old_act->_sa_handler;
9950 		target_siginitset(&act.sa_mask, old_act->sa_mask.sig[0]);
9951 		act.sa_flags = old_act->sa_flags;
9952 		unlock_user_struct(old_act, arg2, 0);
9953 		pact = &act;
9954 	    } else {
9955 		pact = NULL;
9956 	    }
9957 
9958         ret = get_errno(do_sigaction(arg1, pact, &oact, 0));
9959 
9960 	    if (!is_error(ret) && arg3) {
9961                 if (!lock_user_struct(VERIFY_WRITE, old_act, arg3, 0))
9962                     return -TARGET_EFAULT;
9963 		old_act->_sa_handler = oact._sa_handler;
9964 		old_act->sa_flags = oact.sa_flags;
9965 		old_act->sa_mask.sig[0] = oact.sa_mask.sig[0];
9966 		old_act->sa_mask.sig[1] = 0;
9967 		old_act->sa_mask.sig[2] = 0;
9968 		old_act->sa_mask.sig[3] = 0;
9969 		unlock_user_struct(old_act, arg3, 1);
9970 	    }
9971 #else
9972             struct target_old_sigaction *old_act;
9973             struct target_sigaction act, oact, *pact;
9974             if (arg2) {
9975                 if (!lock_user_struct(VERIFY_READ, old_act, arg2, 1))
9976                     return -TARGET_EFAULT;
9977                 act._sa_handler = old_act->_sa_handler;
9978                 target_siginitset(&act.sa_mask, old_act->sa_mask);
9979                 act.sa_flags = old_act->sa_flags;
9980 #ifdef TARGET_ARCH_HAS_SA_RESTORER
9981                 act.sa_restorer = old_act->sa_restorer;
9982 #endif
9983                 unlock_user_struct(old_act, arg2, 0);
9984                 pact = &act;
9985             } else {
9986                 pact = NULL;
9987             }
9988             ret = get_errno(do_sigaction(arg1, pact, &oact, 0));
9989             if (!is_error(ret) && arg3) {
9990                 if (!lock_user_struct(VERIFY_WRITE, old_act, arg3, 0))
9991                     return -TARGET_EFAULT;
9992                 old_act->_sa_handler = oact._sa_handler;
9993                 old_act->sa_mask = oact.sa_mask.sig[0];
9994                 old_act->sa_flags = oact.sa_flags;
9995 #ifdef TARGET_ARCH_HAS_SA_RESTORER
9996                 old_act->sa_restorer = oact.sa_restorer;
9997 #endif
9998                 unlock_user_struct(old_act, arg3, 1);
9999             }
10000 #endif
10001         }
10002         return ret;
10003 #endif
10004     case TARGET_NR_rt_sigaction:
10005         {
10006             /*
10007              * For Alpha and SPARC this is a 5 argument syscall, with
10008              * a 'restorer' parameter which must be copied into the
10009              * sa_restorer field of the sigaction struct.
10010              * For Alpha that 'restorer' is arg5; for SPARC it is arg4,
10011              * and arg5 is the sigsetsize.
10012              */
10013 #if defined(TARGET_ALPHA)
10014             target_ulong sigsetsize = arg4;
10015             target_ulong restorer = arg5;
10016 #elif defined(TARGET_SPARC)
10017             target_ulong restorer = arg4;
10018             target_ulong sigsetsize = arg5;
10019 #else
10020             target_ulong sigsetsize = arg4;
10021             target_ulong restorer = 0;
10022 #endif
10023             struct target_sigaction *act = NULL;
10024             struct target_sigaction *oact = NULL;
10025 
10026             if (sigsetsize != sizeof(target_sigset_t)) {
10027                 return -TARGET_EINVAL;
10028             }
10029             if (arg2 && !lock_user_struct(VERIFY_READ, act, arg2, 1)) {
10030                 return -TARGET_EFAULT;
10031             }
10032             if (arg3 && !lock_user_struct(VERIFY_WRITE, oact, arg3, 0)) {
10033                 ret = -TARGET_EFAULT;
10034             } else {
10035                 ret = get_errno(do_sigaction(arg1, act, oact, restorer));
10036                 if (oact) {
10037                     unlock_user_struct(oact, arg3, 1);
10038                 }
10039             }
10040             if (act) {
10041                 unlock_user_struct(act, arg2, 0);
10042             }
10043         }
10044         return ret;
10045 #ifdef TARGET_NR_sgetmask /* not on alpha */
10046     case TARGET_NR_sgetmask:
10047         {
10048             sigset_t cur_set;
10049             abi_ulong target_set;
10050             ret = do_sigprocmask(0, NULL, &cur_set);
10051             if (!ret) {
10052                 host_to_target_old_sigset(&target_set, &cur_set);
10053                 ret = target_set;
10054             }
10055         }
10056         return ret;
10057 #endif
10058 #ifdef TARGET_NR_ssetmask /* not on alpha */
10059     case TARGET_NR_ssetmask:
10060         {
10061             sigset_t set, oset;
10062             abi_ulong target_set = arg1;
10063             target_to_host_old_sigset(&set, &target_set);
10064             ret = do_sigprocmask(SIG_SETMASK, &set, &oset);
10065             if (!ret) {
10066                 host_to_target_old_sigset(&target_set, &oset);
10067                 ret = target_set;
10068             }
10069         }
10070         return ret;
10071 #endif
10072 #ifdef TARGET_NR_sigprocmask
10073     case TARGET_NR_sigprocmask:
10074         {
10075 #if defined(TARGET_ALPHA)
10076             sigset_t set, oldset;
10077             abi_ulong mask;
10078             int how;
10079 
10080             switch (arg1) {
10081             case TARGET_SIG_BLOCK:
10082                 how = SIG_BLOCK;
10083                 break;
10084             case TARGET_SIG_UNBLOCK:
10085                 how = SIG_UNBLOCK;
10086                 break;
10087             case TARGET_SIG_SETMASK:
10088                 how = SIG_SETMASK;
10089                 break;
10090             default:
10091                 return -TARGET_EINVAL;
10092             }
10093             mask = arg2;
10094             target_to_host_old_sigset(&set, &mask);
10095 
10096             ret = do_sigprocmask(how, &set, &oldset);
10097             if (!is_error(ret)) {
10098                 host_to_target_old_sigset(&mask, &oldset);
10099                 ret = mask;
10100                 cpu_env->ir[IR_V0] = 0; /* force no error */
10101             }
10102 #else
10103             sigset_t set, oldset, *set_ptr;
10104             int how;
10105 
10106             if (arg2) {
10107                 p = lock_user(VERIFY_READ, arg2, sizeof(target_sigset_t), 1);
10108                 if (!p) {
10109                     return -TARGET_EFAULT;
10110                 }
10111                 target_to_host_old_sigset(&set, p);
10112                 unlock_user(p, arg2, 0);
10113                 set_ptr = &set;
10114                 switch (arg1) {
10115                 case TARGET_SIG_BLOCK:
10116                     how = SIG_BLOCK;
10117                     break;
10118                 case TARGET_SIG_UNBLOCK:
10119                     how = SIG_UNBLOCK;
10120                     break;
10121                 case TARGET_SIG_SETMASK:
10122                     how = SIG_SETMASK;
10123                     break;
10124                 default:
10125                     return -TARGET_EINVAL;
10126                 }
10127             } else {
10128                 how = 0;
10129                 set_ptr = NULL;
10130             }
10131             ret = do_sigprocmask(how, set_ptr, &oldset);
10132             if (!is_error(ret) && arg3) {
10133                 if (!(p = lock_user(VERIFY_WRITE, arg3, sizeof(target_sigset_t), 0)))
10134                     return -TARGET_EFAULT;
10135                 host_to_target_old_sigset(p, &oldset);
10136                 unlock_user(p, arg3, sizeof(target_sigset_t));
10137             }
10138 #endif
10139         }
10140         return ret;
10141 #endif
10142     case TARGET_NR_rt_sigprocmask:
10143         {
10144             int how = arg1;
10145             sigset_t set, oldset, *set_ptr;
10146 
10147             if (arg4 != sizeof(target_sigset_t)) {
10148                 return -TARGET_EINVAL;
10149             }
10150 
10151             if (arg2) {
10152                 p = lock_user(VERIFY_READ, arg2, sizeof(target_sigset_t), 1);
10153                 if (!p) {
10154                     return -TARGET_EFAULT;
10155                 }
10156                 target_to_host_sigset(&set, p);
10157                 unlock_user(p, arg2, 0);
10158                 set_ptr = &set;
10159                 switch(how) {
10160                 case TARGET_SIG_BLOCK:
10161                     how = SIG_BLOCK;
10162                     break;
10163                 case TARGET_SIG_UNBLOCK:
10164                     how = SIG_UNBLOCK;
10165                     break;
10166                 case TARGET_SIG_SETMASK:
10167                     how = SIG_SETMASK;
10168                     break;
10169                 default:
10170                     return -TARGET_EINVAL;
10171                 }
10172             } else {
10173                 how = 0;
10174                 set_ptr = NULL;
10175             }
10176             ret = do_sigprocmask(how, set_ptr, &oldset);
10177             if (!is_error(ret) && arg3) {
10178                 if (!(p = lock_user(VERIFY_WRITE, arg3, sizeof(target_sigset_t), 0)))
10179                     return -TARGET_EFAULT;
10180                 host_to_target_sigset(p, &oldset);
10181                 unlock_user(p, arg3, sizeof(target_sigset_t));
10182             }
10183         }
10184         return ret;
10185 #ifdef TARGET_NR_sigpending
10186     case TARGET_NR_sigpending:
10187         {
10188             sigset_t set;
10189             ret = get_errno(sigpending(&set));
10190             if (!is_error(ret)) {
10191                 if (!(p = lock_user(VERIFY_WRITE, arg1, sizeof(target_sigset_t), 0)))
10192                     return -TARGET_EFAULT;
10193                 host_to_target_old_sigset(p, &set);
10194                 unlock_user(p, arg1, sizeof(target_sigset_t));
10195             }
10196         }
10197         return ret;
10198 #endif
10199     case TARGET_NR_rt_sigpending:
10200         {
10201             sigset_t set;
10202 
10203             /* Yes, this check is >, not != like most. We follow the kernel's
10204              * logic and it does it like this because it implements
10205              * NR_sigpending through the same code path, and in that case
10206              * the old_sigset_t is smaller in size.
10207              */
10208             if (arg2 > sizeof(target_sigset_t)) {
10209                 return -TARGET_EINVAL;
10210             }
10211 
10212             ret = get_errno(sigpending(&set));
10213             if (!is_error(ret)) {
10214                 if (!(p = lock_user(VERIFY_WRITE, arg1, sizeof(target_sigset_t), 0)))
10215                     return -TARGET_EFAULT;
10216                 host_to_target_sigset(p, &set);
10217                 unlock_user(p, arg1, sizeof(target_sigset_t));
10218             }
10219         }
10220         return ret;
10221 #ifdef TARGET_NR_sigsuspend
10222     case TARGET_NR_sigsuspend:
10223         {
10224             sigset_t *set;
10225 
10226 #if defined(TARGET_ALPHA)
10227             TaskState *ts = get_task_state(cpu);
10228             /* target_to_host_old_sigset will bswap back */
10229             abi_ulong mask = tswapal(arg1);
10230             set = &ts->sigsuspend_mask;
10231             target_to_host_old_sigset(set, &mask);
10232 #else
10233             ret = process_sigsuspend_mask(&set, arg1, sizeof(target_sigset_t));
10234             if (ret != 0) {
10235                 return ret;
10236             }
10237 #endif
10238             ret = get_errno(safe_rt_sigsuspend(set, SIGSET_T_SIZE));
10239             finish_sigsuspend_mask(ret);
10240         }
10241         return ret;
10242 #endif
10243     case TARGET_NR_rt_sigsuspend:
10244         {
10245             sigset_t *set;
10246 
10247             ret = process_sigsuspend_mask(&set, arg1, arg2);
10248             if (ret != 0) {
10249                 return ret;
10250             }
10251             ret = get_errno(safe_rt_sigsuspend(set, SIGSET_T_SIZE));
10252             finish_sigsuspend_mask(ret);
10253         }
10254         return ret;
10255 #ifdef TARGET_NR_rt_sigtimedwait
10256     case TARGET_NR_rt_sigtimedwait:
10257         {
10258             sigset_t set;
10259             struct timespec uts, *puts;
10260             siginfo_t uinfo;
10261 
10262             if (arg4 != sizeof(target_sigset_t)) {
10263                 return -TARGET_EINVAL;
10264             }
10265 
10266             if (!(p = lock_user(VERIFY_READ, arg1, sizeof(target_sigset_t), 1)))
10267                 return -TARGET_EFAULT;
10268             target_to_host_sigset(&set, p);
10269             unlock_user(p, arg1, 0);
10270             if (arg3) {
10271                 puts = &uts;
10272                 if (target_to_host_timespec(puts, arg3)) {
10273                     return -TARGET_EFAULT;
10274                 }
10275             } else {
10276                 puts = NULL;
10277             }
10278             ret = get_errno(safe_rt_sigtimedwait(&set, &uinfo, puts,
10279                                                  SIGSET_T_SIZE));
10280             if (!is_error(ret)) {
10281                 if (arg2) {
10282                     p = lock_user(VERIFY_WRITE, arg2, sizeof(target_siginfo_t),
10283                                   0);
10284                     if (!p) {
10285                         return -TARGET_EFAULT;
10286                     }
10287                     host_to_target_siginfo(p, &uinfo);
10288                     unlock_user(p, arg2, sizeof(target_siginfo_t));
10289                 }
10290                 ret = host_to_target_signal(ret);
10291             }
10292         }
10293         return ret;
10294 #endif
10295 #ifdef TARGET_NR_rt_sigtimedwait_time64
10296     case TARGET_NR_rt_sigtimedwait_time64:
10297         {
10298             sigset_t set;
10299             struct timespec uts, *puts;
10300             siginfo_t uinfo;
10301 
10302             if (arg4 != sizeof(target_sigset_t)) {
10303                 return -TARGET_EINVAL;
10304             }
10305 
10306             p = lock_user(VERIFY_READ, arg1, sizeof(target_sigset_t), 1);
10307             if (!p) {
10308                 return -TARGET_EFAULT;
10309             }
10310             target_to_host_sigset(&set, p);
10311             unlock_user(p, arg1, 0);
10312             if (arg3) {
10313                 puts = &uts;
10314                 if (target_to_host_timespec64(puts, arg3)) {
10315                     return -TARGET_EFAULT;
10316                 }
10317             } else {
10318                 puts = NULL;
10319             }
10320             ret = get_errno(safe_rt_sigtimedwait(&set, &uinfo, puts,
10321                                                  SIGSET_T_SIZE));
10322             if (!is_error(ret)) {
10323                 if (arg2) {
10324                     p = lock_user(VERIFY_WRITE, arg2,
10325                                   sizeof(target_siginfo_t), 0);
10326                     if (!p) {
10327                         return -TARGET_EFAULT;
10328                     }
10329                     host_to_target_siginfo(p, &uinfo);
10330                     unlock_user(p, arg2, sizeof(target_siginfo_t));
10331                 }
10332                 ret = host_to_target_signal(ret);
10333             }
10334         }
10335         return ret;
10336 #endif
10337     case TARGET_NR_rt_sigqueueinfo:
10338         {
10339             siginfo_t uinfo;
10340 
10341             p = lock_user(VERIFY_READ, arg3, sizeof(target_siginfo_t), 1);
10342             if (!p) {
10343                 return -TARGET_EFAULT;
10344             }
10345             target_to_host_siginfo(&uinfo, p);
10346             unlock_user(p, arg3, 0);
10347             ret = get_errno(sys_rt_sigqueueinfo(arg1, target_to_host_signal(arg2), &uinfo));
10348         }
10349         return ret;
10350     case TARGET_NR_rt_tgsigqueueinfo:
10351         {
10352             siginfo_t uinfo;
10353 
10354             p = lock_user(VERIFY_READ, arg4, sizeof(target_siginfo_t), 1);
10355             if (!p) {
10356                 return -TARGET_EFAULT;
10357             }
10358             target_to_host_siginfo(&uinfo, p);
10359             unlock_user(p, arg4, 0);
10360             ret = get_errno(sys_rt_tgsigqueueinfo(arg1, arg2, target_to_host_signal(arg3), &uinfo));
10361         }
10362         return ret;
10363 #ifdef TARGET_NR_sigreturn
10364     case TARGET_NR_sigreturn:
10365         if (block_signals()) {
10366             return -QEMU_ERESTARTSYS;
10367         }
10368         return do_sigreturn(cpu_env);
10369 #endif
10370     case TARGET_NR_rt_sigreturn:
10371         if (block_signals()) {
10372             return -QEMU_ERESTARTSYS;
10373         }
10374         return do_rt_sigreturn(cpu_env);
10375     case TARGET_NR_sethostname:
10376         if (!(p = lock_user_string(arg1)))
10377             return -TARGET_EFAULT;
10378         ret = get_errno(sethostname(p, arg2));
10379         unlock_user(p, arg1, 0);
10380         return ret;
10381 #ifdef TARGET_NR_setrlimit
10382     case TARGET_NR_setrlimit:
10383         {
10384             int resource = target_to_host_resource(arg1);
10385             struct target_rlimit *target_rlim;
10386             struct rlimit rlim;
10387             if (!lock_user_struct(VERIFY_READ, target_rlim, arg2, 1))
10388                 return -TARGET_EFAULT;
10389             rlim.rlim_cur = target_to_host_rlim(target_rlim->rlim_cur);
10390             rlim.rlim_max = target_to_host_rlim(target_rlim->rlim_max);
10391             unlock_user_struct(target_rlim, arg2, 0);
10392             /*
10393              * If we just passed through resource limit settings for memory then
10394              * they would also apply to QEMU's own allocations, and QEMU will
10395              * crash or hang or die if its allocations fail. Ideally we would
10396              * track the guest allocations in QEMU and apply the limits ourselves.
10397              * For now, just tell the guest the call succeeded but don't actually
10398              * limit anything.
10399              */
10400             if (resource != RLIMIT_AS &&
10401                 resource != RLIMIT_DATA &&
10402                 resource != RLIMIT_STACK) {
10403                 return get_errno(setrlimit(resource, &rlim));
10404             } else {
10405                 return 0;
10406             }
10407         }
10408 #endif
10409 #ifdef TARGET_NR_getrlimit
10410     case TARGET_NR_getrlimit:
10411         {
10412             int resource = target_to_host_resource(arg1);
10413             struct target_rlimit *target_rlim;
10414             struct rlimit rlim;
10415 
10416             ret = get_errno(getrlimit(resource, &rlim));
10417             if (!is_error(ret)) {
10418                 if (!lock_user_struct(VERIFY_WRITE, target_rlim, arg2, 0))
10419                     return -TARGET_EFAULT;
10420                 target_rlim->rlim_cur = host_to_target_rlim(rlim.rlim_cur);
10421                 target_rlim->rlim_max = host_to_target_rlim(rlim.rlim_max);
10422                 unlock_user_struct(target_rlim, arg2, 1);
10423             }
10424         }
10425         return ret;
10426 #endif
10427     case TARGET_NR_getrusage:
10428         {
10429             struct rusage rusage;
10430             ret = get_errno(getrusage(arg1, &rusage));
10431             if (!is_error(ret)) {
10432                 ret = host_to_target_rusage(arg2, &rusage);
10433             }
10434         }
10435         return ret;
10436 #if defined(TARGET_NR_gettimeofday)
10437     case TARGET_NR_gettimeofday:
10438         {
10439             struct timeval tv;
10440             struct timezone tz;
10441 
10442             ret = get_errno(gettimeofday(&tv, &tz));
10443             if (!is_error(ret)) {
10444                 if (arg1 && copy_to_user_timeval(arg1, &tv)) {
10445                     return -TARGET_EFAULT;
10446                 }
10447                 if (arg2 && copy_to_user_timezone(arg2, &tz)) {
10448                     return -TARGET_EFAULT;
10449                 }
10450             }
10451         }
10452         return ret;
10453 #endif
10454 #if defined(TARGET_NR_settimeofday)
10455     case TARGET_NR_settimeofday:
10456         {
10457             struct timeval tv, *ptv = NULL;
10458             struct timezone tz, *ptz = NULL;
10459 
10460             if (arg1) {
10461                 if (copy_from_user_timeval(&tv, arg1)) {
10462                     return -TARGET_EFAULT;
10463                 }
10464                 ptv = &tv;
10465             }
10466 
10467             if (arg2) {
10468                 if (copy_from_user_timezone(&tz, arg2)) {
10469                     return -TARGET_EFAULT;
10470                 }
10471                 ptz = &tz;
10472             }
10473 
10474             return get_errno(settimeofday(ptv, ptz));
10475         }
10476 #endif
10477 #if defined(TARGET_NR_select)
10478     case TARGET_NR_select:
10479 #if defined(TARGET_WANT_NI_OLD_SELECT)
10480         /* some architectures used to have old_select here
10481          * but now ENOSYS it.
10482          */
10483         ret = -TARGET_ENOSYS;
10484 #elif defined(TARGET_WANT_OLD_SYS_SELECT)
10485         ret = do_old_select(arg1);
10486 #else
10487         ret = do_select(arg1, arg2, arg3, arg4, arg5);
10488 #endif
10489         return ret;
10490 #endif
10491 #ifdef TARGET_NR_pselect6
10492     case TARGET_NR_pselect6:
10493         return do_pselect6(arg1, arg2, arg3, arg4, arg5, arg6, false);
10494 #endif
10495 #ifdef TARGET_NR_pselect6_time64
10496     case TARGET_NR_pselect6_time64:
10497         return do_pselect6(arg1, arg2, arg3, arg4, arg5, arg6, true);
10498 #endif
10499 #ifdef TARGET_NR_symlink
10500     case TARGET_NR_symlink:
10501         {
10502             void *p2;
10503             p = lock_user_string(arg1);
10504             p2 = lock_user_string(arg2);
10505             if (!p || !p2)
10506                 ret = -TARGET_EFAULT;
10507             else
10508                 ret = get_errno(symlink(p, p2));
10509             unlock_user(p2, arg2, 0);
10510             unlock_user(p, arg1, 0);
10511         }
10512         return ret;
10513 #endif
10514 #if defined(TARGET_NR_symlinkat)
10515     case TARGET_NR_symlinkat:
10516         {
10517             void *p2;
10518             p  = lock_user_string(arg1);
10519             p2 = lock_user_string(arg3);
10520             if (!p || !p2)
10521                 ret = -TARGET_EFAULT;
10522             else
10523                 ret = get_errno(symlinkat(p, arg2, p2));
10524             unlock_user(p2, arg3, 0);
10525             unlock_user(p, arg1, 0);
10526         }
10527         return ret;
10528 #endif
10529 #ifdef TARGET_NR_readlink
10530     case TARGET_NR_readlink:
10531         {
10532             void *p2;
10533             p = lock_user_string(arg1);
10534             p2 = lock_user(VERIFY_WRITE, arg2, arg3, 0);
10535             ret = get_errno(do_guest_readlink(p, p2, arg3));
10536             unlock_user(p2, arg2, ret);
10537             unlock_user(p, arg1, 0);
10538         }
10539         return ret;
10540 #endif
10541 #if defined(TARGET_NR_readlinkat)
10542     case TARGET_NR_readlinkat:
10543         {
10544             void *p2;
10545             p  = lock_user_string(arg2);
10546             p2 = lock_user(VERIFY_WRITE, arg3, arg4, 0);
10547             if (!p || !p2) {
10548                 ret = -TARGET_EFAULT;
10549             } else if (!arg4) {
10550                 /* Short circuit this for the magic exe check. */
10551                 ret = -TARGET_EINVAL;
10552             } else if (is_proc_myself((const char *)p, "exe")) {
10553                 /*
10554                  * Don't worry about sign mismatch as earlier mapping
10555                  * logic would have thrown a bad address error.
10556                  */
10557                 ret = MIN(strlen(exec_path), arg4);
10558                 /* We cannot NUL terminate the string. */
10559                 memcpy(p2, exec_path, ret);
10560             } else {
10561                 ret = get_errno(readlinkat(arg1, path(p), p2, arg4));
10562             }
10563             unlock_user(p2, arg3, ret);
10564             unlock_user(p, arg2, 0);
10565         }
10566         return ret;
10567 #endif
10568 #ifdef TARGET_NR_swapon
10569     case TARGET_NR_swapon:
10570         if (!(p = lock_user_string(arg1)))
10571             return -TARGET_EFAULT;
10572         ret = get_errno(swapon(p, arg2));
10573         unlock_user(p, arg1, 0);
10574         return ret;
10575 #endif
10576     case TARGET_NR_reboot:
10577         if (arg3 == LINUX_REBOOT_CMD_RESTART2) {
10578            /* arg4 must be ignored in all other cases */
10579            p = lock_user_string(arg4);
10580            if (!p) {
10581                return -TARGET_EFAULT;
10582            }
10583            ret = get_errno(reboot(arg1, arg2, arg3, p));
10584            unlock_user(p, arg4, 0);
10585         } else {
10586            ret = get_errno(reboot(arg1, arg2, arg3, NULL));
10587         }
10588         return ret;
10589 #ifdef TARGET_NR_mmap
10590     case TARGET_NR_mmap:
10591 #ifdef TARGET_ARCH_WANT_SYS_OLD_MMAP
10592         {
10593             abi_ulong *v;
10594             abi_ulong v1, v2, v3, v4, v5, v6;
10595             if (!(v = lock_user(VERIFY_READ, arg1, 6 * sizeof(abi_ulong), 1)))
10596                 return -TARGET_EFAULT;
10597             v1 = tswapal(v[0]);
10598             v2 = tswapal(v[1]);
10599             v3 = tswapal(v[2]);
10600             v4 = tswapal(v[3]);
10601             v5 = tswapal(v[4]);
10602             v6 = tswapal(v[5]);
10603             unlock_user(v, arg1, 0);
10604             return do_mmap(v1, v2, v3, v4, v5, v6);
10605         }
10606 #else
10607         /* mmap pointers are always untagged */
10608         return do_mmap(arg1, arg2, arg3, arg4, arg5, arg6);
10609 #endif
10610 #endif
10611 #ifdef TARGET_NR_mmap2
10612     case TARGET_NR_mmap2:
10613 #ifndef MMAP_SHIFT
10614 #define MMAP_SHIFT 12
10615 #endif
10616         return do_mmap(arg1, arg2, arg3, arg4, arg5,
10617                        (off_t)(abi_ulong)arg6 << MMAP_SHIFT);
10618 #endif
10619     case TARGET_NR_munmap:
10620         arg1 = cpu_untagged_addr(cpu, arg1);
10621         return get_errno(target_munmap(arg1, arg2));
10622     case TARGET_NR_mprotect:
10623         arg1 = cpu_untagged_addr(cpu, arg1);
10624         {
10625             TaskState *ts = get_task_state(cpu);
10626             /* Special hack to detect libc making the stack executable.  */
10627             if ((arg3 & PROT_GROWSDOWN)
10628                 && arg1 >= ts->info->stack_limit
10629                 && arg1 <= ts->info->start_stack) {
10630                 arg3 &= ~PROT_GROWSDOWN;
10631                 arg2 = arg2 + arg1 - ts->info->stack_limit;
10632                 arg1 = ts->info->stack_limit;
10633             }
10634         }
10635         return get_errno(target_mprotect(arg1, arg2, arg3));
10636 #ifdef TARGET_NR_mremap
10637     case TARGET_NR_mremap:
10638         arg1 = cpu_untagged_addr(cpu, arg1);
10639         /* mremap new_addr (arg5) is always untagged */
10640         return get_errno(target_mremap(arg1, arg2, arg3, arg4, arg5));
10641 #endif
10642         /* ??? msync/mlock/munlock are broken for softmmu.  */
10643 #ifdef TARGET_NR_msync
10644     case TARGET_NR_msync:
10645         return get_errno(msync(g2h(cpu, arg1), arg2,
10646                                target_to_host_msync_arg(arg3)));
10647 #endif
10648 #ifdef TARGET_NR_mlock
10649     case TARGET_NR_mlock:
10650         return get_errno(mlock(g2h(cpu, arg1), arg2));
10651 #endif
10652 #ifdef TARGET_NR_munlock
10653     case TARGET_NR_munlock:
10654         return get_errno(munlock(g2h(cpu, arg1), arg2));
10655 #endif
10656 #ifdef TARGET_NR_mlockall
10657     case TARGET_NR_mlockall:
10658         return get_errno(mlockall(target_to_host_mlockall_arg(arg1)));
10659 #endif
10660 #ifdef TARGET_NR_munlockall
10661     case TARGET_NR_munlockall:
10662         return get_errno(munlockall());
10663 #endif
10664 #ifdef TARGET_NR_truncate
10665     case TARGET_NR_truncate:
10666         if (!(p = lock_user_string(arg1)))
10667             return -TARGET_EFAULT;
10668         ret = get_errno(truncate(p, arg2));
10669         unlock_user(p, arg1, 0);
10670         return ret;
10671 #endif
10672 #ifdef TARGET_NR_ftruncate
10673     case TARGET_NR_ftruncate:
10674         return get_errno(ftruncate(arg1, arg2));
10675 #endif
10676     case TARGET_NR_fchmod:
10677         return get_errno(fchmod(arg1, arg2));
10678 #if defined(TARGET_NR_fchmodat)
10679     case TARGET_NR_fchmodat:
10680         if (!(p = lock_user_string(arg2)))
10681             return -TARGET_EFAULT;
10682         ret = get_errno(fchmodat(arg1, p, arg3, 0));
10683         unlock_user(p, arg2, 0);
10684         return ret;
10685 #endif
10686     case TARGET_NR_getpriority:
10687         /* Note that negative values are valid for getpriority, so we must
10688            differentiate based on errno settings.  */
10689         errno = 0;
10690         ret = getpriority(arg1, arg2);
10691         if (ret == -1 && errno != 0) {
10692             return -host_to_target_errno(errno);
10693         }
10694 #ifdef TARGET_ALPHA
10695         /* Return value is the unbiased priority.  Signal no error.  */
10696         cpu_env->ir[IR_V0] = 0;
10697 #else
10698         /* Return value is a biased priority to avoid negative numbers.  */
10699         ret = 20 - ret;
10700 #endif
10701         return ret;
10702     case TARGET_NR_setpriority:
10703         return get_errno(setpriority(arg1, arg2, arg3));
10704 #ifdef TARGET_NR_statfs
10705     case TARGET_NR_statfs:
10706         if (!(p = lock_user_string(arg1))) {
10707             return -TARGET_EFAULT;
10708         }
10709         ret = get_errno(statfs(path(p), &stfs));
10710         unlock_user(p, arg1, 0);
10711     convert_statfs:
10712         if (!is_error(ret)) {
10713             struct target_statfs *target_stfs;
10714 
10715             if (!lock_user_struct(VERIFY_WRITE, target_stfs, arg2, 0))
10716                 return -TARGET_EFAULT;
10717             __put_user(stfs.f_type, &target_stfs->f_type);
10718             __put_user(stfs.f_bsize, &target_stfs->f_bsize);
10719             __put_user(stfs.f_blocks, &target_stfs->f_blocks);
10720             __put_user(stfs.f_bfree, &target_stfs->f_bfree);
10721             __put_user(stfs.f_bavail, &target_stfs->f_bavail);
10722             __put_user(stfs.f_files, &target_stfs->f_files);
10723             __put_user(stfs.f_ffree, &target_stfs->f_ffree);
10724             __put_user(stfs.f_fsid.__val[0], &target_stfs->f_fsid.val[0]);
10725             __put_user(stfs.f_fsid.__val[1], &target_stfs->f_fsid.val[1]);
10726             __put_user(stfs.f_namelen, &target_stfs->f_namelen);
10727             __put_user(stfs.f_frsize, &target_stfs->f_frsize);
10728 #ifdef _STATFS_F_FLAGS
10729             __put_user(stfs.f_flags, &target_stfs->f_flags);
10730 #else
10731             __put_user(0, &target_stfs->f_flags);
10732 #endif
10733             memset(target_stfs->f_spare, 0, sizeof(target_stfs->f_spare));
10734             unlock_user_struct(target_stfs, arg2, 1);
10735         }
10736         return ret;
10737 #endif
10738 #ifdef TARGET_NR_fstatfs
10739     case TARGET_NR_fstatfs:
10740         ret = get_errno(fstatfs(arg1, &stfs));
10741         goto convert_statfs;
10742 #endif
10743 #ifdef TARGET_NR_statfs64
10744     case TARGET_NR_statfs64:
10745         if (!(p = lock_user_string(arg1))) {
10746             return -TARGET_EFAULT;
10747         }
10748         ret = get_errno(statfs(path(p), &stfs));
10749         unlock_user(p, arg1, 0);
10750     convert_statfs64:
10751         if (!is_error(ret)) {
10752             struct target_statfs64 *target_stfs;
10753 
10754             if (!lock_user_struct(VERIFY_WRITE, target_stfs, arg3, 0))
10755                 return -TARGET_EFAULT;
10756             __put_user(stfs.f_type, &target_stfs->f_type);
10757             __put_user(stfs.f_bsize, &target_stfs->f_bsize);
10758             __put_user(stfs.f_blocks, &target_stfs->f_blocks);
10759             __put_user(stfs.f_bfree, &target_stfs->f_bfree);
10760             __put_user(stfs.f_bavail, &target_stfs->f_bavail);
10761             __put_user(stfs.f_files, &target_stfs->f_files);
10762             __put_user(stfs.f_ffree, &target_stfs->f_ffree);
10763             __put_user(stfs.f_fsid.__val[0], &target_stfs->f_fsid.val[0]);
10764             __put_user(stfs.f_fsid.__val[1], &target_stfs->f_fsid.val[1]);
10765             __put_user(stfs.f_namelen, &target_stfs->f_namelen);
10766             __put_user(stfs.f_frsize, &target_stfs->f_frsize);
10767 #ifdef _STATFS_F_FLAGS
10768             __put_user(stfs.f_flags, &target_stfs->f_flags);
10769 #else
10770             __put_user(0, &target_stfs->f_flags);
10771 #endif
10772             memset(target_stfs->f_spare, 0, sizeof(target_stfs->f_spare));
10773             unlock_user_struct(target_stfs, arg3, 1);
10774         }
10775         return ret;
10776     case TARGET_NR_fstatfs64:
10777         ret = get_errno(fstatfs(arg1, &stfs));
10778         goto convert_statfs64;
10779 #endif
10780 #ifdef TARGET_NR_socketcall
10781     case TARGET_NR_socketcall:
10782         return do_socketcall(arg1, arg2);
10783 #endif
10784 #ifdef TARGET_NR_accept
10785     case TARGET_NR_accept:
10786         return do_accept4(arg1, arg2, arg3, 0);
10787 #endif
10788 #ifdef TARGET_NR_accept4
10789     case TARGET_NR_accept4:
10790         return do_accept4(arg1, arg2, arg3, arg4);
10791 #endif
10792 #ifdef TARGET_NR_bind
10793     case TARGET_NR_bind:
10794         return do_bind(arg1, arg2, arg3);
10795 #endif
10796 #ifdef TARGET_NR_connect
10797     case TARGET_NR_connect:
10798         return do_connect(arg1, arg2, arg3);
10799 #endif
10800 #ifdef TARGET_NR_getpeername
10801     case TARGET_NR_getpeername:
10802         return do_getpeername(arg1, arg2, arg3);
10803 #endif
10804 #ifdef TARGET_NR_getsockname
10805     case TARGET_NR_getsockname:
10806         return do_getsockname(arg1, arg2, arg3);
10807 #endif
10808 #ifdef TARGET_NR_getsockopt
10809     case TARGET_NR_getsockopt:
10810         return do_getsockopt(arg1, arg2, arg3, arg4, arg5);
10811 #endif
10812 #ifdef TARGET_NR_listen
10813     case TARGET_NR_listen:
10814         return get_errno(listen(arg1, arg2));
10815 #endif
10816 #ifdef TARGET_NR_recv
10817     case TARGET_NR_recv:
10818         return do_recvfrom(arg1, arg2, arg3, arg4, 0, 0);
10819 #endif
10820 #ifdef TARGET_NR_recvfrom
10821     case TARGET_NR_recvfrom:
10822         return do_recvfrom(arg1, arg2, arg3, arg4, arg5, arg6);
10823 #endif
10824 #ifdef TARGET_NR_recvmsg
10825     case TARGET_NR_recvmsg:
10826         return do_sendrecvmsg(arg1, arg2, arg3, 0);
10827 #endif
10828 #ifdef TARGET_NR_send
10829     case TARGET_NR_send:
10830         return do_sendto(arg1, arg2, arg3, arg4, 0, 0);
10831 #endif
10832 #ifdef TARGET_NR_sendmsg
10833     case TARGET_NR_sendmsg:
10834         return do_sendrecvmsg(arg1, arg2, arg3, 1);
10835 #endif
10836 #ifdef TARGET_NR_sendmmsg
10837     case TARGET_NR_sendmmsg:
10838         return do_sendrecvmmsg(arg1, arg2, arg3, arg4, 1);
10839 #endif
10840 #ifdef TARGET_NR_recvmmsg
10841     case TARGET_NR_recvmmsg:
10842         return do_sendrecvmmsg(arg1, arg2, arg3, arg4, 0);
10843 #endif
10844 #ifdef TARGET_NR_sendto
10845     case TARGET_NR_sendto:
10846         return do_sendto(arg1, arg2, arg3, arg4, arg5, arg6);
10847 #endif
10848 #ifdef TARGET_NR_shutdown
10849     case TARGET_NR_shutdown:
10850         return get_errno(shutdown(arg1, arg2));
10851 #endif
10852 #if defined(TARGET_NR_getrandom) && defined(__NR_getrandom)
10853     case TARGET_NR_getrandom:
10854         p = lock_user(VERIFY_WRITE, arg1, arg2, 0);
10855         if (!p) {
10856             return -TARGET_EFAULT;
10857         }
10858         ret = get_errno(getrandom(p, arg2, arg3));
10859         unlock_user(p, arg1, ret);
10860         return ret;
10861 #endif
10862 #ifdef TARGET_NR_socket
10863     case TARGET_NR_socket:
10864         return do_socket(arg1, arg2, arg3);
10865 #endif
10866 #ifdef TARGET_NR_socketpair
10867     case TARGET_NR_socketpair:
10868         return do_socketpair(arg1, arg2, arg3, arg4);
10869 #endif
10870 #ifdef TARGET_NR_setsockopt
10871     case TARGET_NR_setsockopt:
10872         return do_setsockopt(arg1, arg2, arg3, arg4, (socklen_t) arg5);
10873 #endif
10874 #if defined(TARGET_NR_syslog)
10875     case TARGET_NR_syslog:
10876         {
10877             int len = arg2;
10878 
10879             switch (arg1) {
10880             case TARGET_SYSLOG_ACTION_CLOSE:         /* Close log */
10881             case TARGET_SYSLOG_ACTION_OPEN:          /* Open log */
10882             case TARGET_SYSLOG_ACTION_CLEAR:         /* Clear ring buffer */
10883             case TARGET_SYSLOG_ACTION_CONSOLE_OFF:   /* Disable logging */
10884             case TARGET_SYSLOG_ACTION_CONSOLE_ON:    /* Enable logging */
10885             case TARGET_SYSLOG_ACTION_CONSOLE_LEVEL: /* Set messages level */
10886             case TARGET_SYSLOG_ACTION_SIZE_UNREAD:   /* Number of chars */
10887             case TARGET_SYSLOG_ACTION_SIZE_BUFFER:   /* Size of the buffer */
10888                 return get_errno(sys_syslog((int)arg1, NULL, (int)arg3));
10889             case TARGET_SYSLOG_ACTION_READ:          /* Read from log */
10890             case TARGET_SYSLOG_ACTION_READ_CLEAR:    /* Read/clear msgs */
10891             case TARGET_SYSLOG_ACTION_READ_ALL:      /* Read last messages */
10892                 {
10893                     if (len < 0) {
10894                         return -TARGET_EINVAL;
10895                     }
10896                     if (len == 0) {
10897                         return 0;
10898                     }
10899                     p = lock_user(VERIFY_WRITE, arg2, arg3, 0);
10900                     if (!p) {
10901                         return -TARGET_EFAULT;
10902                     }
10903                     ret = get_errno(sys_syslog((int)arg1, p, (int)arg3));
10904                     unlock_user(p, arg2, arg3);
10905                 }
10906                 return ret;
10907             default:
10908                 return -TARGET_EINVAL;
10909             }
10910         }
10911         break;
10912 #endif
10913     case TARGET_NR_setitimer:
10914         {
10915             struct itimerval value, ovalue, *pvalue;
10916 
10917             if (arg2) {
10918                 pvalue = &value;
10919                 if (copy_from_user_timeval(&pvalue->it_interval, arg2)
10920                     || copy_from_user_timeval(&pvalue->it_value,
10921                                               arg2 + sizeof(struct target_timeval)))
10922                     return -TARGET_EFAULT;
10923             } else {
10924                 pvalue = NULL;
10925             }
10926             ret = get_errno(setitimer(arg1, pvalue, &ovalue));
10927             if (!is_error(ret) && arg3) {
10928                 if (copy_to_user_timeval(arg3,
10929                                          &ovalue.it_interval)
10930                     || copy_to_user_timeval(arg3 + sizeof(struct target_timeval),
10931                                             &ovalue.it_value))
10932                     return -TARGET_EFAULT;
10933             }
10934         }
10935         return ret;
10936     case TARGET_NR_getitimer:
10937         {
10938             struct itimerval value;
10939 
10940             ret = get_errno(getitimer(arg1, &value));
10941             if (!is_error(ret) && arg2) {
10942                 if (copy_to_user_timeval(arg2,
10943                                          &value.it_interval)
10944                     || copy_to_user_timeval(arg2 + sizeof(struct target_timeval),
10945                                             &value.it_value))
10946                     return -TARGET_EFAULT;
10947             }
10948         }
10949         return ret;
10950 #ifdef TARGET_NR_stat
10951     case TARGET_NR_stat:
10952         if (!(p = lock_user_string(arg1))) {
10953             return -TARGET_EFAULT;
10954         }
10955         ret = get_errno(stat(path(p), &st));
10956         unlock_user(p, arg1, 0);
10957         goto do_stat;
10958 #endif
10959 #ifdef TARGET_NR_lstat
10960     case TARGET_NR_lstat:
10961         if (!(p = lock_user_string(arg1))) {
10962             return -TARGET_EFAULT;
10963         }
10964         ret = get_errno(lstat(path(p), &st));
10965         unlock_user(p, arg1, 0);
10966         goto do_stat;
10967 #endif
10968 #ifdef TARGET_NR_fstat
10969     case TARGET_NR_fstat:
10970         {
10971             ret = get_errno(fstat(arg1, &st));
10972 #if defined(TARGET_NR_stat) || defined(TARGET_NR_lstat)
10973         do_stat:
10974 #endif
10975             if (!is_error(ret)) {
10976                 struct target_stat *target_st;
10977 
10978                 if (!lock_user_struct(VERIFY_WRITE, target_st, arg2, 0))
10979                     return -TARGET_EFAULT;
10980                 memset(target_st, 0, sizeof(*target_st));
10981                 __put_user(st.st_dev, &target_st->st_dev);
10982                 __put_user(st.st_ino, &target_st->st_ino);
10983                 __put_user(st.st_mode, &target_st->st_mode);
10984                 __put_user(st.st_uid, &target_st->st_uid);
10985                 __put_user(st.st_gid, &target_st->st_gid);
10986                 __put_user(st.st_nlink, &target_st->st_nlink);
10987                 __put_user(st.st_rdev, &target_st->st_rdev);
10988                 __put_user(st.st_size, &target_st->st_size);
10989                 __put_user(st.st_blksize, &target_st->st_blksize);
10990                 __put_user(st.st_blocks, &target_st->st_blocks);
10991                 __put_user(st.st_atime, &target_st->target_st_atime);
10992                 __put_user(st.st_mtime, &target_st->target_st_mtime);
10993                 __put_user(st.st_ctime, &target_st->target_st_ctime);
10994 #if defined(HAVE_STRUCT_STAT_ST_ATIM) && defined(TARGET_STAT_HAVE_NSEC)
10995                 __put_user(st.st_atim.tv_nsec,
10996                            &target_st->target_st_atime_nsec);
10997                 __put_user(st.st_mtim.tv_nsec,
10998                            &target_st->target_st_mtime_nsec);
10999                 __put_user(st.st_ctim.tv_nsec,
11000                            &target_st->target_st_ctime_nsec);
11001 #endif
11002                 unlock_user_struct(target_st, arg2, 1);
11003             }
11004         }
11005         return ret;
11006 #endif
11007     case TARGET_NR_vhangup:
11008         return get_errno(vhangup());
11009 #ifdef TARGET_NR_syscall
11010     case TARGET_NR_syscall:
11011         return do_syscall(cpu_env, arg1 & 0xffff, arg2, arg3, arg4, arg5,
11012                           arg6, arg7, arg8, 0);
11013 #endif
11014 #if defined(TARGET_NR_wait4)
11015     case TARGET_NR_wait4:
11016         {
11017             int status;
11018             abi_long status_ptr = arg2;
11019             struct rusage rusage, *rusage_ptr;
11020             abi_ulong target_rusage = arg4;
11021             abi_long rusage_err;
11022             if (target_rusage)
11023                 rusage_ptr = &rusage;
11024             else
11025                 rusage_ptr = NULL;
11026             ret = get_errno(safe_wait4(arg1, &status, arg3, rusage_ptr));
11027             if (!is_error(ret)) {
11028                 if (status_ptr && ret) {
11029                     status = host_to_target_waitstatus(status);
11030                     if (put_user_s32(status, status_ptr))
11031                         return -TARGET_EFAULT;
11032                 }
11033                 if (target_rusage) {
11034                     rusage_err = host_to_target_rusage(target_rusage, &rusage);
11035                     if (rusage_err) {
11036                         ret = rusage_err;
11037                     }
11038                 }
11039             }
11040         }
11041         return ret;
11042 #endif
11043 #ifdef TARGET_NR_swapoff
11044     case TARGET_NR_swapoff:
11045         if (!(p = lock_user_string(arg1)))
11046             return -TARGET_EFAULT;
11047         ret = get_errno(swapoff(p));
11048         unlock_user(p, arg1, 0);
11049         return ret;
11050 #endif
11051     case TARGET_NR_sysinfo:
11052         {
11053             struct target_sysinfo *target_value;
11054             struct sysinfo value;
11055             ret = get_errno(sysinfo(&value));
11056             if (!is_error(ret) && arg1)
11057             {
11058                 if (!lock_user_struct(VERIFY_WRITE, target_value, arg1, 0))
11059                     return -TARGET_EFAULT;
11060                 __put_user(value.uptime, &target_value->uptime);
11061                 __put_user(value.loads[0], &target_value->loads[0]);
11062                 __put_user(value.loads[1], &target_value->loads[1]);
11063                 __put_user(value.loads[2], &target_value->loads[2]);
11064                 __put_user(value.totalram, &target_value->totalram);
11065                 __put_user(value.freeram, &target_value->freeram);
11066                 __put_user(value.sharedram, &target_value->sharedram);
11067                 __put_user(value.bufferram, &target_value->bufferram);
11068                 __put_user(value.totalswap, &target_value->totalswap);
11069                 __put_user(value.freeswap, &target_value->freeswap);
11070                 __put_user(value.procs, &target_value->procs);
11071                 __put_user(value.totalhigh, &target_value->totalhigh);
11072                 __put_user(value.freehigh, &target_value->freehigh);
11073                 __put_user(value.mem_unit, &target_value->mem_unit);
11074                 unlock_user_struct(target_value, arg1, 1);
11075             }
11076         }
11077         return ret;
11078 #ifdef TARGET_NR_ipc
11079     case TARGET_NR_ipc:
11080         return do_ipc(cpu_env, arg1, arg2, arg3, arg4, arg5, arg6);
11081 #endif
11082 #ifdef TARGET_NR_semget
11083     case TARGET_NR_semget:
11084         return get_errno(semget(arg1, arg2, arg3));
11085 #endif
11086 #ifdef TARGET_NR_semop
11087     case TARGET_NR_semop:
11088         return do_semtimedop(arg1, arg2, arg3, 0, false);
11089 #endif
11090 #ifdef TARGET_NR_semtimedop
11091     case TARGET_NR_semtimedop:
11092         return do_semtimedop(arg1, arg2, arg3, arg4, false);
11093 #endif
11094 #ifdef TARGET_NR_semtimedop_time64
11095     case TARGET_NR_semtimedop_time64:
11096         return do_semtimedop(arg1, arg2, arg3, arg4, true);
11097 #endif
11098 #ifdef TARGET_NR_semctl
11099     case TARGET_NR_semctl:
11100         return do_semctl(arg1, arg2, arg3, arg4);
11101 #endif
11102 #ifdef TARGET_NR_msgctl
11103     case TARGET_NR_msgctl:
11104         return do_msgctl(arg1, arg2, arg3);
11105 #endif
11106 #ifdef TARGET_NR_msgget
11107     case TARGET_NR_msgget:
11108         return get_errno(msgget(arg1, arg2));
11109 #endif
11110 #ifdef TARGET_NR_msgrcv
11111     case TARGET_NR_msgrcv:
11112         return do_msgrcv(arg1, arg2, arg3, arg4, arg5);
11113 #endif
11114 #ifdef TARGET_NR_msgsnd
11115     case TARGET_NR_msgsnd:
11116         return do_msgsnd(arg1, arg2, arg3, arg4);
11117 #endif
11118 #ifdef TARGET_NR_shmget
11119     case TARGET_NR_shmget:
11120         return get_errno(shmget(arg1, arg2, arg3));
11121 #endif
11122 #ifdef TARGET_NR_shmctl
11123     case TARGET_NR_shmctl:
11124         return do_shmctl(arg1, arg2, arg3);
11125 #endif
11126 #ifdef TARGET_NR_shmat
11127     case TARGET_NR_shmat:
11128         return target_shmat(cpu_env, arg1, arg2, arg3);
11129 #endif
11130 #ifdef TARGET_NR_shmdt
11131     case TARGET_NR_shmdt:
11132         return target_shmdt(arg1);
11133 #endif
11134     case TARGET_NR_fsync:
11135         return get_errno(fsync(arg1));
11136     case TARGET_NR_clone:
11137         /* Linux manages to have three different orderings for its
11138          * arguments to clone(); the BACKWARDS and BACKWARDS2 defines
11139          * match the kernel's CONFIG_CLONE_* settings.
11140          * Microblaze is further special in that it uses a sixth
11141          * implicit argument to clone for the TLS pointer.
11142          */
11143 #if defined(TARGET_MICROBLAZE)
11144         ret = get_errno(do_fork(cpu_env, arg1, arg2, arg4, arg6, arg5));
11145 #elif defined(TARGET_CLONE_BACKWARDS)
11146         ret = get_errno(do_fork(cpu_env, arg1, arg2, arg3, arg4, arg5));
11147 #elif defined(TARGET_CLONE_BACKWARDS2)
11148         ret = get_errno(do_fork(cpu_env, arg2, arg1, arg3, arg5, arg4));
11149 #else
11150         ret = get_errno(do_fork(cpu_env, arg1, arg2, arg3, arg5, arg4));
11151 #endif
11152         return ret;
11153 #ifdef __NR_exit_group
11154         /* new thread calls */
11155     case TARGET_NR_exit_group:
11156         preexit_cleanup(cpu_env, arg1);
11157         return get_errno(exit_group(arg1));
11158 #endif
11159     case TARGET_NR_setdomainname:
11160         if (!(p = lock_user_string(arg1)))
11161             return -TARGET_EFAULT;
11162         ret = get_errno(setdomainname(p, arg2));
11163         unlock_user(p, arg1, 0);
11164         return ret;
11165     case TARGET_NR_uname:
11166         /* no need to transcode because we use the linux syscall */
11167         {
11168             struct new_utsname * buf;
11169 
11170             if (!lock_user_struct(VERIFY_WRITE, buf, arg1, 0))
11171                 return -TARGET_EFAULT;
11172             ret = get_errno(sys_uname(buf));
11173             if (!is_error(ret)) {
11174                 /* Overwrite the native machine name with whatever is being
11175                    emulated. */
11176                 g_strlcpy(buf->machine, cpu_to_uname_machine(cpu_env),
11177                           sizeof(buf->machine));
11178                 /* Allow the user to override the reported release.  */
11179                 if (qemu_uname_release && *qemu_uname_release) {
11180                     g_strlcpy(buf->release, qemu_uname_release,
11181                               sizeof(buf->release));
11182                 }
11183             }
11184             unlock_user_struct(buf, arg1, 1);
11185         }
11186         return ret;
11187 #ifdef TARGET_I386
11188     case TARGET_NR_modify_ldt:
11189         return do_modify_ldt(cpu_env, arg1, arg2, arg3);
11190 #if !defined(TARGET_X86_64)
11191     case TARGET_NR_vm86:
11192         return do_vm86(cpu_env, arg1, arg2);
11193 #endif
11194 #endif
11195 #if defined(TARGET_NR_adjtimex)
11196     case TARGET_NR_adjtimex:
11197         {
11198             struct timex host_buf;
11199 
11200             if (target_to_host_timex(&host_buf, arg1) != 0) {
11201                 return -TARGET_EFAULT;
11202             }
11203             ret = get_errno(adjtimex(&host_buf));
11204             if (!is_error(ret)) {
11205                 if (host_to_target_timex(arg1, &host_buf) != 0) {
11206                     return -TARGET_EFAULT;
11207                 }
11208             }
11209         }
11210         return ret;
11211 #endif
11212 #if defined(TARGET_NR_clock_adjtime) && defined(CONFIG_CLOCK_ADJTIME)
11213     case TARGET_NR_clock_adjtime:
11214         {
11215             struct timex htx;
11216 
11217             if (target_to_host_timex(&htx, arg2) != 0) {
11218                 return -TARGET_EFAULT;
11219             }
11220             ret = get_errno(clock_adjtime(arg1, &htx));
11221             if (!is_error(ret) && host_to_target_timex(arg2, &htx)) {
11222                 return -TARGET_EFAULT;
11223             }
11224         }
11225         return ret;
11226 #endif
11227 #if defined(TARGET_NR_clock_adjtime64) && defined(CONFIG_CLOCK_ADJTIME)
11228     case TARGET_NR_clock_adjtime64:
11229         {
11230             struct timex htx;
11231 
11232             if (target_to_host_timex64(&htx, arg2) != 0) {
11233                 return -TARGET_EFAULT;
11234             }
11235             ret = get_errno(clock_adjtime(arg1, &htx));
11236             if (!is_error(ret) && host_to_target_timex64(arg2, &htx)) {
11237                     return -TARGET_EFAULT;
11238             }
11239         }
11240         return ret;
11241 #endif
11242     case TARGET_NR_getpgid:
11243         return get_errno(getpgid(arg1));
11244     case TARGET_NR_fchdir:
11245         return get_errno(fchdir(arg1));
11246     case TARGET_NR_personality:
11247         return get_errno(personality(arg1));
11248 #ifdef TARGET_NR__llseek /* Not on alpha */
11249     case TARGET_NR__llseek:
11250         {
11251             int64_t res;
11252 #if !defined(__NR_llseek)
11253             res = lseek(arg1, ((uint64_t)arg2 << 32) | (abi_ulong)arg3, arg5);
11254             if (res == -1) {
11255                 ret = get_errno(res);
11256             } else {
11257                 ret = 0;
11258             }
11259 #else
11260             ret = get_errno(_llseek(arg1, arg2, arg3, &res, arg5));
11261 #endif
11262             if ((ret == 0) && put_user_s64(res, arg4)) {
11263                 return -TARGET_EFAULT;
11264             }
11265         }
11266         return ret;
11267 #endif
11268 #ifdef TARGET_NR_getdents
11269     case TARGET_NR_getdents:
11270         return do_getdents(arg1, arg2, arg3);
11271 #endif /* TARGET_NR_getdents */
11272 #if defined(TARGET_NR_getdents64) && defined(__NR_getdents64)
11273     case TARGET_NR_getdents64:
11274         return do_getdents64(arg1, arg2, arg3);
11275 #endif /* TARGET_NR_getdents64 */
11276 #if defined(TARGET_NR__newselect)
11277     case TARGET_NR__newselect:
11278         return do_select(arg1, arg2, arg3, arg4, arg5);
11279 #endif
11280 #ifdef TARGET_NR_poll
11281     case TARGET_NR_poll:
11282         return do_ppoll(arg1, arg2, arg3, arg4, arg5, false, false);
11283 #endif
11284 #ifdef TARGET_NR_ppoll
11285     case TARGET_NR_ppoll:
11286         return do_ppoll(arg1, arg2, arg3, arg4, arg5, true, false);
11287 #endif
11288 #ifdef TARGET_NR_ppoll_time64
11289     case TARGET_NR_ppoll_time64:
11290         return do_ppoll(arg1, arg2, arg3, arg4, arg5, true, true);
11291 #endif
11292     case TARGET_NR_flock:
11293         /* NOTE: the flock constant seems to be the same for every
11294            Linux platform */
11295         return get_errno(safe_flock(arg1, arg2));
11296     case TARGET_NR_readv:
11297         {
11298             struct iovec *vec = lock_iovec(VERIFY_WRITE, arg2, arg3, 0);
11299             if (vec != NULL) {
11300                 ret = get_errno(safe_readv(arg1, vec, arg3));
11301                 unlock_iovec(vec, arg2, arg3, 1);
11302             } else {
11303                 ret = -host_to_target_errno(errno);
11304             }
11305         }
11306         return ret;
11307     case TARGET_NR_writev:
11308         {
11309             struct iovec *vec = lock_iovec(VERIFY_READ, arg2, arg3, 1);
11310             if (vec != NULL) {
11311                 ret = get_errno(safe_writev(arg1, vec, arg3));
11312                 unlock_iovec(vec, arg2, arg3, 0);
11313             } else {
11314                 ret = -host_to_target_errno(errno);
11315             }
11316         }
11317         return ret;
11318 #if defined(TARGET_NR_preadv)
11319     case TARGET_NR_preadv:
11320         {
11321             struct iovec *vec = lock_iovec(VERIFY_WRITE, arg2, arg3, 0);
11322             if (vec != NULL) {
11323                 unsigned long low, high;
11324 
11325                 target_to_host_low_high(arg4, arg5, &low, &high);
11326                 ret = get_errno(safe_preadv(arg1, vec, arg3, low, high));
11327                 unlock_iovec(vec, arg2, arg3, 1);
11328             } else {
11329                 ret = -host_to_target_errno(errno);
11330            }
11331         }
11332         return ret;
11333 #endif
11334 #if defined(TARGET_NR_pwritev)
11335     case TARGET_NR_pwritev:
11336         {
11337             struct iovec *vec = lock_iovec(VERIFY_READ, arg2, arg3, 1);
11338             if (vec != NULL) {
11339                 unsigned long low, high;
11340 
11341                 target_to_host_low_high(arg4, arg5, &low, &high);
11342                 ret = get_errno(safe_pwritev(arg1, vec, arg3, low, high));
11343                 unlock_iovec(vec, arg2, arg3, 0);
11344             } else {
11345                 ret = -host_to_target_errno(errno);
11346            }
11347         }
11348         return ret;
11349 #endif
11350     case TARGET_NR_getsid:
11351         return get_errno(getsid(arg1));
11352 #if defined(TARGET_NR_fdatasync) /* Not on alpha (osf_datasync ?) */
11353     case TARGET_NR_fdatasync:
11354         return get_errno(fdatasync(arg1));
11355 #endif
11356     case TARGET_NR_sched_getaffinity:
11357         {
11358             unsigned int mask_size;
11359             unsigned long *mask;
11360 
11361             /*
11362              * sched_getaffinity needs multiples of ulong, so need to take
11363              * care of mismatches between target ulong and host ulong sizes.
11364              */
11365             if (arg2 & (sizeof(abi_ulong) - 1)) {
11366                 return -TARGET_EINVAL;
11367             }
11368             mask_size = (arg2 + (sizeof(*mask) - 1)) & ~(sizeof(*mask) - 1);
11369 
11370             mask = alloca(mask_size);
11371             memset(mask, 0, mask_size);
11372             ret = get_errno(sys_sched_getaffinity(arg1, mask_size, mask));
11373 
11374             if (!is_error(ret)) {
11375                 if (ret > arg2) {
11376                     /* More data returned than the caller's buffer will fit.
11377                      * This only happens if sizeof(abi_long) < sizeof(long)
11378                      * and the caller passed us a buffer holding an odd number
11379                      * of abi_longs. If the host kernel is actually using the
11380                      * extra 4 bytes then fail EINVAL; otherwise we can just
11381                      * ignore them and only copy the interesting part.
11382                      */
11383                     int numcpus = sysconf(_SC_NPROCESSORS_CONF);
11384                     if (numcpus > arg2 * 8) {
11385                         return -TARGET_EINVAL;
11386                     }
11387                     ret = arg2;
11388                 }
11389 
11390                 if (host_to_target_cpu_mask(mask, mask_size, arg3, ret)) {
11391                     return -TARGET_EFAULT;
11392                 }
11393             }
11394         }
11395         return ret;
11396     case TARGET_NR_sched_setaffinity:
11397         {
11398             unsigned int mask_size;
11399             unsigned long *mask;
11400 
11401             /*
11402              * sched_setaffinity needs multiples of ulong, so need to take
11403              * care of mismatches between target ulong and host ulong sizes.
11404              */
11405             if (arg2 & (sizeof(abi_ulong) - 1)) {
11406                 return -TARGET_EINVAL;
11407             }
11408             mask_size = (arg2 + (sizeof(*mask) - 1)) & ~(sizeof(*mask) - 1);
11409             mask = alloca(mask_size);
11410 
11411             ret = target_to_host_cpu_mask(mask, mask_size, arg3, arg2);
11412             if (ret) {
11413                 return ret;
11414             }
11415 
11416             return get_errno(sys_sched_setaffinity(arg1, mask_size, mask));
11417         }
11418     case TARGET_NR_getcpu:
11419         {
11420             unsigned cpuid, node;
11421             ret = get_errno(sys_getcpu(arg1 ? &cpuid : NULL,
11422                                        arg2 ? &node : NULL,
11423                                        NULL));
11424             if (is_error(ret)) {
11425                 return ret;
11426             }
11427             if (arg1 && put_user_u32(cpuid, arg1)) {
11428                 return -TARGET_EFAULT;
11429             }
11430             if (arg2 && put_user_u32(node, arg2)) {
11431                 return -TARGET_EFAULT;
11432             }
11433         }
11434         return ret;
11435     case TARGET_NR_sched_setparam:
11436         {
11437             struct target_sched_param *target_schp;
11438             struct sched_param schp;
11439 
11440             if (arg2 == 0) {
11441                 return -TARGET_EINVAL;
11442             }
11443             if (!lock_user_struct(VERIFY_READ, target_schp, arg2, 1)) {
11444                 return -TARGET_EFAULT;
11445             }
11446             schp.sched_priority = tswap32(target_schp->sched_priority);
11447             unlock_user_struct(target_schp, arg2, 0);
11448             return get_errno(sys_sched_setparam(arg1, &schp));
11449         }
11450     case TARGET_NR_sched_getparam:
11451         {
11452             struct target_sched_param *target_schp;
11453             struct sched_param schp;
11454 
11455             if (arg2 == 0) {
11456                 return -TARGET_EINVAL;
11457             }
11458             ret = get_errno(sys_sched_getparam(arg1, &schp));
11459             if (!is_error(ret)) {
11460                 if (!lock_user_struct(VERIFY_WRITE, target_schp, arg2, 0)) {
11461                     return -TARGET_EFAULT;
11462                 }
11463                 target_schp->sched_priority = tswap32(schp.sched_priority);
11464                 unlock_user_struct(target_schp, arg2, 1);
11465             }
11466         }
11467         return ret;
11468     case TARGET_NR_sched_setscheduler:
11469         {
11470             struct target_sched_param *target_schp;
11471             struct sched_param schp;
11472             if (arg3 == 0) {
11473                 return -TARGET_EINVAL;
11474             }
11475             if (!lock_user_struct(VERIFY_READ, target_schp, arg3, 1)) {
11476                 return -TARGET_EFAULT;
11477             }
11478             schp.sched_priority = tswap32(target_schp->sched_priority);
11479             unlock_user_struct(target_schp, arg3, 0);
11480             return get_errno(sys_sched_setscheduler(arg1, arg2, &schp));
11481         }
11482     case TARGET_NR_sched_getscheduler:
11483         return get_errno(sys_sched_getscheduler(arg1));
11484     case TARGET_NR_sched_getattr:
11485         {
11486             struct target_sched_attr *target_scha;
11487             struct sched_attr scha;
11488             if (arg2 == 0) {
11489                 return -TARGET_EINVAL;
11490             }
11491             if (arg3 > sizeof(scha)) {
11492                 arg3 = sizeof(scha);
11493             }
11494             ret = get_errno(sys_sched_getattr(arg1, &scha, arg3, arg4));
11495             if (!is_error(ret)) {
11496                 target_scha = lock_user(VERIFY_WRITE, arg2, arg3, 0);
11497                 if (!target_scha) {
11498                     return -TARGET_EFAULT;
11499                 }
11500                 target_scha->size = tswap32(scha.size);
11501                 target_scha->sched_policy = tswap32(scha.sched_policy);
11502                 target_scha->sched_flags = tswap64(scha.sched_flags);
11503                 target_scha->sched_nice = tswap32(scha.sched_nice);
11504                 target_scha->sched_priority = tswap32(scha.sched_priority);
11505                 target_scha->sched_runtime = tswap64(scha.sched_runtime);
11506                 target_scha->sched_deadline = tswap64(scha.sched_deadline);
11507                 target_scha->sched_period = tswap64(scha.sched_period);
11508                 if (scha.size > offsetof(struct sched_attr, sched_util_min)) {
11509                     target_scha->sched_util_min = tswap32(scha.sched_util_min);
11510                     target_scha->sched_util_max = tswap32(scha.sched_util_max);
11511                 }
11512                 unlock_user(target_scha, arg2, arg3);
11513             }
11514             return ret;
11515         }
11516     case TARGET_NR_sched_setattr:
11517         {
11518             struct target_sched_attr *target_scha;
11519             struct sched_attr scha;
11520             uint32_t size;
11521             int zeroed;
11522             if (arg2 == 0) {
11523                 return -TARGET_EINVAL;
11524             }
11525             if (get_user_u32(size, arg2)) {
11526                 return -TARGET_EFAULT;
11527             }
11528             if (!size) {
11529                 size = offsetof(struct target_sched_attr, sched_util_min);
11530             }
11531             if (size < offsetof(struct target_sched_attr, sched_util_min)) {
11532                 if (put_user_u32(sizeof(struct target_sched_attr), arg2)) {
11533                     return -TARGET_EFAULT;
11534                 }
11535                 return -TARGET_E2BIG;
11536             }
11537 
11538             zeroed = check_zeroed_user(arg2, sizeof(struct target_sched_attr), size);
11539             if (zeroed < 0) {
11540                 return zeroed;
11541             } else if (zeroed == 0) {
11542                 if (put_user_u32(sizeof(struct target_sched_attr), arg2)) {
11543                     return -TARGET_EFAULT;
11544                 }
11545                 return -TARGET_E2BIG;
11546             }
11547             if (size > sizeof(struct target_sched_attr)) {
11548                 size = sizeof(struct target_sched_attr);
11549             }
11550 
11551             target_scha = lock_user(VERIFY_READ, arg2, size, 1);
11552             if (!target_scha) {
11553                 return -TARGET_EFAULT;
11554             }
11555             scha.size = size;
11556             scha.sched_policy = tswap32(target_scha->sched_policy);
11557             scha.sched_flags = tswap64(target_scha->sched_flags);
11558             scha.sched_nice = tswap32(target_scha->sched_nice);
11559             scha.sched_priority = tswap32(target_scha->sched_priority);
11560             scha.sched_runtime = tswap64(target_scha->sched_runtime);
11561             scha.sched_deadline = tswap64(target_scha->sched_deadline);
11562             scha.sched_period = tswap64(target_scha->sched_period);
11563             if (size > offsetof(struct target_sched_attr, sched_util_min)) {
11564                 scha.sched_util_min = tswap32(target_scha->sched_util_min);
11565                 scha.sched_util_max = tswap32(target_scha->sched_util_max);
11566             }
11567             unlock_user(target_scha, arg2, 0);
11568             return get_errno(sys_sched_setattr(arg1, &scha, arg3));
11569         }
11570     case TARGET_NR_sched_yield:
11571         return get_errno(sched_yield());
11572     case TARGET_NR_sched_get_priority_max:
11573         return get_errno(sched_get_priority_max(arg1));
11574     case TARGET_NR_sched_get_priority_min:
11575         return get_errno(sched_get_priority_min(arg1));
11576 #ifdef TARGET_NR_sched_rr_get_interval
11577     case TARGET_NR_sched_rr_get_interval:
11578         {
11579             struct timespec ts;
11580             ret = get_errno(sched_rr_get_interval(arg1, &ts));
11581             if (!is_error(ret)) {
11582                 ret = host_to_target_timespec(arg2, &ts);
11583             }
11584         }
11585         return ret;
11586 #endif
11587 #ifdef TARGET_NR_sched_rr_get_interval_time64
11588     case TARGET_NR_sched_rr_get_interval_time64:
11589         {
11590             struct timespec ts;
11591             ret = get_errno(sched_rr_get_interval(arg1, &ts));
11592             if (!is_error(ret)) {
11593                 ret = host_to_target_timespec64(arg2, &ts);
11594             }
11595         }
11596         return ret;
11597 #endif
11598 #if defined(TARGET_NR_nanosleep)
11599     case TARGET_NR_nanosleep:
11600         {
11601             struct timespec req, rem;
11602             target_to_host_timespec(&req, arg1);
11603             ret = get_errno(safe_nanosleep(&req, &rem));
11604             if (is_error(ret) && arg2) {
11605                 host_to_target_timespec(arg2, &rem);
11606             }
11607         }
11608         return ret;
11609 #endif
11610     case TARGET_NR_prctl:
11611         return do_prctl(cpu_env, arg1, arg2, arg3, arg4, arg5);
11612         break;
11613 #ifdef TARGET_NR_arch_prctl
11614     case TARGET_NR_arch_prctl:
11615         return do_arch_prctl(cpu_env, arg1, arg2);
11616 #endif
11617 #ifdef TARGET_NR_pread64
11618     case TARGET_NR_pread64:
11619         if (regpairs_aligned(cpu_env, num)) {
11620             arg4 = arg5;
11621             arg5 = arg6;
11622         }
11623         if (arg2 == 0 && arg3 == 0) {
11624             /* Special-case NULL buffer and zero length, which should succeed */
11625             p = 0;
11626         } else {
11627             p = lock_user(VERIFY_WRITE, arg2, arg3, 0);
11628             if (!p) {
11629                 return -TARGET_EFAULT;
11630             }
11631         }
11632         ret = get_errno(pread(arg1, p, arg3, target_offset64(arg4, arg5)));
11633         unlock_user(p, arg2, ret);
11634         return ret;
11635     case TARGET_NR_pwrite64:
11636         if (regpairs_aligned(cpu_env, num)) {
11637             arg4 = arg5;
11638             arg5 = arg6;
11639         }
11640         if (arg2 == 0 && arg3 == 0) {
11641             /* Special-case NULL buffer and zero length, which should succeed */
11642             p = 0;
11643         } else {
11644             p = lock_user(VERIFY_READ, arg2, arg3, 1);
11645             if (!p) {
11646                 return -TARGET_EFAULT;
11647             }
11648         }
11649         ret = get_errno(pwrite(arg1, p, arg3, target_offset64(arg4, arg5)));
11650         unlock_user(p, arg2, 0);
11651         return ret;
11652 #endif
11653     case TARGET_NR_getcwd:
11654         if (!(p = lock_user(VERIFY_WRITE, arg1, arg2, 0)))
11655             return -TARGET_EFAULT;
11656         ret = get_errno(sys_getcwd1(p, arg2));
11657         unlock_user(p, arg1, ret);
11658         return ret;
11659     case TARGET_NR_capget:
11660     case TARGET_NR_capset:
11661     {
11662         struct target_user_cap_header *target_header;
11663         struct target_user_cap_data *target_data = NULL;
11664         struct __user_cap_header_struct header;
11665         struct __user_cap_data_struct data[2];
11666         struct __user_cap_data_struct *dataptr = NULL;
11667         int i, target_datalen;
11668         int data_items = 1;
11669 
11670         if (!lock_user_struct(VERIFY_WRITE, target_header, arg1, 1)) {
11671             return -TARGET_EFAULT;
11672         }
11673         header.version = tswap32(target_header->version);
11674         header.pid = tswap32(target_header->pid);
11675 
11676         if (header.version != _LINUX_CAPABILITY_VERSION) {
11677             /* Version 2 and up takes pointer to two user_data structs */
11678             data_items = 2;
11679         }
11680 
11681         target_datalen = sizeof(*target_data) * data_items;
11682 
11683         if (arg2) {
11684             if (num == TARGET_NR_capget) {
11685                 target_data = lock_user(VERIFY_WRITE, arg2, target_datalen, 0);
11686             } else {
11687                 target_data = lock_user(VERIFY_READ, arg2, target_datalen, 1);
11688             }
11689             if (!target_data) {
11690                 unlock_user_struct(target_header, arg1, 0);
11691                 return -TARGET_EFAULT;
11692             }
11693 
11694             if (num == TARGET_NR_capset) {
11695                 for (i = 0; i < data_items; i++) {
11696                     data[i].effective = tswap32(target_data[i].effective);
11697                     data[i].permitted = tswap32(target_data[i].permitted);
11698                     data[i].inheritable = tswap32(target_data[i].inheritable);
11699                 }
11700             }
11701 
11702             dataptr = data;
11703         }
11704 
11705         if (num == TARGET_NR_capget) {
11706             ret = get_errno(capget(&header, dataptr));
11707         } else {
11708             ret = get_errno(capset(&header, dataptr));
11709         }
11710 
11711         /* The kernel always updates version for both capget and capset */
11712         target_header->version = tswap32(header.version);
11713         unlock_user_struct(target_header, arg1, 1);
11714 
11715         if (arg2) {
11716             if (num == TARGET_NR_capget) {
11717                 for (i = 0; i < data_items; i++) {
11718                     target_data[i].effective = tswap32(data[i].effective);
11719                     target_data[i].permitted = tswap32(data[i].permitted);
11720                     target_data[i].inheritable = tswap32(data[i].inheritable);
11721                 }
11722                 unlock_user(target_data, arg2, target_datalen);
11723             } else {
11724                 unlock_user(target_data, arg2, 0);
11725             }
11726         }
11727         return ret;
11728     }
11729     case TARGET_NR_sigaltstack:
11730         return do_sigaltstack(arg1, arg2, cpu_env);
11731 
11732 #ifdef CONFIG_SENDFILE
11733 #ifdef TARGET_NR_sendfile
11734     case TARGET_NR_sendfile:
11735     {
11736         off_t *offp = NULL;
11737         off_t off;
11738         if (arg3) {
11739             ret = get_user_sal(off, arg3);
11740             if (is_error(ret)) {
11741                 return ret;
11742             }
11743             offp = &off;
11744         }
11745         ret = get_errno(sendfile(arg1, arg2, offp, arg4));
11746         if (!is_error(ret) && arg3) {
11747             abi_long ret2 = put_user_sal(off, arg3);
11748             if (is_error(ret2)) {
11749                 ret = ret2;
11750             }
11751         }
11752         return ret;
11753     }
11754 #endif
11755 #ifdef TARGET_NR_sendfile64
11756     case TARGET_NR_sendfile64:
11757     {
11758         off_t *offp = NULL;
11759         off_t off;
11760         if (arg3) {
11761             ret = get_user_s64(off, arg3);
11762             if (is_error(ret)) {
11763                 return ret;
11764             }
11765             offp = &off;
11766         }
11767         ret = get_errno(sendfile(arg1, arg2, offp, arg4));
11768         if (!is_error(ret) && arg3) {
11769             abi_long ret2 = put_user_s64(off, arg3);
11770             if (is_error(ret2)) {
11771                 ret = ret2;
11772             }
11773         }
11774         return ret;
11775     }
11776 #endif
11777 #endif
11778 #ifdef TARGET_NR_vfork
11779     case TARGET_NR_vfork:
11780         return get_errno(do_fork(cpu_env,
11781                          CLONE_VFORK | CLONE_VM | TARGET_SIGCHLD,
11782                          0, 0, 0, 0));
11783 #endif
11784 #ifdef TARGET_NR_ugetrlimit
11785     case TARGET_NR_ugetrlimit:
11786     {
11787 	struct rlimit rlim;
11788 	int resource = target_to_host_resource(arg1);
11789 	ret = get_errno(getrlimit(resource, &rlim));
11790 	if (!is_error(ret)) {
11791 	    struct target_rlimit *target_rlim;
11792             if (!lock_user_struct(VERIFY_WRITE, target_rlim, arg2, 0))
11793                 return -TARGET_EFAULT;
11794 	    target_rlim->rlim_cur = host_to_target_rlim(rlim.rlim_cur);
11795 	    target_rlim->rlim_max = host_to_target_rlim(rlim.rlim_max);
11796             unlock_user_struct(target_rlim, arg2, 1);
11797 	}
11798         return ret;
11799     }
11800 #endif
11801 #ifdef TARGET_NR_truncate64
11802     case TARGET_NR_truncate64:
11803         if (!(p = lock_user_string(arg1)))
11804             return -TARGET_EFAULT;
11805 	ret = target_truncate64(cpu_env, p, arg2, arg3, arg4);
11806         unlock_user(p, arg1, 0);
11807         return ret;
11808 #endif
11809 #ifdef TARGET_NR_ftruncate64
11810     case TARGET_NR_ftruncate64:
11811         return target_ftruncate64(cpu_env, arg1, arg2, arg3, arg4);
11812 #endif
11813 #ifdef TARGET_NR_stat64
11814     case TARGET_NR_stat64:
11815         if (!(p = lock_user_string(arg1))) {
11816             return -TARGET_EFAULT;
11817         }
11818         ret = get_errno(stat(path(p), &st));
11819         unlock_user(p, arg1, 0);
11820         if (!is_error(ret))
11821             ret = host_to_target_stat64(cpu_env, arg2, &st);
11822         return ret;
11823 #endif
11824 #ifdef TARGET_NR_lstat64
11825     case TARGET_NR_lstat64:
11826         if (!(p = lock_user_string(arg1))) {
11827             return -TARGET_EFAULT;
11828         }
11829         ret = get_errno(lstat(path(p), &st));
11830         unlock_user(p, arg1, 0);
11831         if (!is_error(ret))
11832             ret = host_to_target_stat64(cpu_env, arg2, &st);
11833         return ret;
11834 #endif
11835 #ifdef TARGET_NR_fstat64
11836     case TARGET_NR_fstat64:
11837         ret = get_errno(fstat(arg1, &st));
11838         if (!is_error(ret))
11839             ret = host_to_target_stat64(cpu_env, arg2, &st);
11840         return ret;
11841 #endif
11842 #if (defined(TARGET_NR_fstatat64) || defined(TARGET_NR_newfstatat))
11843 #ifdef TARGET_NR_fstatat64
11844     case TARGET_NR_fstatat64:
11845 #endif
11846 #ifdef TARGET_NR_newfstatat
11847     case TARGET_NR_newfstatat:
11848 #endif
11849         if (!(p = lock_user_string(arg2))) {
11850             return -TARGET_EFAULT;
11851         }
11852         ret = get_errno(fstatat(arg1, path(p), &st, arg4));
11853         unlock_user(p, arg2, 0);
11854         if (!is_error(ret))
11855             ret = host_to_target_stat64(cpu_env, arg3, &st);
11856         return ret;
11857 #endif
11858 #if defined(TARGET_NR_statx)
11859     case TARGET_NR_statx:
11860         {
11861             struct target_statx *target_stx;
11862             int dirfd = arg1;
11863             int flags = arg3;
11864 
11865             p = lock_user_string(arg2);
11866             if (p == NULL) {
11867                 return -TARGET_EFAULT;
11868             }
11869 #if defined(__NR_statx)
11870             {
11871                 /*
11872                  * It is assumed that struct statx is architecture independent.
11873                  */
11874                 struct target_statx host_stx;
11875                 int mask = arg4;
11876 
11877                 ret = get_errno(sys_statx(dirfd, p, flags, mask, &host_stx));
11878                 if (!is_error(ret)) {
11879                     if (host_to_target_statx(&host_stx, arg5) != 0) {
11880                         unlock_user(p, arg2, 0);
11881                         return -TARGET_EFAULT;
11882                     }
11883                 }
11884 
11885                 if (ret != -TARGET_ENOSYS) {
11886                     unlock_user(p, arg2, 0);
11887                     return ret;
11888                 }
11889             }
11890 #endif
11891             ret = get_errno(fstatat(dirfd, path(p), &st, flags));
11892             unlock_user(p, arg2, 0);
11893 
11894             if (!is_error(ret)) {
11895                 if (!lock_user_struct(VERIFY_WRITE, target_stx, arg5, 0)) {
11896                     return -TARGET_EFAULT;
11897                 }
11898                 memset(target_stx, 0, sizeof(*target_stx));
11899                 __put_user(major(st.st_dev), &target_stx->stx_dev_major);
11900                 __put_user(minor(st.st_dev), &target_stx->stx_dev_minor);
11901                 __put_user(st.st_ino, &target_stx->stx_ino);
11902                 __put_user(st.st_mode, &target_stx->stx_mode);
11903                 __put_user(st.st_uid, &target_stx->stx_uid);
11904                 __put_user(st.st_gid, &target_stx->stx_gid);
11905                 __put_user(st.st_nlink, &target_stx->stx_nlink);
11906                 __put_user(major(st.st_rdev), &target_stx->stx_rdev_major);
11907                 __put_user(minor(st.st_rdev), &target_stx->stx_rdev_minor);
11908                 __put_user(st.st_size, &target_stx->stx_size);
11909                 __put_user(st.st_blksize, &target_stx->stx_blksize);
11910                 __put_user(st.st_blocks, &target_stx->stx_blocks);
11911                 __put_user(st.st_atime, &target_stx->stx_atime.tv_sec);
11912                 __put_user(st.st_mtime, &target_stx->stx_mtime.tv_sec);
11913                 __put_user(st.st_ctime, &target_stx->stx_ctime.tv_sec);
11914                 unlock_user_struct(target_stx, arg5, 1);
11915             }
11916         }
11917         return ret;
11918 #endif
11919 #ifdef TARGET_NR_lchown
11920     case TARGET_NR_lchown:
11921         if (!(p = lock_user_string(arg1)))
11922             return -TARGET_EFAULT;
11923         ret = get_errno(lchown(p, low2highuid(arg2), low2highgid(arg3)));
11924         unlock_user(p, arg1, 0);
11925         return ret;
11926 #endif
11927 #ifdef TARGET_NR_getuid
11928     case TARGET_NR_getuid:
11929         return get_errno(high2lowuid(getuid()));
11930 #endif
11931 #ifdef TARGET_NR_getgid
11932     case TARGET_NR_getgid:
11933         return get_errno(high2lowgid(getgid()));
11934 #endif
11935 #ifdef TARGET_NR_geteuid
11936     case TARGET_NR_geteuid:
11937         return get_errno(high2lowuid(geteuid()));
11938 #endif
11939 #ifdef TARGET_NR_getegid
11940     case TARGET_NR_getegid:
11941         return get_errno(high2lowgid(getegid()));
11942 #endif
11943     case TARGET_NR_setreuid:
11944         return get_errno(sys_setreuid(low2highuid(arg1), low2highuid(arg2)));
11945     case TARGET_NR_setregid:
11946         return get_errno(sys_setregid(low2highgid(arg1), low2highgid(arg2)));
11947     case TARGET_NR_getgroups:
11948         { /* the same code as for TARGET_NR_getgroups32 */
11949             int gidsetsize = arg1;
11950             target_id *target_grouplist;
11951             g_autofree gid_t *grouplist = NULL;
11952             int i;
11953 
11954             if (gidsetsize > NGROUPS_MAX || gidsetsize < 0) {
11955                 return -TARGET_EINVAL;
11956             }
11957             if (gidsetsize > 0) {
11958                 grouplist = g_try_new(gid_t, gidsetsize);
11959                 if (!grouplist) {
11960                     return -TARGET_ENOMEM;
11961                 }
11962             }
11963             ret = get_errno(getgroups(gidsetsize, grouplist));
11964             if (!is_error(ret) && gidsetsize > 0) {
11965                 target_grouplist = lock_user(VERIFY_WRITE, arg2,
11966                                              gidsetsize * sizeof(target_id), 0);
11967                 if (!target_grouplist) {
11968                     return -TARGET_EFAULT;
11969                 }
11970                 for (i = 0; i < ret; i++) {
11971                     target_grouplist[i] = tswapid(high2lowgid(grouplist[i]));
11972                 }
11973                 unlock_user(target_grouplist, arg2,
11974                             gidsetsize * sizeof(target_id));
11975             }
11976             return ret;
11977         }
11978     case TARGET_NR_setgroups:
11979         { /* the same code as for TARGET_NR_setgroups32 */
11980             int gidsetsize = arg1;
11981             target_id *target_grouplist;
11982             g_autofree gid_t *grouplist = NULL;
11983             int i;
11984 
11985             if (gidsetsize > NGROUPS_MAX || gidsetsize < 0) {
11986                 return -TARGET_EINVAL;
11987             }
11988             if (gidsetsize > 0) {
11989                 grouplist = g_try_new(gid_t, gidsetsize);
11990                 if (!grouplist) {
11991                     return -TARGET_ENOMEM;
11992                 }
11993                 target_grouplist = lock_user(VERIFY_READ, arg2,
11994                                              gidsetsize * sizeof(target_id), 1);
11995                 if (!target_grouplist) {
11996                     return -TARGET_EFAULT;
11997                 }
11998                 for (i = 0; i < gidsetsize; i++) {
11999                     grouplist[i] = low2highgid(tswapid(target_grouplist[i]));
12000                 }
12001                 unlock_user(target_grouplist, arg2,
12002                             gidsetsize * sizeof(target_id));
12003             }
12004             return get_errno(sys_setgroups(gidsetsize, grouplist));
12005         }
12006     case TARGET_NR_fchown:
12007         return get_errno(fchown(arg1, low2highuid(arg2), low2highgid(arg3)));
12008 #if defined(TARGET_NR_fchownat)
12009     case TARGET_NR_fchownat:
12010         if (!(p = lock_user_string(arg2)))
12011             return -TARGET_EFAULT;
12012         ret = get_errno(fchownat(arg1, p, low2highuid(arg3),
12013                                  low2highgid(arg4), arg5));
12014         unlock_user(p, arg2, 0);
12015         return ret;
12016 #endif
12017 #ifdef TARGET_NR_setresuid
12018     case TARGET_NR_setresuid:
12019         return get_errno(sys_setresuid(low2highuid(arg1),
12020                                        low2highuid(arg2),
12021                                        low2highuid(arg3)));
12022 #endif
12023 #ifdef TARGET_NR_getresuid
12024     case TARGET_NR_getresuid:
12025         {
12026             uid_t ruid, euid, suid;
12027             ret = get_errno(getresuid(&ruid, &euid, &suid));
12028             if (!is_error(ret)) {
12029                 if (put_user_id(high2lowuid(ruid), arg1)
12030                     || put_user_id(high2lowuid(euid), arg2)
12031                     || put_user_id(high2lowuid(suid), arg3))
12032                     return -TARGET_EFAULT;
12033             }
12034         }
12035         return ret;
12036 #endif
12037 #ifdef TARGET_NR_getresgid
12038     case TARGET_NR_setresgid:
12039         return get_errno(sys_setresgid(low2highgid(arg1),
12040                                        low2highgid(arg2),
12041                                        low2highgid(arg3)));
12042 #endif
12043 #ifdef TARGET_NR_getresgid
12044     case TARGET_NR_getresgid:
12045         {
12046             gid_t rgid, egid, sgid;
12047             ret = get_errno(getresgid(&rgid, &egid, &sgid));
12048             if (!is_error(ret)) {
12049                 if (put_user_id(high2lowgid(rgid), arg1)
12050                     || put_user_id(high2lowgid(egid), arg2)
12051                     || put_user_id(high2lowgid(sgid), arg3))
12052                     return -TARGET_EFAULT;
12053             }
12054         }
12055         return ret;
12056 #endif
12057 #ifdef TARGET_NR_chown
12058     case TARGET_NR_chown:
12059         if (!(p = lock_user_string(arg1)))
12060             return -TARGET_EFAULT;
12061         ret = get_errno(chown(p, low2highuid(arg2), low2highgid(arg3)));
12062         unlock_user(p, arg1, 0);
12063         return ret;
12064 #endif
12065     case TARGET_NR_setuid:
12066         return get_errno(sys_setuid(low2highuid(arg1)));
12067     case TARGET_NR_setgid:
12068         return get_errno(sys_setgid(low2highgid(arg1)));
12069     case TARGET_NR_setfsuid:
12070         return get_errno(setfsuid(arg1));
12071     case TARGET_NR_setfsgid:
12072         return get_errno(setfsgid(arg1));
12073 
12074 #ifdef TARGET_NR_lchown32
12075     case TARGET_NR_lchown32:
12076         if (!(p = lock_user_string(arg1)))
12077             return -TARGET_EFAULT;
12078         ret = get_errno(lchown(p, arg2, arg3));
12079         unlock_user(p, arg1, 0);
12080         return ret;
12081 #endif
12082 #ifdef TARGET_NR_getuid32
12083     case TARGET_NR_getuid32:
12084         return get_errno(getuid());
12085 #endif
12086 
12087 #if defined(TARGET_NR_getxuid) && defined(TARGET_ALPHA)
12088    /* Alpha specific */
12089     case TARGET_NR_getxuid:
12090          {
12091             uid_t euid;
12092             euid=geteuid();
12093             cpu_env->ir[IR_A4]=euid;
12094          }
12095         return get_errno(getuid());
12096 #endif
12097 #if defined(TARGET_NR_getxgid) && defined(TARGET_ALPHA)
12098    /* Alpha specific */
12099     case TARGET_NR_getxgid:
12100          {
12101             uid_t egid;
12102             egid=getegid();
12103             cpu_env->ir[IR_A4]=egid;
12104          }
12105         return get_errno(getgid());
12106 #endif
12107 #if defined(TARGET_NR_osf_getsysinfo) && defined(TARGET_ALPHA)
12108     /* Alpha specific */
12109     case TARGET_NR_osf_getsysinfo:
12110         ret = -TARGET_EOPNOTSUPP;
12111         switch (arg1) {
12112           case TARGET_GSI_IEEE_FP_CONTROL:
12113             {
12114                 uint64_t fpcr = cpu_alpha_load_fpcr(cpu_env);
12115                 uint64_t swcr = cpu_env->swcr;
12116 
12117                 swcr &= ~SWCR_STATUS_MASK;
12118                 swcr |= (fpcr >> 35) & SWCR_STATUS_MASK;
12119 
12120                 if (put_user_u64 (swcr, arg2))
12121                         return -TARGET_EFAULT;
12122                 ret = 0;
12123             }
12124             break;
12125 
12126           /* case GSI_IEEE_STATE_AT_SIGNAL:
12127              -- Not implemented in linux kernel.
12128              case GSI_UACPROC:
12129              -- Retrieves current unaligned access state; not much used.
12130              case GSI_PROC_TYPE:
12131              -- Retrieves implver information; surely not used.
12132              case GSI_GET_HWRPB:
12133              -- Grabs a copy of the HWRPB; surely not used.
12134           */
12135         }
12136         return ret;
12137 #endif
12138 #if defined(TARGET_NR_osf_setsysinfo) && defined(TARGET_ALPHA)
12139     /* Alpha specific */
12140     case TARGET_NR_osf_setsysinfo:
12141         ret = -TARGET_EOPNOTSUPP;
12142         switch (arg1) {
12143           case TARGET_SSI_IEEE_FP_CONTROL:
12144             {
12145                 uint64_t swcr, fpcr;
12146 
12147                 if (get_user_u64 (swcr, arg2)) {
12148                     return -TARGET_EFAULT;
12149                 }
12150 
12151                 /*
12152                  * The kernel calls swcr_update_status to update the
12153                  * status bits from the fpcr at every point that it
12154                  * could be queried.  Therefore, we store the status
12155                  * bits only in FPCR.
12156                  */
12157                 cpu_env->swcr = swcr & (SWCR_TRAP_ENABLE_MASK | SWCR_MAP_MASK);
12158 
12159                 fpcr = cpu_alpha_load_fpcr(cpu_env);
12160                 fpcr &= ((uint64_t)FPCR_DYN_MASK << 32);
12161                 fpcr |= alpha_ieee_swcr_to_fpcr(swcr);
12162                 cpu_alpha_store_fpcr(cpu_env, fpcr);
12163                 ret = 0;
12164             }
12165             break;
12166 
12167           case TARGET_SSI_IEEE_RAISE_EXCEPTION:
12168             {
12169                 uint64_t exc, fpcr, fex;
12170 
12171                 if (get_user_u64(exc, arg2)) {
12172                     return -TARGET_EFAULT;
12173                 }
12174                 exc &= SWCR_STATUS_MASK;
12175                 fpcr = cpu_alpha_load_fpcr(cpu_env);
12176 
12177                 /* Old exceptions are not signaled.  */
12178                 fex = alpha_ieee_fpcr_to_swcr(fpcr);
12179                 fex = exc & ~fex;
12180                 fex >>= SWCR_STATUS_TO_EXCSUM_SHIFT;
12181                 fex &= (cpu_env)->swcr;
12182 
12183                 /* Update the hardware fpcr.  */
12184                 fpcr |= alpha_ieee_swcr_to_fpcr(exc);
12185                 cpu_alpha_store_fpcr(cpu_env, fpcr);
12186 
12187                 if (fex) {
12188                     int si_code = TARGET_FPE_FLTUNK;
12189                     target_siginfo_t info;
12190 
12191                     if (fex & SWCR_TRAP_ENABLE_DNO) {
12192                         si_code = TARGET_FPE_FLTUND;
12193                     }
12194                     if (fex & SWCR_TRAP_ENABLE_INE) {
12195                         si_code = TARGET_FPE_FLTRES;
12196                     }
12197                     if (fex & SWCR_TRAP_ENABLE_UNF) {
12198                         si_code = TARGET_FPE_FLTUND;
12199                     }
12200                     if (fex & SWCR_TRAP_ENABLE_OVF) {
12201                         si_code = TARGET_FPE_FLTOVF;
12202                     }
12203                     if (fex & SWCR_TRAP_ENABLE_DZE) {
12204                         si_code = TARGET_FPE_FLTDIV;
12205                     }
12206                     if (fex & SWCR_TRAP_ENABLE_INV) {
12207                         si_code = TARGET_FPE_FLTINV;
12208                     }
12209 
12210                     info.si_signo = SIGFPE;
12211                     info.si_errno = 0;
12212                     info.si_code = si_code;
12213                     info._sifields._sigfault._addr = (cpu_env)->pc;
12214                     queue_signal(cpu_env, info.si_signo,
12215                                  QEMU_SI_FAULT, &info);
12216                 }
12217                 ret = 0;
12218             }
12219             break;
12220 
12221           /* case SSI_NVPAIRS:
12222              -- Used with SSIN_UACPROC to enable unaligned accesses.
12223              case SSI_IEEE_STATE_AT_SIGNAL:
12224              case SSI_IEEE_IGNORE_STATE_AT_SIGNAL:
12225              -- Not implemented in linux kernel
12226           */
12227         }
12228         return ret;
12229 #endif
12230 #ifdef TARGET_NR_osf_sigprocmask
12231     /* Alpha specific.  */
12232     case TARGET_NR_osf_sigprocmask:
12233         {
12234             abi_ulong mask;
12235             int how;
12236             sigset_t set, oldset;
12237 
12238             switch(arg1) {
12239             case TARGET_SIG_BLOCK:
12240                 how = SIG_BLOCK;
12241                 break;
12242             case TARGET_SIG_UNBLOCK:
12243                 how = SIG_UNBLOCK;
12244                 break;
12245             case TARGET_SIG_SETMASK:
12246                 how = SIG_SETMASK;
12247                 break;
12248             default:
12249                 return -TARGET_EINVAL;
12250             }
12251             mask = arg2;
12252             target_to_host_old_sigset(&set, &mask);
12253             ret = do_sigprocmask(how, &set, &oldset);
12254             if (!ret) {
12255                 host_to_target_old_sigset(&mask, &oldset);
12256                 ret = mask;
12257             }
12258         }
12259         return ret;
12260 #endif
12261 
12262 #ifdef TARGET_NR_getgid32
12263     case TARGET_NR_getgid32:
12264         return get_errno(getgid());
12265 #endif
12266 #ifdef TARGET_NR_geteuid32
12267     case TARGET_NR_geteuid32:
12268         return get_errno(geteuid());
12269 #endif
12270 #ifdef TARGET_NR_getegid32
12271     case TARGET_NR_getegid32:
12272         return get_errno(getegid());
12273 #endif
12274 #ifdef TARGET_NR_setreuid32
12275     case TARGET_NR_setreuid32:
12276         return get_errno(sys_setreuid(arg1, arg2));
12277 #endif
12278 #ifdef TARGET_NR_setregid32
12279     case TARGET_NR_setregid32:
12280         return get_errno(sys_setregid(arg1, arg2));
12281 #endif
12282 #ifdef TARGET_NR_getgroups32
12283     case TARGET_NR_getgroups32:
12284         { /* the same code as for TARGET_NR_getgroups */
12285             int gidsetsize = arg1;
12286             uint32_t *target_grouplist;
12287             g_autofree gid_t *grouplist = NULL;
12288             int i;
12289 
12290             if (gidsetsize > NGROUPS_MAX || gidsetsize < 0) {
12291                 return -TARGET_EINVAL;
12292             }
12293             if (gidsetsize > 0) {
12294                 grouplist = g_try_new(gid_t, gidsetsize);
12295                 if (!grouplist) {
12296                     return -TARGET_ENOMEM;
12297                 }
12298             }
12299             ret = get_errno(getgroups(gidsetsize, grouplist));
12300             if (!is_error(ret) && gidsetsize > 0) {
12301                 target_grouplist = lock_user(VERIFY_WRITE, arg2,
12302                                              gidsetsize * 4, 0);
12303                 if (!target_grouplist) {
12304                     return -TARGET_EFAULT;
12305                 }
12306                 for (i = 0; i < ret; i++) {
12307                     target_grouplist[i] = tswap32(grouplist[i]);
12308                 }
12309                 unlock_user(target_grouplist, arg2, gidsetsize * 4);
12310             }
12311             return ret;
12312         }
12313 #endif
12314 #ifdef TARGET_NR_setgroups32
12315     case TARGET_NR_setgroups32:
12316         { /* the same code as for TARGET_NR_setgroups */
12317             int gidsetsize = arg1;
12318             uint32_t *target_grouplist;
12319             g_autofree gid_t *grouplist = NULL;
12320             int i;
12321 
12322             if (gidsetsize > NGROUPS_MAX || gidsetsize < 0) {
12323                 return -TARGET_EINVAL;
12324             }
12325             if (gidsetsize > 0) {
12326                 grouplist = g_try_new(gid_t, gidsetsize);
12327                 if (!grouplist) {
12328                     return -TARGET_ENOMEM;
12329                 }
12330                 target_grouplist = lock_user(VERIFY_READ, arg2,
12331                                              gidsetsize * 4, 1);
12332                 if (!target_grouplist) {
12333                     return -TARGET_EFAULT;
12334                 }
12335                 for (i = 0; i < gidsetsize; i++) {
12336                     grouplist[i] = tswap32(target_grouplist[i]);
12337                 }
12338                 unlock_user(target_grouplist, arg2, 0);
12339             }
12340             return get_errno(sys_setgroups(gidsetsize, grouplist));
12341         }
12342 #endif
12343 #ifdef TARGET_NR_fchown32
12344     case TARGET_NR_fchown32:
12345         return get_errno(fchown(arg1, arg2, arg3));
12346 #endif
12347 #ifdef TARGET_NR_setresuid32
12348     case TARGET_NR_setresuid32:
12349         return get_errno(sys_setresuid(arg1, arg2, arg3));
12350 #endif
12351 #ifdef TARGET_NR_getresuid32
12352     case TARGET_NR_getresuid32:
12353         {
12354             uid_t ruid, euid, suid;
12355             ret = get_errno(getresuid(&ruid, &euid, &suid));
12356             if (!is_error(ret)) {
12357                 if (put_user_u32(ruid, arg1)
12358                     || put_user_u32(euid, arg2)
12359                     || put_user_u32(suid, arg3))
12360                     return -TARGET_EFAULT;
12361             }
12362         }
12363         return ret;
12364 #endif
12365 #ifdef TARGET_NR_setresgid32
12366     case TARGET_NR_setresgid32:
12367         return get_errno(sys_setresgid(arg1, arg2, arg3));
12368 #endif
12369 #ifdef TARGET_NR_getresgid32
12370     case TARGET_NR_getresgid32:
12371         {
12372             gid_t rgid, egid, sgid;
12373             ret = get_errno(getresgid(&rgid, &egid, &sgid));
12374             if (!is_error(ret)) {
12375                 if (put_user_u32(rgid, arg1)
12376                     || put_user_u32(egid, arg2)
12377                     || put_user_u32(sgid, arg3))
12378                     return -TARGET_EFAULT;
12379             }
12380         }
12381         return ret;
12382 #endif
12383 #ifdef TARGET_NR_chown32
12384     case TARGET_NR_chown32:
12385         if (!(p = lock_user_string(arg1)))
12386             return -TARGET_EFAULT;
12387         ret = get_errno(chown(p, arg2, arg3));
12388         unlock_user(p, arg1, 0);
12389         return ret;
12390 #endif
12391 #ifdef TARGET_NR_setuid32
12392     case TARGET_NR_setuid32:
12393         return get_errno(sys_setuid(arg1));
12394 #endif
12395 #ifdef TARGET_NR_setgid32
12396     case TARGET_NR_setgid32:
12397         return get_errno(sys_setgid(arg1));
12398 #endif
12399 #ifdef TARGET_NR_setfsuid32
12400     case TARGET_NR_setfsuid32:
12401         return get_errno(setfsuid(arg1));
12402 #endif
12403 #ifdef TARGET_NR_setfsgid32
12404     case TARGET_NR_setfsgid32:
12405         return get_errno(setfsgid(arg1));
12406 #endif
12407 #ifdef TARGET_NR_mincore
12408     case TARGET_NR_mincore:
12409         {
12410             void *a = lock_user(VERIFY_NONE, arg1, arg2, 0);
12411             if (!a) {
12412                 return -TARGET_ENOMEM;
12413             }
12414             p = lock_user_string(arg3);
12415             if (!p) {
12416                 ret = -TARGET_EFAULT;
12417             } else {
12418                 ret = get_errno(mincore(a, arg2, p));
12419                 unlock_user(p, arg3, ret);
12420             }
12421             unlock_user(a, arg1, 0);
12422         }
12423         return ret;
12424 #endif
12425 #ifdef TARGET_NR_arm_fadvise64_64
12426     case TARGET_NR_arm_fadvise64_64:
12427         /* arm_fadvise64_64 looks like fadvise64_64 but
12428          * with different argument order: fd, advice, offset, len
12429          * rather than the usual fd, offset, len, advice.
12430          * Note that offset and len are both 64-bit so appear as
12431          * pairs of 32-bit registers.
12432          */
12433         ret = posix_fadvise(arg1, target_offset64(arg3, arg4),
12434                             target_offset64(arg5, arg6), arg2);
12435         return -host_to_target_errno(ret);
12436 #endif
12437 
12438 #if TARGET_ABI_BITS == 32 && !defined(TARGET_ABI_MIPSN32)
12439 
12440 #ifdef TARGET_NR_fadvise64_64
12441     case TARGET_NR_fadvise64_64:
12442 #if defined(TARGET_PPC) || defined(TARGET_XTENSA)
12443         /* 6 args: fd, advice, offset (high, low), len (high, low) */
12444         ret = arg2;
12445         arg2 = arg3;
12446         arg3 = arg4;
12447         arg4 = arg5;
12448         arg5 = arg6;
12449         arg6 = ret;
12450 #else
12451         /* 6 args: fd, offset (high, low), len (high, low), advice */
12452         if (regpairs_aligned(cpu_env, num)) {
12453             /* offset is in (3,4), len in (5,6) and advice in 7 */
12454             arg2 = arg3;
12455             arg3 = arg4;
12456             arg4 = arg5;
12457             arg5 = arg6;
12458             arg6 = arg7;
12459         }
12460 #endif
12461         ret = posix_fadvise(arg1, target_offset64(arg2, arg3),
12462                             target_offset64(arg4, arg5), arg6);
12463         return -host_to_target_errno(ret);
12464 #endif
12465 
12466 #ifdef TARGET_NR_fadvise64
12467     case TARGET_NR_fadvise64:
12468         /* 5 args: fd, offset (high, low), len, advice */
12469         if (regpairs_aligned(cpu_env, num)) {
12470             /* offset is in (3,4), len in 5 and advice in 6 */
12471             arg2 = arg3;
12472             arg3 = arg4;
12473             arg4 = arg5;
12474             arg5 = arg6;
12475         }
12476         ret = posix_fadvise(arg1, target_offset64(arg2, arg3), arg4, arg5);
12477         return -host_to_target_errno(ret);
12478 #endif
12479 
12480 #else /* not a 32-bit ABI */
12481 #if defined(TARGET_NR_fadvise64_64) || defined(TARGET_NR_fadvise64)
12482 #ifdef TARGET_NR_fadvise64_64
12483     case TARGET_NR_fadvise64_64:
12484 #endif
12485 #ifdef TARGET_NR_fadvise64
12486     case TARGET_NR_fadvise64:
12487 #endif
12488 #ifdef TARGET_S390X
12489         switch (arg4) {
12490         case 4: arg4 = POSIX_FADV_NOREUSE + 1; break; /* make sure it's an invalid value */
12491         case 5: arg4 = POSIX_FADV_NOREUSE + 2; break; /* ditto */
12492         case 6: arg4 = POSIX_FADV_DONTNEED; break;
12493         case 7: arg4 = POSIX_FADV_NOREUSE; break;
12494         default: break;
12495         }
12496 #endif
12497         return -host_to_target_errno(posix_fadvise(arg1, arg2, arg3, arg4));
12498 #endif
12499 #endif /* end of 64-bit ABI fadvise handling */
12500 
12501 #ifdef TARGET_NR_madvise
12502     case TARGET_NR_madvise:
12503         return target_madvise(arg1, arg2, arg3);
12504 #endif
12505 #ifdef TARGET_NR_fcntl64
12506     case TARGET_NR_fcntl64:
12507     {
12508         int cmd;
12509         struct flock fl;
12510         from_flock64_fn *copyfrom = copy_from_user_flock64;
12511         to_flock64_fn *copyto = copy_to_user_flock64;
12512 
12513 #ifdef TARGET_ARM
12514         if (!cpu_env->eabi) {
12515             copyfrom = copy_from_user_oabi_flock64;
12516             copyto = copy_to_user_oabi_flock64;
12517         }
12518 #endif
12519 
12520         cmd = target_to_host_fcntl_cmd(arg2);
12521         if (cmd == -TARGET_EINVAL) {
12522             return cmd;
12523         }
12524 
12525         switch(arg2) {
12526         case TARGET_F_GETLK64:
12527             ret = copyfrom(&fl, arg3);
12528             if (ret) {
12529                 break;
12530             }
12531             ret = get_errno(safe_fcntl(arg1, cmd, &fl));
12532             if (ret == 0) {
12533                 ret = copyto(arg3, &fl);
12534             }
12535 	    break;
12536 
12537         case TARGET_F_SETLK64:
12538         case TARGET_F_SETLKW64:
12539             ret = copyfrom(&fl, arg3);
12540             if (ret) {
12541                 break;
12542             }
12543             ret = get_errno(safe_fcntl(arg1, cmd, &fl));
12544 	    break;
12545         default:
12546             ret = do_fcntl(arg1, arg2, arg3);
12547             break;
12548         }
12549         return ret;
12550     }
12551 #endif
12552 #ifdef TARGET_NR_cacheflush
12553     case TARGET_NR_cacheflush:
12554         /* self-modifying code is handled automatically, so nothing needed */
12555         return 0;
12556 #endif
12557 #ifdef TARGET_NR_getpagesize
12558     case TARGET_NR_getpagesize:
12559         return TARGET_PAGE_SIZE;
12560 #endif
12561     case TARGET_NR_gettid:
12562         return get_errno(sys_gettid());
12563 #ifdef TARGET_NR_readahead
12564     case TARGET_NR_readahead:
12565 #if TARGET_ABI_BITS == 32 && !defined(TARGET_ABI_MIPSN32)
12566         if (regpairs_aligned(cpu_env, num)) {
12567             arg2 = arg3;
12568             arg3 = arg4;
12569             arg4 = arg5;
12570         }
12571         ret = get_errno(readahead(arg1, target_offset64(arg2, arg3) , arg4));
12572 #else
12573         ret = get_errno(readahead(arg1, arg2, arg3));
12574 #endif
12575         return ret;
12576 #endif
12577 #ifdef CONFIG_ATTR
12578 #ifdef TARGET_NR_setxattr
12579     case TARGET_NR_listxattr:
12580     case TARGET_NR_llistxattr:
12581     {
12582         void *b = 0;
12583         if (arg2) {
12584             b = lock_user(VERIFY_WRITE, arg2, arg3, 0);
12585             if (!b) {
12586                 return -TARGET_EFAULT;
12587             }
12588         }
12589         p = lock_user_string(arg1);
12590         if (p) {
12591             if (num == TARGET_NR_listxattr) {
12592                 ret = get_errno(listxattr(p, b, arg3));
12593             } else {
12594                 ret = get_errno(llistxattr(p, b, arg3));
12595             }
12596         } else {
12597             ret = -TARGET_EFAULT;
12598         }
12599         unlock_user(p, arg1, 0);
12600         unlock_user(b, arg2, arg3);
12601         return ret;
12602     }
12603     case TARGET_NR_flistxattr:
12604     {
12605         void *b = 0;
12606         if (arg2) {
12607             b = lock_user(VERIFY_WRITE, arg2, arg3, 0);
12608             if (!b) {
12609                 return -TARGET_EFAULT;
12610             }
12611         }
12612         ret = get_errno(flistxattr(arg1, b, arg3));
12613         unlock_user(b, arg2, arg3);
12614         return ret;
12615     }
12616     case TARGET_NR_setxattr:
12617     case TARGET_NR_lsetxattr:
12618         {
12619             void *n, *v = 0;
12620             if (arg3) {
12621                 v = lock_user(VERIFY_READ, arg3, arg4, 1);
12622                 if (!v) {
12623                     return -TARGET_EFAULT;
12624                 }
12625             }
12626             p = lock_user_string(arg1);
12627             n = lock_user_string(arg2);
12628             if (p && n) {
12629                 if (num == TARGET_NR_setxattr) {
12630                     ret = get_errno(setxattr(p, n, v, arg4, arg5));
12631                 } else {
12632                     ret = get_errno(lsetxattr(p, n, v, arg4, arg5));
12633                 }
12634             } else {
12635                 ret = -TARGET_EFAULT;
12636             }
12637             unlock_user(p, arg1, 0);
12638             unlock_user(n, arg2, 0);
12639             unlock_user(v, arg3, 0);
12640         }
12641         return ret;
12642     case TARGET_NR_fsetxattr:
12643         {
12644             void *n, *v = 0;
12645             if (arg3) {
12646                 v = lock_user(VERIFY_READ, arg3, arg4, 1);
12647                 if (!v) {
12648                     return -TARGET_EFAULT;
12649                 }
12650             }
12651             n = lock_user_string(arg2);
12652             if (n) {
12653                 ret = get_errno(fsetxattr(arg1, n, v, arg4, arg5));
12654             } else {
12655                 ret = -TARGET_EFAULT;
12656             }
12657             unlock_user(n, arg2, 0);
12658             unlock_user(v, arg3, 0);
12659         }
12660         return ret;
12661     case TARGET_NR_getxattr:
12662     case TARGET_NR_lgetxattr:
12663         {
12664             void *n, *v = 0;
12665             if (arg3) {
12666                 v = lock_user(VERIFY_WRITE, arg3, arg4, 0);
12667                 if (!v) {
12668                     return -TARGET_EFAULT;
12669                 }
12670             }
12671             p = lock_user_string(arg1);
12672             n = lock_user_string(arg2);
12673             if (p && n) {
12674                 if (num == TARGET_NR_getxattr) {
12675                     ret = get_errno(getxattr(p, n, v, arg4));
12676                 } else {
12677                     ret = get_errno(lgetxattr(p, n, v, arg4));
12678                 }
12679             } else {
12680                 ret = -TARGET_EFAULT;
12681             }
12682             unlock_user(p, arg1, 0);
12683             unlock_user(n, arg2, 0);
12684             unlock_user(v, arg3, arg4);
12685         }
12686         return ret;
12687     case TARGET_NR_fgetxattr:
12688         {
12689             void *n, *v = 0;
12690             if (arg3) {
12691                 v = lock_user(VERIFY_WRITE, arg3, arg4, 0);
12692                 if (!v) {
12693                     return -TARGET_EFAULT;
12694                 }
12695             }
12696             n = lock_user_string(arg2);
12697             if (n) {
12698                 ret = get_errno(fgetxattr(arg1, n, v, arg4));
12699             } else {
12700                 ret = -TARGET_EFAULT;
12701             }
12702             unlock_user(n, arg2, 0);
12703             unlock_user(v, arg3, arg4);
12704         }
12705         return ret;
12706     case TARGET_NR_removexattr:
12707     case TARGET_NR_lremovexattr:
12708         {
12709             void *n;
12710             p = lock_user_string(arg1);
12711             n = lock_user_string(arg2);
12712             if (p && n) {
12713                 if (num == TARGET_NR_removexattr) {
12714                     ret = get_errno(removexattr(p, n));
12715                 } else {
12716                     ret = get_errno(lremovexattr(p, n));
12717                 }
12718             } else {
12719                 ret = -TARGET_EFAULT;
12720             }
12721             unlock_user(p, arg1, 0);
12722             unlock_user(n, arg2, 0);
12723         }
12724         return ret;
12725     case TARGET_NR_fremovexattr:
12726         {
12727             void *n;
12728             n = lock_user_string(arg2);
12729             if (n) {
12730                 ret = get_errno(fremovexattr(arg1, n));
12731             } else {
12732                 ret = -TARGET_EFAULT;
12733             }
12734             unlock_user(n, arg2, 0);
12735         }
12736         return ret;
12737 #endif
12738 #endif /* CONFIG_ATTR */
12739 #ifdef TARGET_NR_set_thread_area
12740     case TARGET_NR_set_thread_area:
12741 #if defined(TARGET_MIPS)
12742       cpu_env->active_tc.CP0_UserLocal = arg1;
12743       return 0;
12744 #elif defined(TARGET_I386) && defined(TARGET_ABI32)
12745       return do_set_thread_area(cpu_env, arg1);
12746 #elif defined(TARGET_M68K)
12747       {
12748           TaskState *ts = get_task_state(cpu);
12749           ts->tp_value = arg1;
12750           return 0;
12751       }
12752 #else
12753       return -TARGET_ENOSYS;
12754 #endif
12755 #endif
12756 #ifdef TARGET_NR_get_thread_area
12757     case TARGET_NR_get_thread_area:
12758 #if defined(TARGET_I386) && defined(TARGET_ABI32)
12759         return do_get_thread_area(cpu_env, arg1);
12760 #elif defined(TARGET_M68K)
12761         {
12762             TaskState *ts = get_task_state(cpu);
12763             return ts->tp_value;
12764         }
12765 #else
12766         return -TARGET_ENOSYS;
12767 #endif
12768 #endif
12769 #ifdef TARGET_NR_getdomainname
12770     case TARGET_NR_getdomainname:
12771         return -TARGET_ENOSYS;
12772 #endif
12773 
12774 #ifdef TARGET_NR_clock_settime
12775     case TARGET_NR_clock_settime:
12776     {
12777         struct timespec ts;
12778 
12779         ret = target_to_host_timespec(&ts, arg2);
12780         if (!is_error(ret)) {
12781             ret = get_errno(clock_settime(arg1, &ts));
12782         }
12783         return ret;
12784     }
12785 #endif
12786 #ifdef TARGET_NR_clock_settime64
12787     case TARGET_NR_clock_settime64:
12788     {
12789         struct timespec ts;
12790 
12791         ret = target_to_host_timespec64(&ts, arg2);
12792         if (!is_error(ret)) {
12793             ret = get_errno(clock_settime(arg1, &ts));
12794         }
12795         return ret;
12796     }
12797 #endif
12798 #ifdef TARGET_NR_clock_gettime
12799     case TARGET_NR_clock_gettime:
12800     {
12801         struct timespec ts;
12802         ret = get_errno(clock_gettime(arg1, &ts));
12803         if (!is_error(ret)) {
12804             ret = host_to_target_timespec(arg2, &ts);
12805         }
12806         return ret;
12807     }
12808 #endif
12809 #ifdef TARGET_NR_clock_gettime64
12810     case TARGET_NR_clock_gettime64:
12811     {
12812         struct timespec ts;
12813         ret = get_errno(clock_gettime(arg1, &ts));
12814         if (!is_error(ret)) {
12815             ret = host_to_target_timespec64(arg2, &ts);
12816         }
12817         return ret;
12818     }
12819 #endif
12820 #ifdef TARGET_NR_clock_getres
12821     case TARGET_NR_clock_getres:
12822     {
12823         struct timespec ts;
12824         ret = get_errno(clock_getres(arg1, &ts));
12825         if (!is_error(ret)) {
12826             host_to_target_timespec(arg2, &ts);
12827         }
12828         return ret;
12829     }
12830 #endif
12831 #ifdef TARGET_NR_clock_getres_time64
12832     case TARGET_NR_clock_getres_time64:
12833     {
12834         struct timespec ts;
12835         ret = get_errno(clock_getres(arg1, &ts));
12836         if (!is_error(ret)) {
12837             host_to_target_timespec64(arg2, &ts);
12838         }
12839         return ret;
12840     }
12841 #endif
12842 #ifdef TARGET_NR_clock_nanosleep
12843     case TARGET_NR_clock_nanosleep:
12844     {
12845         struct timespec ts;
12846         if (target_to_host_timespec(&ts, arg3)) {
12847             return -TARGET_EFAULT;
12848         }
12849         ret = get_errno(safe_clock_nanosleep(arg1, arg2,
12850                                              &ts, arg4 ? &ts : NULL));
12851         /*
12852          * if the call is interrupted by a signal handler, it fails
12853          * with error -TARGET_EINTR and if arg4 is not NULL and arg2 is not
12854          * TIMER_ABSTIME, it returns the remaining unslept time in arg4.
12855          */
12856         if (ret == -TARGET_EINTR && arg4 && arg2 != TIMER_ABSTIME &&
12857             host_to_target_timespec(arg4, &ts)) {
12858               return -TARGET_EFAULT;
12859         }
12860 
12861         return ret;
12862     }
12863 #endif
12864 #ifdef TARGET_NR_clock_nanosleep_time64
12865     case TARGET_NR_clock_nanosleep_time64:
12866     {
12867         struct timespec ts;
12868 
12869         if (target_to_host_timespec64(&ts, arg3)) {
12870             return -TARGET_EFAULT;
12871         }
12872 
12873         ret = get_errno(safe_clock_nanosleep(arg1, arg2,
12874                                              &ts, arg4 ? &ts : NULL));
12875 
12876         if (ret == -TARGET_EINTR && arg4 && arg2 != TIMER_ABSTIME &&
12877             host_to_target_timespec64(arg4, &ts)) {
12878             return -TARGET_EFAULT;
12879         }
12880         return ret;
12881     }
12882 #endif
12883 
12884 #if defined(TARGET_NR_set_tid_address)
12885     case TARGET_NR_set_tid_address:
12886     {
12887         TaskState *ts = get_task_state(cpu);
12888         ts->child_tidptr = arg1;
12889         /* do not call host set_tid_address() syscall, instead return tid() */
12890         return get_errno(sys_gettid());
12891     }
12892 #endif
12893 
12894     case TARGET_NR_tkill:
12895         return get_errno(safe_tkill((int)arg1, target_to_host_signal(arg2)));
12896 
12897     case TARGET_NR_tgkill:
12898         return get_errno(safe_tgkill((int)arg1, (int)arg2,
12899                          target_to_host_signal(arg3)));
12900 
12901 #ifdef TARGET_NR_set_robust_list
12902     case TARGET_NR_set_robust_list:
12903     case TARGET_NR_get_robust_list:
12904         /* The ABI for supporting robust futexes has userspace pass
12905          * the kernel a pointer to a linked list which is updated by
12906          * userspace after the syscall; the list is walked by the kernel
12907          * when the thread exits. Since the linked list in QEMU guest
12908          * memory isn't a valid linked list for the host and we have
12909          * no way to reliably intercept the thread-death event, we can't
12910          * support these. Silently return ENOSYS so that guest userspace
12911          * falls back to a non-robust futex implementation (which should
12912          * be OK except in the corner case of the guest crashing while
12913          * holding a mutex that is shared with another process via
12914          * shared memory).
12915          */
12916         return -TARGET_ENOSYS;
12917 #endif
12918 
12919 #if defined(TARGET_NR_utimensat)
12920     case TARGET_NR_utimensat:
12921         {
12922             struct timespec *tsp, ts[2];
12923             if (!arg3) {
12924                 tsp = NULL;
12925             } else {
12926                 if (target_to_host_timespec(ts, arg3)) {
12927                     return -TARGET_EFAULT;
12928                 }
12929                 if (target_to_host_timespec(ts + 1, arg3 +
12930                                             sizeof(struct target_timespec))) {
12931                     return -TARGET_EFAULT;
12932                 }
12933                 tsp = ts;
12934             }
12935             if (!arg2)
12936                 ret = get_errno(sys_utimensat(arg1, NULL, tsp, arg4));
12937             else {
12938                 if (!(p = lock_user_string(arg2))) {
12939                     return -TARGET_EFAULT;
12940                 }
12941                 ret = get_errno(sys_utimensat(arg1, path(p), tsp, arg4));
12942                 unlock_user(p, arg2, 0);
12943             }
12944         }
12945         return ret;
12946 #endif
12947 #ifdef TARGET_NR_utimensat_time64
12948     case TARGET_NR_utimensat_time64:
12949         {
12950             struct timespec *tsp, ts[2];
12951             if (!arg3) {
12952                 tsp = NULL;
12953             } else {
12954                 if (target_to_host_timespec64(ts, arg3)) {
12955                     return -TARGET_EFAULT;
12956                 }
12957                 if (target_to_host_timespec64(ts + 1, arg3 +
12958                                      sizeof(struct target__kernel_timespec))) {
12959                     return -TARGET_EFAULT;
12960                 }
12961                 tsp = ts;
12962             }
12963             if (!arg2)
12964                 ret = get_errno(sys_utimensat(arg1, NULL, tsp, arg4));
12965             else {
12966                 p = lock_user_string(arg2);
12967                 if (!p) {
12968                     return -TARGET_EFAULT;
12969                 }
12970                 ret = get_errno(sys_utimensat(arg1, path(p), tsp, arg4));
12971                 unlock_user(p, arg2, 0);
12972             }
12973         }
12974         return ret;
12975 #endif
12976 #ifdef TARGET_NR_futex
12977     case TARGET_NR_futex:
12978         return do_futex(cpu, false, arg1, arg2, arg3, arg4, arg5, arg6);
12979 #endif
12980 #ifdef TARGET_NR_futex_time64
12981     case TARGET_NR_futex_time64:
12982         return do_futex(cpu, true, arg1, arg2, arg3, arg4, arg5, arg6);
12983 #endif
12984 #ifdef CONFIG_INOTIFY
12985 #if defined(TARGET_NR_inotify_init)
12986     case TARGET_NR_inotify_init:
12987         ret = get_errno(inotify_init());
12988         if (ret >= 0) {
12989             fd_trans_register(ret, &target_inotify_trans);
12990         }
12991         return ret;
12992 #endif
12993 #if defined(TARGET_NR_inotify_init1) && defined(CONFIG_INOTIFY1)
12994     case TARGET_NR_inotify_init1:
12995         ret = get_errno(inotify_init1(target_to_host_bitmask(arg1,
12996                                           fcntl_flags_tbl)));
12997         if (ret >= 0) {
12998             fd_trans_register(ret, &target_inotify_trans);
12999         }
13000         return ret;
13001 #endif
13002 #if defined(TARGET_NR_inotify_add_watch)
13003     case TARGET_NR_inotify_add_watch:
13004         p = lock_user_string(arg2);
13005         ret = get_errno(inotify_add_watch(arg1, path(p), arg3));
13006         unlock_user(p, arg2, 0);
13007         return ret;
13008 #endif
13009 #if defined(TARGET_NR_inotify_rm_watch)
13010     case TARGET_NR_inotify_rm_watch:
13011         return get_errno(inotify_rm_watch(arg1, arg2));
13012 #endif
13013 #endif
13014 
13015 #if defined(TARGET_NR_mq_open) && defined(__NR_mq_open)
13016     case TARGET_NR_mq_open:
13017         {
13018             struct mq_attr posix_mq_attr;
13019             struct mq_attr *pposix_mq_attr;
13020             int host_flags;
13021 
13022             host_flags = target_to_host_bitmask(arg2, fcntl_flags_tbl);
13023             pposix_mq_attr = NULL;
13024             if (arg4) {
13025                 if (copy_from_user_mq_attr(&posix_mq_attr, arg4) != 0) {
13026                     return -TARGET_EFAULT;
13027                 }
13028                 pposix_mq_attr = &posix_mq_attr;
13029             }
13030             p = lock_user_string(arg1 - 1);
13031             if (!p) {
13032                 return -TARGET_EFAULT;
13033             }
13034             ret = get_errno(mq_open(p, host_flags, arg3, pposix_mq_attr));
13035             unlock_user (p, arg1, 0);
13036         }
13037         return ret;
13038 
13039     case TARGET_NR_mq_unlink:
13040         p = lock_user_string(arg1 - 1);
13041         if (!p) {
13042             return -TARGET_EFAULT;
13043         }
13044         ret = get_errno(mq_unlink(p));
13045         unlock_user (p, arg1, 0);
13046         return ret;
13047 
13048 #ifdef TARGET_NR_mq_timedsend
13049     case TARGET_NR_mq_timedsend:
13050         {
13051             struct timespec ts;
13052 
13053             p = lock_user (VERIFY_READ, arg2, arg3, 1);
13054             if (arg5 != 0) {
13055                 if (target_to_host_timespec(&ts, arg5)) {
13056                     return -TARGET_EFAULT;
13057                 }
13058                 ret = get_errno(safe_mq_timedsend(arg1, p, arg3, arg4, &ts));
13059                 if (!is_error(ret) && host_to_target_timespec(arg5, &ts)) {
13060                     return -TARGET_EFAULT;
13061                 }
13062             } else {
13063                 ret = get_errno(safe_mq_timedsend(arg1, p, arg3, arg4, NULL));
13064             }
13065             unlock_user (p, arg2, arg3);
13066         }
13067         return ret;
13068 #endif
13069 #ifdef TARGET_NR_mq_timedsend_time64
13070     case TARGET_NR_mq_timedsend_time64:
13071         {
13072             struct timespec ts;
13073 
13074             p = lock_user(VERIFY_READ, arg2, arg3, 1);
13075             if (arg5 != 0) {
13076                 if (target_to_host_timespec64(&ts, arg5)) {
13077                     return -TARGET_EFAULT;
13078                 }
13079                 ret = get_errno(safe_mq_timedsend(arg1, p, arg3, arg4, &ts));
13080                 if (!is_error(ret) && host_to_target_timespec64(arg5, &ts)) {
13081                     return -TARGET_EFAULT;
13082                 }
13083             } else {
13084                 ret = get_errno(safe_mq_timedsend(arg1, p, arg3, arg4, NULL));
13085             }
13086             unlock_user(p, arg2, arg3);
13087         }
13088         return ret;
13089 #endif
13090 
13091 #ifdef TARGET_NR_mq_timedreceive
13092     case TARGET_NR_mq_timedreceive:
13093         {
13094             struct timespec ts;
13095             unsigned int prio;
13096 
13097             p = lock_user (VERIFY_READ, arg2, arg3, 1);
13098             if (arg5 != 0) {
13099                 if (target_to_host_timespec(&ts, arg5)) {
13100                     return -TARGET_EFAULT;
13101                 }
13102                 ret = get_errno(safe_mq_timedreceive(arg1, p, arg3,
13103                                                      &prio, &ts));
13104                 if (!is_error(ret) && host_to_target_timespec(arg5, &ts)) {
13105                     return -TARGET_EFAULT;
13106                 }
13107             } else {
13108                 ret = get_errno(safe_mq_timedreceive(arg1, p, arg3,
13109                                                      &prio, NULL));
13110             }
13111             unlock_user (p, arg2, arg3);
13112             if (arg4 != 0)
13113                 put_user_u32(prio, arg4);
13114         }
13115         return ret;
13116 #endif
13117 #ifdef TARGET_NR_mq_timedreceive_time64
13118     case TARGET_NR_mq_timedreceive_time64:
13119         {
13120             struct timespec ts;
13121             unsigned int prio;
13122 
13123             p = lock_user(VERIFY_READ, arg2, arg3, 1);
13124             if (arg5 != 0) {
13125                 if (target_to_host_timespec64(&ts, arg5)) {
13126                     return -TARGET_EFAULT;
13127                 }
13128                 ret = get_errno(safe_mq_timedreceive(arg1, p, arg3,
13129                                                      &prio, &ts));
13130                 if (!is_error(ret) && host_to_target_timespec64(arg5, &ts)) {
13131                     return -TARGET_EFAULT;
13132                 }
13133             } else {
13134                 ret = get_errno(safe_mq_timedreceive(arg1, p, arg3,
13135                                                      &prio, NULL));
13136             }
13137             unlock_user(p, arg2, arg3);
13138             if (arg4 != 0) {
13139                 put_user_u32(prio, arg4);
13140             }
13141         }
13142         return ret;
13143 #endif
13144 
13145     /* Not implemented for now... */
13146 /*     case TARGET_NR_mq_notify: */
13147 /*         break; */
13148 
13149     case TARGET_NR_mq_getsetattr:
13150         {
13151             struct mq_attr posix_mq_attr_in, posix_mq_attr_out;
13152             ret = 0;
13153             if (arg2 != 0) {
13154                 copy_from_user_mq_attr(&posix_mq_attr_in, arg2);
13155                 ret = get_errno(mq_setattr(arg1, &posix_mq_attr_in,
13156                                            &posix_mq_attr_out));
13157             } else if (arg3 != 0) {
13158                 ret = get_errno(mq_getattr(arg1, &posix_mq_attr_out));
13159             }
13160             if (ret == 0 && arg3 != 0) {
13161                 copy_to_user_mq_attr(arg3, &posix_mq_attr_out);
13162             }
13163         }
13164         return ret;
13165 #endif
13166 
13167 #ifdef CONFIG_SPLICE
13168 #ifdef TARGET_NR_tee
13169     case TARGET_NR_tee:
13170         {
13171             ret = get_errno(tee(arg1,arg2,arg3,arg4));
13172         }
13173         return ret;
13174 #endif
13175 #ifdef TARGET_NR_splice
13176     case TARGET_NR_splice:
13177         {
13178             loff_t loff_in, loff_out;
13179             loff_t *ploff_in = NULL, *ploff_out = NULL;
13180             if (arg2) {
13181                 if (get_user_u64(loff_in, arg2)) {
13182                     return -TARGET_EFAULT;
13183                 }
13184                 ploff_in = &loff_in;
13185             }
13186             if (arg4) {
13187                 if (get_user_u64(loff_out, arg4)) {
13188                     return -TARGET_EFAULT;
13189                 }
13190                 ploff_out = &loff_out;
13191             }
13192             ret = get_errno(splice(arg1, ploff_in, arg3, ploff_out, arg5, arg6));
13193             if (arg2) {
13194                 if (put_user_u64(loff_in, arg2)) {
13195                     return -TARGET_EFAULT;
13196                 }
13197             }
13198             if (arg4) {
13199                 if (put_user_u64(loff_out, arg4)) {
13200                     return -TARGET_EFAULT;
13201                 }
13202             }
13203         }
13204         return ret;
13205 #endif
13206 #ifdef TARGET_NR_vmsplice
13207 	case TARGET_NR_vmsplice:
13208         {
13209             struct iovec *vec = lock_iovec(VERIFY_READ, arg2, arg3, 1);
13210             if (vec != NULL) {
13211                 ret = get_errno(vmsplice(arg1, vec, arg3, arg4));
13212                 unlock_iovec(vec, arg2, arg3, 0);
13213             } else {
13214                 ret = -host_to_target_errno(errno);
13215             }
13216         }
13217         return ret;
13218 #endif
13219 #endif /* CONFIG_SPLICE */
13220 #ifdef CONFIG_EVENTFD
13221 #if defined(TARGET_NR_eventfd)
13222     case TARGET_NR_eventfd:
13223         ret = get_errno(eventfd(arg1, 0));
13224         if (ret >= 0) {
13225             fd_trans_register(ret, &target_eventfd_trans);
13226         }
13227         return ret;
13228 #endif
13229 #if defined(TARGET_NR_eventfd2)
13230     case TARGET_NR_eventfd2:
13231     {
13232         int host_flags = arg2 & (~(TARGET_O_NONBLOCK_MASK | TARGET_O_CLOEXEC));
13233         if (arg2 & TARGET_O_NONBLOCK) {
13234             host_flags |= O_NONBLOCK;
13235         }
13236         if (arg2 & TARGET_O_CLOEXEC) {
13237             host_flags |= O_CLOEXEC;
13238         }
13239         ret = get_errno(eventfd(arg1, host_flags));
13240         if (ret >= 0) {
13241             fd_trans_register(ret, &target_eventfd_trans);
13242         }
13243         return ret;
13244     }
13245 #endif
13246 #endif /* CONFIG_EVENTFD  */
13247 #if defined(CONFIG_FALLOCATE) && defined(TARGET_NR_fallocate)
13248     case TARGET_NR_fallocate:
13249 #if TARGET_ABI_BITS == 32 && !defined(TARGET_ABI_MIPSN32)
13250         ret = get_errno(fallocate(arg1, arg2, target_offset64(arg3, arg4),
13251                                   target_offset64(arg5, arg6)));
13252 #else
13253         ret = get_errno(fallocate(arg1, arg2, arg3, arg4));
13254 #endif
13255         return ret;
13256 #endif
13257 #if defined(CONFIG_SYNC_FILE_RANGE)
13258 #if defined(TARGET_NR_sync_file_range)
13259     case TARGET_NR_sync_file_range:
13260 #if TARGET_ABI_BITS == 32 && !defined(TARGET_ABI_MIPSN32)
13261 #if defined(TARGET_MIPS)
13262         ret = get_errno(sync_file_range(arg1, target_offset64(arg3, arg4),
13263                                         target_offset64(arg5, arg6), arg7));
13264 #else
13265         ret = get_errno(sync_file_range(arg1, target_offset64(arg2, arg3),
13266                                         target_offset64(arg4, arg5), arg6));
13267 #endif /* !TARGET_MIPS */
13268 #else
13269         ret = get_errno(sync_file_range(arg1, arg2, arg3, arg4));
13270 #endif
13271         return ret;
13272 #endif
13273 #if defined(TARGET_NR_sync_file_range2) || \
13274     defined(TARGET_NR_arm_sync_file_range)
13275 #if defined(TARGET_NR_sync_file_range2)
13276     case TARGET_NR_sync_file_range2:
13277 #endif
13278 #if defined(TARGET_NR_arm_sync_file_range)
13279     case TARGET_NR_arm_sync_file_range:
13280 #endif
13281         /* This is like sync_file_range but the arguments are reordered */
13282 #if TARGET_ABI_BITS == 32 && !defined(TARGET_ABI_MIPSN32)
13283         ret = get_errno(sync_file_range(arg1, target_offset64(arg3, arg4),
13284                                         target_offset64(arg5, arg6), arg2));
13285 #else
13286         ret = get_errno(sync_file_range(arg1, arg3, arg4, arg2));
13287 #endif
13288         return ret;
13289 #endif
13290 #endif
13291 #if defined(TARGET_NR_signalfd4)
13292     case TARGET_NR_signalfd4:
13293         return do_signalfd4(arg1, arg2, arg4);
13294 #endif
13295 #if defined(TARGET_NR_signalfd)
13296     case TARGET_NR_signalfd:
13297         return do_signalfd4(arg1, arg2, 0);
13298 #endif
13299 #if defined(CONFIG_EPOLL)
13300 #if defined(TARGET_NR_epoll_create)
13301     case TARGET_NR_epoll_create:
13302         return get_errno(epoll_create(arg1));
13303 #endif
13304 #if defined(TARGET_NR_epoll_create1) && defined(CONFIG_EPOLL_CREATE1)
13305     case TARGET_NR_epoll_create1:
13306         return get_errno(epoll_create1(target_to_host_bitmask(arg1, fcntl_flags_tbl)));
13307 #endif
13308 #if defined(TARGET_NR_epoll_ctl)
13309     case TARGET_NR_epoll_ctl:
13310     {
13311         struct epoll_event ep;
13312         struct epoll_event *epp = 0;
13313         if (arg4) {
13314             if (arg2 != EPOLL_CTL_DEL) {
13315                 struct target_epoll_event *target_ep;
13316                 if (!lock_user_struct(VERIFY_READ, target_ep, arg4, 1)) {
13317                     return -TARGET_EFAULT;
13318                 }
13319                 ep.events = tswap32(target_ep->events);
13320                 /*
13321                  * The epoll_data_t union is just opaque data to the kernel,
13322                  * so we transfer all 64 bits across and need not worry what
13323                  * actual data type it is.
13324                  */
13325                 ep.data.u64 = tswap64(target_ep->data.u64);
13326                 unlock_user_struct(target_ep, arg4, 0);
13327             }
13328             /*
13329              * before kernel 2.6.9, EPOLL_CTL_DEL operation required a
13330              * non-null pointer, even though this argument is ignored.
13331              *
13332              */
13333             epp = &ep;
13334         }
13335         return get_errno(epoll_ctl(arg1, arg2, arg3, epp));
13336     }
13337 #endif
13338 
13339 #if defined(TARGET_NR_epoll_wait) || defined(TARGET_NR_epoll_pwait)
13340 #if defined(TARGET_NR_epoll_wait)
13341     case TARGET_NR_epoll_wait:
13342 #endif
13343 #if defined(TARGET_NR_epoll_pwait)
13344     case TARGET_NR_epoll_pwait:
13345 #endif
13346     {
13347         struct target_epoll_event *target_ep;
13348         struct epoll_event *ep;
13349         int epfd = arg1;
13350         int maxevents = arg3;
13351         int timeout = arg4;
13352 
13353         if (maxevents <= 0 || maxevents > TARGET_EP_MAX_EVENTS) {
13354             return -TARGET_EINVAL;
13355         }
13356 
13357         target_ep = lock_user(VERIFY_WRITE, arg2,
13358                               maxevents * sizeof(struct target_epoll_event), 1);
13359         if (!target_ep) {
13360             return -TARGET_EFAULT;
13361         }
13362 
13363         ep = g_try_new(struct epoll_event, maxevents);
13364         if (!ep) {
13365             unlock_user(target_ep, arg2, 0);
13366             return -TARGET_ENOMEM;
13367         }
13368 
13369         switch (num) {
13370 #if defined(TARGET_NR_epoll_pwait)
13371         case TARGET_NR_epoll_pwait:
13372         {
13373             sigset_t *set = NULL;
13374 
13375             if (arg5) {
13376                 ret = process_sigsuspend_mask(&set, arg5, arg6);
13377                 if (ret != 0) {
13378                     break;
13379                 }
13380             }
13381 
13382             ret = get_errno(safe_epoll_pwait(epfd, ep, maxevents, timeout,
13383                                              set, SIGSET_T_SIZE));
13384 
13385             if (set) {
13386                 finish_sigsuspend_mask(ret);
13387             }
13388             break;
13389         }
13390 #endif
13391 #if defined(TARGET_NR_epoll_wait)
13392         case TARGET_NR_epoll_wait:
13393             ret = get_errno(safe_epoll_pwait(epfd, ep, maxevents, timeout,
13394                                              NULL, 0));
13395             break;
13396 #endif
13397         default:
13398             ret = -TARGET_ENOSYS;
13399         }
13400         if (!is_error(ret)) {
13401             int i;
13402             for (i = 0; i < ret; i++) {
13403                 target_ep[i].events = tswap32(ep[i].events);
13404                 target_ep[i].data.u64 = tswap64(ep[i].data.u64);
13405             }
13406             unlock_user(target_ep, arg2,
13407                         ret * sizeof(struct target_epoll_event));
13408         } else {
13409             unlock_user(target_ep, arg2, 0);
13410         }
13411         g_free(ep);
13412         return ret;
13413     }
13414 #endif
13415 #endif
13416 #ifdef TARGET_NR_prlimit64
13417     case TARGET_NR_prlimit64:
13418     {
13419         /* args: pid, resource number, ptr to new rlimit, ptr to old rlimit */
13420         struct target_rlimit64 *target_rnew, *target_rold;
13421         struct host_rlimit64 rnew, rold, *rnewp = 0;
13422         int resource = target_to_host_resource(arg2);
13423 
13424         if (arg3 && (resource != RLIMIT_AS &&
13425                      resource != RLIMIT_DATA &&
13426                      resource != RLIMIT_STACK)) {
13427             if (!lock_user_struct(VERIFY_READ, target_rnew, arg3, 1)) {
13428                 return -TARGET_EFAULT;
13429             }
13430             __get_user(rnew.rlim_cur, &target_rnew->rlim_cur);
13431             __get_user(rnew.rlim_max, &target_rnew->rlim_max);
13432             unlock_user_struct(target_rnew, arg3, 0);
13433             rnewp = &rnew;
13434         }
13435 
13436         ret = get_errno(sys_prlimit64(arg1, resource, rnewp, arg4 ? &rold : 0));
13437         if (!is_error(ret) && arg4) {
13438             if (!lock_user_struct(VERIFY_WRITE, target_rold, arg4, 1)) {
13439                 return -TARGET_EFAULT;
13440             }
13441             __put_user(rold.rlim_cur, &target_rold->rlim_cur);
13442             __put_user(rold.rlim_max, &target_rold->rlim_max);
13443             unlock_user_struct(target_rold, arg4, 1);
13444         }
13445         return ret;
13446     }
13447 #endif
13448 #ifdef TARGET_NR_gethostname
13449     case TARGET_NR_gethostname:
13450     {
13451         char *name = lock_user(VERIFY_WRITE, arg1, arg2, 0);
13452         if (name) {
13453             ret = get_errno(gethostname(name, arg2));
13454             unlock_user(name, arg1, arg2);
13455         } else {
13456             ret = -TARGET_EFAULT;
13457         }
13458         return ret;
13459     }
13460 #endif
13461 #ifdef TARGET_NR_atomic_cmpxchg_32
13462     case TARGET_NR_atomic_cmpxchg_32:
13463     {
13464         /* should use start_exclusive from main.c */
13465         abi_ulong mem_value;
13466         if (get_user_u32(mem_value, arg6)) {
13467             target_siginfo_t info;
13468             info.si_signo = SIGSEGV;
13469             info.si_errno = 0;
13470             info.si_code = TARGET_SEGV_MAPERR;
13471             info._sifields._sigfault._addr = arg6;
13472             queue_signal(cpu_env, info.si_signo, QEMU_SI_FAULT, &info);
13473             ret = 0xdeadbeef;
13474 
13475         }
13476         if (mem_value == arg2)
13477             put_user_u32(arg1, arg6);
13478         return mem_value;
13479     }
13480 #endif
13481 #ifdef TARGET_NR_atomic_barrier
13482     case TARGET_NR_atomic_barrier:
13483         /* Like the kernel implementation and the
13484            qemu arm barrier, no-op this? */
13485         return 0;
13486 #endif
13487 
13488 #ifdef TARGET_NR_timer_create
13489     case TARGET_NR_timer_create:
13490     {
13491         /* args: clockid_t clockid, struct sigevent *sevp, timer_t *timerid */
13492 
13493         struct sigevent host_sevp = { {0}, }, *phost_sevp = NULL;
13494 
13495         int clkid = arg1;
13496         int timer_index = next_free_host_timer();
13497 
13498         if (timer_index < 0) {
13499             ret = -TARGET_EAGAIN;
13500         } else {
13501             timer_t *phtimer = g_posix_timers  + timer_index;
13502 
13503             if (arg2) {
13504                 phost_sevp = &host_sevp;
13505                 ret = target_to_host_sigevent(phost_sevp, arg2);
13506                 if (ret != 0) {
13507                     free_host_timer_slot(timer_index);
13508                     return ret;
13509                 }
13510             }
13511 
13512             ret = get_errno(timer_create(clkid, phost_sevp, phtimer));
13513             if (ret) {
13514                 free_host_timer_slot(timer_index);
13515             } else {
13516                 if (put_user(TIMER_MAGIC | timer_index, arg3, target_timer_t)) {
13517                     timer_delete(*phtimer);
13518                     free_host_timer_slot(timer_index);
13519                     return -TARGET_EFAULT;
13520                 }
13521             }
13522         }
13523         return ret;
13524     }
13525 #endif
13526 
13527 #ifdef TARGET_NR_timer_settime
13528     case TARGET_NR_timer_settime:
13529     {
13530         /* args: timer_t timerid, int flags, const struct itimerspec *new_value,
13531          * struct itimerspec * old_value */
13532         target_timer_t timerid = get_timer_id(arg1);
13533 
13534         if (timerid < 0) {
13535             ret = timerid;
13536         } else if (arg3 == 0) {
13537             ret = -TARGET_EINVAL;
13538         } else {
13539             timer_t htimer = g_posix_timers[timerid];
13540             struct itimerspec hspec_new = {{0},}, hspec_old = {{0},};
13541 
13542             if (target_to_host_itimerspec(&hspec_new, arg3)) {
13543                 return -TARGET_EFAULT;
13544             }
13545             ret = get_errno(
13546                           timer_settime(htimer, arg2, &hspec_new, &hspec_old));
13547             if (arg4 && host_to_target_itimerspec(arg4, &hspec_old)) {
13548                 return -TARGET_EFAULT;
13549             }
13550         }
13551         return ret;
13552     }
13553 #endif
13554 
13555 #ifdef TARGET_NR_timer_settime64
13556     case TARGET_NR_timer_settime64:
13557     {
13558         target_timer_t timerid = get_timer_id(arg1);
13559 
13560         if (timerid < 0) {
13561             ret = timerid;
13562         } else if (arg3 == 0) {
13563             ret = -TARGET_EINVAL;
13564         } else {
13565             timer_t htimer = g_posix_timers[timerid];
13566             struct itimerspec hspec_new = {{0},}, hspec_old = {{0},};
13567 
13568             if (target_to_host_itimerspec64(&hspec_new, arg3)) {
13569                 return -TARGET_EFAULT;
13570             }
13571             ret = get_errno(
13572                           timer_settime(htimer, arg2, &hspec_new, &hspec_old));
13573             if (arg4 && host_to_target_itimerspec64(arg4, &hspec_old)) {
13574                 return -TARGET_EFAULT;
13575             }
13576         }
13577         return ret;
13578     }
13579 #endif
13580 
13581 #ifdef TARGET_NR_timer_gettime
13582     case TARGET_NR_timer_gettime:
13583     {
13584         /* args: timer_t timerid, struct itimerspec *curr_value */
13585         target_timer_t timerid = get_timer_id(arg1);
13586 
13587         if (timerid < 0) {
13588             ret = timerid;
13589         } else if (!arg2) {
13590             ret = -TARGET_EFAULT;
13591         } else {
13592             timer_t htimer = g_posix_timers[timerid];
13593             struct itimerspec hspec;
13594             ret = get_errno(timer_gettime(htimer, &hspec));
13595 
13596             if (host_to_target_itimerspec(arg2, &hspec)) {
13597                 ret = -TARGET_EFAULT;
13598             }
13599         }
13600         return ret;
13601     }
13602 #endif
13603 
13604 #ifdef TARGET_NR_timer_gettime64
13605     case TARGET_NR_timer_gettime64:
13606     {
13607         /* args: timer_t timerid, struct itimerspec64 *curr_value */
13608         target_timer_t timerid = get_timer_id(arg1);
13609 
13610         if (timerid < 0) {
13611             ret = timerid;
13612         } else if (!arg2) {
13613             ret = -TARGET_EFAULT;
13614         } else {
13615             timer_t htimer = g_posix_timers[timerid];
13616             struct itimerspec hspec;
13617             ret = get_errno(timer_gettime(htimer, &hspec));
13618 
13619             if (host_to_target_itimerspec64(arg2, &hspec)) {
13620                 ret = -TARGET_EFAULT;
13621             }
13622         }
13623         return ret;
13624     }
13625 #endif
13626 
13627 #ifdef TARGET_NR_timer_getoverrun
13628     case TARGET_NR_timer_getoverrun:
13629     {
13630         /* args: timer_t timerid */
13631         target_timer_t timerid = get_timer_id(arg1);
13632 
13633         if (timerid < 0) {
13634             ret = timerid;
13635         } else {
13636             timer_t htimer = g_posix_timers[timerid];
13637             ret = get_errno(timer_getoverrun(htimer));
13638         }
13639         return ret;
13640     }
13641 #endif
13642 
13643 #ifdef TARGET_NR_timer_delete
13644     case TARGET_NR_timer_delete:
13645     {
13646         /* args: timer_t timerid */
13647         target_timer_t timerid = get_timer_id(arg1);
13648 
13649         if (timerid < 0) {
13650             ret = timerid;
13651         } else {
13652             timer_t htimer = g_posix_timers[timerid];
13653             ret = get_errno(timer_delete(htimer));
13654             free_host_timer_slot(timerid);
13655         }
13656         return ret;
13657     }
13658 #endif
13659 
13660 #if defined(TARGET_NR_timerfd_create) && defined(CONFIG_TIMERFD)
13661     case TARGET_NR_timerfd_create:
13662         ret = get_errno(timerfd_create(arg1,
13663                         target_to_host_bitmask(arg2, fcntl_flags_tbl)));
13664         if (ret >= 0) {
13665             fd_trans_register(ret, &target_timerfd_trans);
13666         }
13667         return ret;
13668 #endif
13669 
13670 #if defined(TARGET_NR_timerfd_gettime) && defined(CONFIG_TIMERFD)
13671     case TARGET_NR_timerfd_gettime:
13672         {
13673             struct itimerspec its_curr;
13674 
13675             ret = get_errno(timerfd_gettime(arg1, &its_curr));
13676 
13677             if (arg2 && host_to_target_itimerspec(arg2, &its_curr)) {
13678                 return -TARGET_EFAULT;
13679             }
13680         }
13681         return ret;
13682 #endif
13683 
13684 #if defined(TARGET_NR_timerfd_gettime64) && defined(CONFIG_TIMERFD)
13685     case TARGET_NR_timerfd_gettime64:
13686         {
13687             struct itimerspec its_curr;
13688 
13689             ret = get_errno(timerfd_gettime(arg1, &its_curr));
13690 
13691             if (arg2 && host_to_target_itimerspec64(arg2, &its_curr)) {
13692                 return -TARGET_EFAULT;
13693             }
13694         }
13695         return ret;
13696 #endif
13697 
13698 #if defined(TARGET_NR_timerfd_settime) && defined(CONFIG_TIMERFD)
13699     case TARGET_NR_timerfd_settime:
13700         {
13701             struct itimerspec its_new, its_old, *p_new;
13702 
13703             if (arg3) {
13704                 if (target_to_host_itimerspec(&its_new, arg3)) {
13705                     return -TARGET_EFAULT;
13706                 }
13707                 p_new = &its_new;
13708             } else {
13709                 p_new = NULL;
13710             }
13711 
13712             ret = get_errno(timerfd_settime(arg1, arg2, p_new, &its_old));
13713 
13714             if (arg4 && host_to_target_itimerspec(arg4, &its_old)) {
13715                 return -TARGET_EFAULT;
13716             }
13717         }
13718         return ret;
13719 #endif
13720 
13721 #if defined(TARGET_NR_timerfd_settime64) && defined(CONFIG_TIMERFD)
13722     case TARGET_NR_timerfd_settime64:
13723         {
13724             struct itimerspec its_new, its_old, *p_new;
13725 
13726             if (arg3) {
13727                 if (target_to_host_itimerspec64(&its_new, arg3)) {
13728                     return -TARGET_EFAULT;
13729                 }
13730                 p_new = &its_new;
13731             } else {
13732                 p_new = NULL;
13733             }
13734 
13735             ret = get_errno(timerfd_settime(arg1, arg2, p_new, &its_old));
13736 
13737             if (arg4 && host_to_target_itimerspec64(arg4, &its_old)) {
13738                 return -TARGET_EFAULT;
13739             }
13740         }
13741         return ret;
13742 #endif
13743 
13744 #if defined(TARGET_NR_ioprio_get) && defined(__NR_ioprio_get)
13745     case TARGET_NR_ioprio_get:
13746         return get_errno(ioprio_get(arg1, arg2));
13747 #endif
13748 
13749 #if defined(TARGET_NR_ioprio_set) && defined(__NR_ioprio_set)
13750     case TARGET_NR_ioprio_set:
13751         return get_errno(ioprio_set(arg1, arg2, arg3));
13752 #endif
13753 
13754 #if defined(TARGET_NR_setns) && defined(CONFIG_SETNS)
13755     case TARGET_NR_setns:
13756         return get_errno(setns(arg1, arg2));
13757 #endif
13758 #if defined(TARGET_NR_unshare) && defined(CONFIG_SETNS)
13759     case TARGET_NR_unshare:
13760         return get_errno(unshare(arg1));
13761 #endif
13762 #if defined(TARGET_NR_kcmp) && defined(__NR_kcmp)
13763     case TARGET_NR_kcmp:
13764         return get_errno(kcmp(arg1, arg2, arg3, arg4, arg5));
13765 #endif
13766 #ifdef TARGET_NR_swapcontext
13767     case TARGET_NR_swapcontext:
13768         /* PowerPC specific.  */
13769         return do_swapcontext(cpu_env, arg1, arg2, arg3);
13770 #endif
13771 #ifdef TARGET_NR_memfd_create
13772     case TARGET_NR_memfd_create:
13773         p = lock_user_string(arg1);
13774         if (!p) {
13775             return -TARGET_EFAULT;
13776         }
13777         ret = get_errno(memfd_create(p, arg2));
13778         fd_trans_unregister(ret);
13779         unlock_user(p, arg1, 0);
13780         return ret;
13781 #endif
13782 #if defined TARGET_NR_membarrier && defined __NR_membarrier
13783     case TARGET_NR_membarrier:
13784         return get_errno(membarrier(arg1, arg2));
13785 #endif
13786 
13787 #if defined(TARGET_NR_copy_file_range) && defined(__NR_copy_file_range)
13788     case TARGET_NR_copy_file_range:
13789         {
13790             loff_t inoff, outoff;
13791             loff_t *pinoff = NULL, *poutoff = NULL;
13792 
13793             if (arg2) {
13794                 if (get_user_u64(inoff, arg2)) {
13795                     return -TARGET_EFAULT;
13796                 }
13797                 pinoff = &inoff;
13798             }
13799             if (arg4) {
13800                 if (get_user_u64(outoff, arg4)) {
13801                     return -TARGET_EFAULT;
13802                 }
13803                 poutoff = &outoff;
13804             }
13805             /* Do not sign-extend the count parameter. */
13806             ret = get_errno(safe_copy_file_range(arg1, pinoff, arg3, poutoff,
13807                                                  (abi_ulong)arg5, arg6));
13808             if (!is_error(ret) && ret > 0) {
13809                 if (arg2) {
13810                     if (put_user_u64(inoff, arg2)) {
13811                         return -TARGET_EFAULT;
13812                     }
13813                 }
13814                 if (arg4) {
13815                     if (put_user_u64(outoff, arg4)) {
13816                         return -TARGET_EFAULT;
13817                     }
13818                 }
13819             }
13820         }
13821         return ret;
13822 #endif
13823 
13824 #if defined(TARGET_NR_pivot_root)
13825     case TARGET_NR_pivot_root:
13826         {
13827             void *p2;
13828             p = lock_user_string(arg1); /* new_root */
13829             p2 = lock_user_string(arg2); /* put_old */
13830             if (!p || !p2) {
13831                 ret = -TARGET_EFAULT;
13832             } else {
13833                 ret = get_errno(pivot_root(p, p2));
13834             }
13835             unlock_user(p2, arg2, 0);
13836             unlock_user(p, arg1, 0);
13837         }
13838         return ret;
13839 #endif
13840 
13841 #if defined(TARGET_NR_riscv_hwprobe)
13842     case TARGET_NR_riscv_hwprobe:
13843         return do_riscv_hwprobe(cpu_env, arg1, arg2, arg3, arg4, arg5);
13844 #endif
13845 
13846     default:
13847         qemu_log_mask(LOG_UNIMP, "Unsupported syscall: %d\n", num);
13848         return -TARGET_ENOSYS;
13849     }
13850     return ret;
13851 }
13852 
do_syscall(CPUArchState * cpu_env,int num,abi_long arg1,abi_long arg2,abi_long arg3,abi_long arg4,abi_long arg5,abi_long arg6,abi_long arg7,abi_long arg8)13853 abi_long do_syscall(CPUArchState *cpu_env, int num, abi_long arg1,
13854                     abi_long arg2, abi_long arg3, abi_long arg4,
13855                     abi_long arg5, abi_long arg6, abi_long arg7,
13856                     abi_long arg8)
13857 {
13858     CPUState *cpu = env_cpu(cpu_env);
13859     abi_long ret;
13860 
13861 #ifdef DEBUG_ERESTARTSYS
13862     /* Debug-only code for exercising the syscall-restart code paths
13863      * in the per-architecture cpu main loops: restart every syscall
13864      * the guest makes once before letting it through.
13865      */
13866     {
13867         static bool flag;
13868         flag = !flag;
13869         if (flag) {
13870             return -QEMU_ERESTARTSYS;
13871         }
13872     }
13873 #endif
13874 
13875     record_syscall_start(cpu, num, arg1,
13876                          arg2, arg3, arg4, arg5, arg6, arg7, arg8);
13877 
13878     if (unlikely(qemu_loglevel_mask(LOG_STRACE))) {
13879         print_syscall(cpu_env, num, arg1, arg2, arg3, arg4, arg5, arg6);
13880     }
13881 
13882     ret = do_syscall1(cpu_env, num, arg1, arg2, arg3, arg4,
13883                       arg5, arg6, arg7, arg8);
13884 
13885     if (unlikely(qemu_loglevel_mask(LOG_STRACE))) {
13886         print_syscall_ret(cpu_env, num, ret, arg1, arg2,
13887                           arg3, arg4, arg5, arg6);
13888     }
13889 
13890     record_syscall_return(cpu, num, ret);
13891     return ret;
13892 }
13893