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