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