166eed099SWarner Losh /* 266eed099SWarner Losh * BSD syscalls 366eed099SWarner Losh * 466eed099SWarner Losh * Copyright (c) 2003-2008 Fabrice Bellard 566eed099SWarner Losh * Copyright (c) 2013-2014 Stacey D. Son 666eed099SWarner Losh * 766eed099SWarner Losh * This program is free software; you can redistribute it and/or modify 866eed099SWarner Losh * it under the terms of the GNU General Public License as published by 966eed099SWarner Losh * the Free Software Foundation; either version 2 of the License, or 1066eed099SWarner Losh * (at your option) any later version. 1166eed099SWarner Losh * 1266eed099SWarner Losh * This program is distributed in the hope that it will be useful, 1366eed099SWarner Losh * but WITHOUT ANY WARRANTY; without even the implied warranty of 1466eed099SWarner Losh * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1566eed099SWarner Losh * GNU General Public License for more details. 1666eed099SWarner Losh * 1766eed099SWarner Losh * You should have received a copy of the GNU General Public License 1866eed099SWarner Losh * along with this program; if not, see <http://www.gnu.org/licenses/>. 1966eed099SWarner Losh */ 2066eed099SWarner Losh #include "qemu/osdep.h" 2166eed099SWarner Losh #include "qemu/cutils.h" 2266eed099SWarner Losh #include "qemu/path.h" 2366eed099SWarner Losh #include <sys/syscall.h> 2479cfae0cSWarner Losh #include <sys/cdefs.h> 2566eed099SWarner Losh #include <sys/param.h> 26af2ae2e8SWarner Losh #include <sys/mount.h> 2766eed099SWarner Losh #include <sys/sysctl.h> 2866eed099SWarner Losh #include <utime.h> 2966eed099SWarner Losh 30c566080cSAlex Bennée #include "include/gdbstub/syscalls.h" 31c566080cSAlex Bennée 3266eed099SWarner Losh #include "qemu.h" 3366eed099SWarner Losh #include "signal-common.h" 3466eed099SWarner Losh #include "user/syscall-trace.h" 3566eed099SWarner Losh 36c5c84d16SWarner Losh #include "bsd-file.h" 379554d330SWarner Losh #include "bsd-proc.h" 38c5c84d16SWarner Losh 39*36999e6aSKarim Taha /* BSD dependent syscall shims */ 40e800e6c5SWarner Losh #include "os-stat.h" 41*36999e6aSKarim Taha #include "os-proc.h" 42e800e6c5SWarner Losh 4380da1b00SWarner Losh /* I/O */ 4477d3522bSWarner Losh safe_syscall3(int, open, const char *, path, int, flags, mode_t, mode); 4577d3522bSWarner Losh safe_syscall4(int, openat, int, fd, const char *, path, int, flags, mode_t, 4677d3522bSWarner Losh mode); 4777d3522bSWarner Losh 4880da1b00SWarner Losh safe_syscall3(ssize_t, read, int, fd, void *, buf, size_t, nbytes); 4980da1b00SWarner Losh safe_syscall4(ssize_t, pread, int, fd, void *, buf, size_t, nbytes, off_t, 5080da1b00SWarner Losh offset); 5180da1b00SWarner Losh safe_syscall3(ssize_t, readv, int, fd, const struct iovec *, iov, int, iovcnt); 5280da1b00SWarner Losh safe_syscall4(ssize_t, preadv, int, fd, const struct iovec *, iov, int, iovcnt, 5380da1b00SWarner Losh off_t, offset); 5480da1b00SWarner Losh 55770d8abaSWarner Losh safe_syscall3(ssize_t, write, int, fd, void *, buf, size_t, nbytes); 56770d8abaSWarner Losh safe_syscall4(ssize_t, pwrite, int, fd, void *, buf, size_t, nbytes, off_t, 57770d8abaSWarner Losh offset); 58770d8abaSWarner Losh safe_syscall3(ssize_t, writev, int, fd, const struct iovec *, iov, int, iovcnt); 59770d8abaSWarner Losh safe_syscall4(ssize_t, pwritev, int, fd, const struct iovec *, iov, int, iovcnt, 60770d8abaSWarner Losh off_t, offset); 61770d8abaSWarner Losh 6266eed099SWarner Losh void target_set_brk(abi_ulong new_brk) 6366eed099SWarner Losh { 6466eed099SWarner Losh } 6566eed099SWarner Losh 66deeff83bSWarner Losh /* 67deeff83bSWarner Losh * errno conversion. 68deeff83bSWarner Losh */ 69deeff83bSWarner Losh abi_long get_errno(abi_long ret) 70deeff83bSWarner Losh { 71deeff83bSWarner Losh if (ret == -1) { 72deeff83bSWarner Losh return -host_to_target_errno(errno); 73deeff83bSWarner Losh } else { 74deeff83bSWarner Losh return ret; 75deeff83bSWarner Losh } 76deeff83bSWarner Losh } 77deeff83bSWarner Losh 78deeff83bSWarner Losh int host_to_target_errno(int err) 79deeff83bSWarner Losh { 80deeff83bSWarner Losh /* 81deeff83bSWarner Losh * All the BSDs have the property that the error numbers are uniform across 82deeff83bSWarner Losh * all architectures for a given BSD, though they may vary between different 83deeff83bSWarner Losh * BSDs. 84deeff83bSWarner Losh */ 85deeff83bSWarner Losh return err; 86deeff83bSWarner Losh } 87deeff83bSWarner Losh 8866eed099SWarner Losh bool is_error(abi_long ret) 8966eed099SWarner Losh { 9066eed099SWarner Losh return (abi_ulong)ret >= (abi_ulong)(-4096); 9166eed099SWarner Losh } 9266eed099SWarner Losh 9366eed099SWarner Losh /* 941ed771b2SWarner Losh * Unlocks a iovec. Unlike unlock_iovec, it assumes the tvec array itself is 951ed771b2SWarner Losh * already locked from target_addr. It will be unlocked as well as all the iovec 961ed771b2SWarner Losh * elements. 971ed771b2SWarner Losh */ 981ed771b2SWarner Losh static void helper_unlock_iovec(struct target_iovec *target_vec, 991ed771b2SWarner Losh abi_ulong target_addr, struct iovec *vec, 1001ed771b2SWarner Losh int count, int copy) 1011ed771b2SWarner Losh { 1021ed771b2SWarner Losh for (int i = 0; i < count; i++) { 1031ed771b2SWarner Losh abi_ulong base = tswapal(target_vec[i].iov_base); 1041ed771b2SWarner Losh 1051ed771b2SWarner Losh if (vec[i].iov_base) { 1061ed771b2SWarner Losh unlock_user(vec[i].iov_base, base, copy ? vec[i].iov_len : 0); 1071ed771b2SWarner Losh } 1081ed771b2SWarner Losh } 1091ed771b2SWarner Losh unlock_user(target_vec, target_addr, 0); 1101ed771b2SWarner Losh } 1111ed771b2SWarner Losh 1121ed771b2SWarner Losh struct iovec *lock_iovec(int type, abi_ulong target_addr, 1131ed771b2SWarner Losh int count, int copy) 1141ed771b2SWarner Losh { 1151ed771b2SWarner Losh struct target_iovec *target_vec; 1161ed771b2SWarner Losh struct iovec *vec; 1171ed771b2SWarner Losh abi_ulong total_len, max_len; 1181ed771b2SWarner Losh int i; 1191ed771b2SWarner Losh int err = 0; 1201ed771b2SWarner Losh 1211ed771b2SWarner Losh if (count == 0) { 1221ed771b2SWarner Losh errno = 0; 1231ed771b2SWarner Losh return NULL; 1241ed771b2SWarner Losh } 1251ed771b2SWarner Losh if (count < 0 || count > IOV_MAX) { 1261ed771b2SWarner Losh errno = EINVAL; 1271ed771b2SWarner Losh return NULL; 1281ed771b2SWarner Losh } 1291ed771b2SWarner Losh 1301ed771b2SWarner Losh vec = g_try_new0(struct iovec, count); 1311ed771b2SWarner Losh if (vec == NULL) { 1321ed771b2SWarner Losh errno = ENOMEM; 1331ed771b2SWarner Losh return NULL; 1341ed771b2SWarner Losh } 1351ed771b2SWarner Losh 1361ed771b2SWarner Losh target_vec = lock_user(VERIFY_READ, target_addr, 1371ed771b2SWarner Losh count * sizeof(struct target_iovec), 1); 1381ed771b2SWarner Losh if (target_vec == NULL) { 1391ed771b2SWarner Losh err = EFAULT; 1401ed771b2SWarner Losh goto fail2; 1411ed771b2SWarner Losh } 1421ed771b2SWarner Losh 1431ed771b2SWarner Losh max_len = 0x7fffffff & MIN(TARGET_PAGE_MASK, PAGE_MASK); 1441ed771b2SWarner Losh total_len = 0; 1451ed771b2SWarner Losh 1461ed771b2SWarner Losh for (i = 0; i < count; i++) { 1471ed771b2SWarner Losh abi_ulong base = tswapal(target_vec[i].iov_base); 1481ed771b2SWarner Losh abi_long len = tswapal(target_vec[i].iov_len); 1491ed771b2SWarner Losh 1501ed771b2SWarner Losh if (len < 0) { 1511ed771b2SWarner Losh err = EINVAL; 1521ed771b2SWarner Losh goto fail; 1531ed771b2SWarner Losh } else if (len == 0) { 1541ed771b2SWarner Losh /* Zero length pointer is ignored. */ 1551ed771b2SWarner Losh vec[i].iov_base = 0; 1561ed771b2SWarner Losh } else { 1571ed771b2SWarner Losh vec[i].iov_base = lock_user(type, base, len, copy); 1581ed771b2SWarner Losh /* 1591ed771b2SWarner Losh * If the first buffer pointer is bad, this is a fault. But 1601ed771b2SWarner Losh * subsequent bad buffers will result in a partial write; this is 1611ed771b2SWarner Losh * realized by filling the vector with null pointers and zero 1621ed771b2SWarner Losh * lengths. 1631ed771b2SWarner Losh */ 1641ed771b2SWarner Losh if (!vec[i].iov_base) { 1651ed771b2SWarner Losh if (i == 0) { 1661ed771b2SWarner Losh err = EFAULT; 1671ed771b2SWarner Losh goto fail; 1681ed771b2SWarner Losh } else { 1691ed771b2SWarner Losh /* 1701ed771b2SWarner Losh * Fail all the subsequent addresses, they are already 1711ed771b2SWarner Losh * zero'd. 1721ed771b2SWarner Losh */ 1731ed771b2SWarner Losh goto out; 1741ed771b2SWarner Losh } 1751ed771b2SWarner Losh } 1761ed771b2SWarner Losh if (len > max_len - total_len) { 1771ed771b2SWarner Losh len = max_len - total_len; 1781ed771b2SWarner Losh } 1791ed771b2SWarner Losh } 1801ed771b2SWarner Losh vec[i].iov_len = len; 1811ed771b2SWarner Losh total_len += len; 1821ed771b2SWarner Losh } 1831ed771b2SWarner Losh out: 1841ed771b2SWarner Losh unlock_user(target_vec, target_addr, 0); 1851ed771b2SWarner Losh return vec; 1861ed771b2SWarner Losh 1871ed771b2SWarner Losh fail: 1881ed771b2SWarner Losh helper_unlock_iovec(target_vec, target_addr, vec, i, copy); 1891ed771b2SWarner Losh fail2: 1901ed771b2SWarner Losh g_free(vec); 1911ed771b2SWarner Losh errno = err; 1921ed771b2SWarner Losh return NULL; 1931ed771b2SWarner Losh } 1941ed771b2SWarner Losh 195883808d8SWarner Losh void unlock_iovec(struct iovec *vec, abi_ulong target_addr, 196883808d8SWarner Losh int count, int copy) 197883808d8SWarner Losh { 198883808d8SWarner Losh struct target_iovec *target_vec; 199883808d8SWarner Losh 200883808d8SWarner Losh target_vec = lock_user(VERIFY_READ, target_addr, 201883808d8SWarner Losh count * sizeof(struct target_iovec), 1); 202883808d8SWarner Losh if (target_vec) { 203883808d8SWarner Losh helper_unlock_iovec(target_vec, target_addr, vec, count, copy); 204883808d8SWarner Losh } 205883808d8SWarner Losh 206883808d8SWarner Losh g_free(vec); 207883808d8SWarner Losh } 208883808d8SWarner Losh 2091ed771b2SWarner Losh /* 210db697887SWarner Losh * All errnos that freebsd_syscall() returns must be -TARGET_<errcode>. 211db697887SWarner Losh */ 212db697887SWarner Losh static abi_long freebsd_syscall(void *cpu_env, int num, abi_long arg1, 213db697887SWarner Losh abi_long arg2, abi_long arg3, abi_long arg4, 214db697887SWarner Losh abi_long arg5, abi_long arg6, abi_long arg7, 215db697887SWarner Losh abi_long arg8) 216db697887SWarner Losh { 217db697887SWarner Losh abi_long ret; 218db697887SWarner Losh 219db697887SWarner Losh switch (num) { 2209554d330SWarner Losh /* 2219554d330SWarner Losh * process system calls 2229554d330SWarner Losh */ 223*36999e6aSKarim Taha case TARGET_FREEBSD_NR_execve: /* execve(2) */ 224*36999e6aSKarim Taha ret = do_freebsd_execve(arg1, arg2, arg3); 225*36999e6aSKarim Taha break; 226*36999e6aSKarim Taha 227*36999e6aSKarim Taha case TARGET_FREEBSD_NR_fexecve: /* fexecve(2) */ 228*36999e6aSKarim Taha ret = do_freebsd_fexecve(arg1, arg2, arg3); 229*36999e6aSKarim Taha break; 230*36999e6aSKarim Taha 2319554d330SWarner Losh case TARGET_FREEBSD_NR_exit: /* exit(2) */ 2329554d330SWarner Losh ret = do_bsd_exit(cpu_env, arg1); 2339554d330SWarner Losh break; 23480da1b00SWarner Losh 235a478416dSStacey Son case TARGET_FREEBSD_NR_getgroups: /* getgroups(2) */ 236a478416dSStacey Son ret = do_bsd_getgroups(arg1, arg2); 237a478416dSStacey Son break; 238a478416dSStacey Son 239a478416dSStacey Son case TARGET_FREEBSD_NR_setgroups: /* setgroups(2) */ 240a478416dSStacey Son ret = do_bsd_setgroups(arg1, arg2); 241a478416dSStacey Son break; 242a478416dSStacey Son 24382fe5f3aSStacey Son case TARGET_FREEBSD_NR_umask: /* umask(2) */ 24482fe5f3aSStacey Son ret = do_bsd_umask(arg1); 24582fe5f3aSStacey Son break; 24682fe5f3aSStacey Son 24782fe5f3aSStacey Son case TARGET_FREEBSD_NR_setlogin: /* setlogin(2) */ 24882fe5f3aSStacey Son ret = do_bsd_setlogin(arg1); 24982fe5f3aSStacey Son break; 25082fe5f3aSStacey Son 25182fe5f3aSStacey Son case TARGET_FREEBSD_NR_getlogin: /* getlogin(2) */ 25282fe5f3aSStacey Son ret = do_bsd_getlogin(arg1, arg2); 25382fe5f3aSStacey Son break; 25482fe5f3aSStacey Son 25559e801efSStacey Son case TARGET_FREEBSD_NR_getrusage: /* getrusage(2) */ 25659e801efSStacey Son ret = do_bsd_getrusage(arg1, arg2); 25759e801efSStacey Son break; 25859e801efSStacey Son 259faba8e12SStacey Son case TARGET_FREEBSD_NR_getrlimit: /* getrlimit(2) */ 260faba8e12SStacey Son ret = do_bsd_getrlimit(arg1, arg2); 261faba8e12SStacey Son break; 262faba8e12SStacey Son 263faba8e12SStacey Son case TARGET_FREEBSD_NR_setrlimit: /* setrlimit(2) */ 264faba8e12SStacey Son ret = do_bsd_setrlimit(arg1, arg2); 265faba8e12SStacey Son break; 266faba8e12SStacey Son 267e4446e0aSStacey Son case TARGET_FREEBSD_NR_getpid: /* getpid(2) */ 268e4446e0aSStacey Son ret = do_bsd_getpid(); 269e4446e0aSStacey Son break; 270e4446e0aSStacey Son 271e4446e0aSStacey Son case TARGET_FREEBSD_NR_getppid: /* getppid(2) */ 272e4446e0aSStacey Son ret = do_bsd_getppid(); 273e4446e0aSStacey Son break; 274e4446e0aSStacey Son 275e4446e0aSStacey Son case TARGET_FREEBSD_NR_getuid: /* getuid(2) */ 276e4446e0aSStacey Son ret = do_bsd_getuid(); 277e4446e0aSStacey Son break; 278e4446e0aSStacey Son 279e4446e0aSStacey Son case TARGET_FREEBSD_NR_geteuid: /* geteuid(2) */ 280e4446e0aSStacey Son ret = do_bsd_geteuid(); 281e4446e0aSStacey Son break; 282e4446e0aSStacey Son 283e4446e0aSStacey Son case TARGET_FREEBSD_NR_getgid: /* getgid(2) */ 284e4446e0aSStacey Son ret = do_bsd_getgid(); 285e4446e0aSStacey Son break; 286e4446e0aSStacey Son 287e4446e0aSStacey Son case TARGET_FREEBSD_NR_getegid: /* getegid(2) */ 288e4446e0aSStacey Son ret = do_bsd_getegid(); 289e4446e0aSStacey Son break; 290e4446e0aSStacey Son 291e4446e0aSStacey Son case TARGET_FREEBSD_NR_setuid: /* setuid(2) */ 292e4446e0aSStacey Son ret = do_bsd_setuid(arg1); 293e4446e0aSStacey Son break; 294e4446e0aSStacey Son 295e4446e0aSStacey Son case TARGET_FREEBSD_NR_seteuid: /* seteuid(2) */ 296e4446e0aSStacey Son ret = do_bsd_seteuid(arg1); 297e4446e0aSStacey Son break; 298e4446e0aSStacey Son 299e4446e0aSStacey Son case TARGET_FREEBSD_NR_setgid: /* setgid(2) */ 300e4446e0aSStacey Son ret = do_bsd_setgid(arg1); 301e4446e0aSStacey Son break; 302e4446e0aSStacey Son 303e4446e0aSStacey Son case TARGET_FREEBSD_NR_setegid: /* setegid(2) */ 304e4446e0aSStacey Son ret = do_bsd_setegid(arg1); 305e4446e0aSStacey Son break; 306e4446e0aSStacey Son 307e4446e0aSStacey Son case TARGET_FREEBSD_NR_getpgrp: /* getpgrp(2) */ 308e4446e0aSStacey Son ret = do_bsd_getpgrp(); 309e4446e0aSStacey Son break; 310e4446e0aSStacey Son 311e4446e0aSStacey Son case TARGET_FREEBSD_NR_getpgid: /* getpgid(2) */ 312e4446e0aSStacey Son ret = do_bsd_getpgid(arg1); 313e4446e0aSStacey Son break; 314e4446e0aSStacey Son 315e4446e0aSStacey Son case TARGET_FREEBSD_NR_setpgid: /* setpgid(2) */ 316e4446e0aSStacey Son ret = do_bsd_setpgid(arg1, arg2); 317e4446e0aSStacey Son break; 318e4446e0aSStacey Son 319e4446e0aSStacey Son case TARGET_FREEBSD_NR_setreuid: /* setreuid(2) */ 320e4446e0aSStacey Son ret = do_bsd_setreuid(arg1, arg2); 321e4446e0aSStacey Son break; 322e4446e0aSStacey Son 323e4446e0aSStacey Son case TARGET_FREEBSD_NR_setregid: /* setregid(2) */ 324e4446e0aSStacey Son ret = do_bsd_setregid(arg1, arg2); 325e4446e0aSStacey Son break; 326e4446e0aSStacey Son 327932683c3SStacey Son case TARGET_FREEBSD_NR_getresuid: /* getresuid(2) */ 328932683c3SStacey Son ret = do_bsd_getresuid(arg1, arg2, arg3); 329932683c3SStacey Son break; 330932683c3SStacey Son 331932683c3SStacey Son case TARGET_FREEBSD_NR_getresgid: /* getresgid(2) */ 332932683c3SStacey Son ret = do_bsd_getresgid(arg1, arg2, arg3); 333932683c3SStacey Son break; 334932683c3SStacey Son 335932683c3SStacey Son case TARGET_FREEBSD_NR_setresuid: /* setresuid(2) */ 336932683c3SStacey Son ret = do_bsd_setresuid(arg1, arg2, arg3); 337932683c3SStacey Son break; 338932683c3SStacey Son 339932683c3SStacey Son case TARGET_FREEBSD_NR_setresgid: /* setresgid(2) */ 340932683c3SStacey Son ret = do_bsd_setresgid(arg1, arg2, arg3); 341932683c3SStacey Son break; 342932683c3SStacey Son 343932683c3SStacey Son case TARGET_FREEBSD_NR_getsid: /* getsid(2) */ 344932683c3SStacey Son ret = do_bsd_getsid(arg1); 345932683c3SStacey Son break; 346932683c3SStacey Son 347932683c3SStacey Son case TARGET_FREEBSD_NR_setsid: /* setsid(2) */ 348932683c3SStacey Son ret = do_bsd_setsid(); 349932683c3SStacey Son break; 350932683c3SStacey Son 351932683c3SStacey Son case TARGET_FREEBSD_NR_issetugid: /* issetugid(2) */ 352932683c3SStacey Son ret = do_bsd_issetugid(); 353932683c3SStacey Son break; 354932683c3SStacey Son 355615ad41cSStacey Son case TARGET_FREEBSD_NR_profil: /* profil(2) */ 356615ad41cSStacey Son ret = do_bsd_profil(arg1, arg2, arg3, arg4); 357615ad41cSStacey Son break; 358615ad41cSStacey Son 359615ad41cSStacey Son case TARGET_FREEBSD_NR_ktrace: /* ktrace(2) */ 360615ad41cSStacey Son ret = do_bsd_ktrace(arg1, arg2, arg3, arg4); 361615ad41cSStacey Son break; 362615ad41cSStacey Son 363615ad41cSStacey Son case TARGET_FREEBSD_NR_utrace: /* utrace(2) */ 364615ad41cSStacey Son ret = do_bsd_utrace(arg1, arg2); 365615ad41cSStacey Son break; 366615ad41cSStacey Son 367615ad41cSStacey Son case TARGET_FREEBSD_NR_ptrace: /* ptrace(2) */ 368615ad41cSStacey Son ret = do_bsd_ptrace(arg1, arg2, arg3, arg4); 369615ad41cSStacey Son break; 370615ad41cSStacey Son 371ff266372SStacey Son case TARGET_FREEBSD_NR_getpriority: /* getpriority(2) */ 372ff266372SStacey Son ret = do_bsd_getpriority(arg1, arg2); 373ff266372SStacey Son break; 374ff266372SStacey Son 375ff266372SStacey Son case TARGET_FREEBSD_NR_setpriority: /* setpriority(2) */ 376ff266372SStacey Son ret = do_bsd_setpriority(arg1, arg2, arg3); 377ff266372SStacey Son break; 378ff266372SStacey Son 379dcaa3dfdSStacey Son case TARGET_FREEBSD_NR_procctl: /* procctl(2) */ 380dcaa3dfdSStacey Son ret = do_freebsd_procctl(cpu_env, arg1, arg2, arg3, arg4, arg5, arg6); 381dcaa3dfdSStacey Son break; 382a478416dSStacey Son 38380da1b00SWarner Losh /* 38480da1b00SWarner Losh * File system calls. 38580da1b00SWarner Losh */ 38680da1b00SWarner Losh case TARGET_FREEBSD_NR_read: /* read(2) */ 38780da1b00SWarner Losh ret = do_bsd_read(arg1, arg2, arg3); 38880da1b00SWarner Losh break; 38980da1b00SWarner Losh 39080da1b00SWarner Losh case TARGET_FREEBSD_NR_pread: /* pread(2) */ 39180da1b00SWarner Losh ret = do_bsd_pread(cpu_env, arg1, arg2, arg3, arg4, arg5, arg6); 39280da1b00SWarner Losh break; 39380da1b00SWarner Losh 39480da1b00SWarner Losh case TARGET_FREEBSD_NR_readv: /* readv(2) */ 39580da1b00SWarner Losh ret = do_bsd_readv(arg1, arg2, arg3); 39680da1b00SWarner Losh break; 39780da1b00SWarner Losh 39880da1b00SWarner Losh case TARGET_FREEBSD_NR_preadv: /* preadv(2) */ 39980da1b00SWarner Losh ret = do_bsd_preadv(cpu_env, arg1, arg2, arg3, arg4, arg5, arg6); 400f51e7c41SWarner Losh break; 401770d8abaSWarner Losh 402770d8abaSWarner Losh case TARGET_FREEBSD_NR_write: /* write(2) */ 403770d8abaSWarner Losh ret = do_bsd_write(arg1, arg2, arg3); 404770d8abaSWarner Losh break; 405770d8abaSWarner Losh 406770d8abaSWarner Losh case TARGET_FREEBSD_NR_pwrite: /* pwrite(2) */ 407770d8abaSWarner Losh ret = do_bsd_pwrite(cpu_env, arg1, arg2, arg3, arg4, arg5, arg6); 408770d8abaSWarner Losh break; 409770d8abaSWarner Losh 410770d8abaSWarner Losh case TARGET_FREEBSD_NR_writev: /* writev(2) */ 411770d8abaSWarner Losh ret = do_bsd_writev(arg1, arg2, arg3); 412770d8abaSWarner Losh break; 413770d8abaSWarner Losh 414770d8abaSWarner Losh case TARGET_FREEBSD_NR_pwritev: /* pwritev(2) */ 415770d8abaSWarner Losh ret = do_bsd_pwritev(cpu_env, arg1, arg2, arg3, arg4, arg5, arg6); 41680da1b00SWarner Losh break; 41780da1b00SWarner Losh 41877d3522bSWarner Losh case TARGET_FREEBSD_NR_open: /* open(2) */ 41977d3522bSWarner Losh ret = do_bsd_open(arg1, arg2, arg3); 42077d3522bSWarner Losh break; 42177d3522bSWarner Losh 42277d3522bSWarner Losh case TARGET_FREEBSD_NR_openat: /* openat(2) */ 42377d3522bSWarner Losh ret = do_bsd_openat(arg1, arg2, arg3, arg4); 42477d3522bSWarner Losh break; 42577d3522bSWarner Losh 42677d3522bSWarner Losh case TARGET_FREEBSD_NR_close: /* close(2) */ 42777d3522bSWarner Losh ret = do_bsd_close(arg1); 42877d3522bSWarner Losh break; 42977d3522bSWarner Losh 430a2ba6c7bSWarner Losh case TARGET_FREEBSD_NR_fdatasync: /* fdatasync(2) */ 431a2ba6c7bSWarner Losh ret = do_bsd_fdatasync(arg1); 432a2ba6c7bSWarner Losh break; 433a2ba6c7bSWarner Losh 434a2ba6c7bSWarner Losh case TARGET_FREEBSD_NR_fsync: /* fsync(2) */ 435a2ba6c7bSWarner Losh ret = do_bsd_fsync(arg1); 436a2ba6c7bSWarner Losh break; 437a2ba6c7bSWarner Losh 438a2ba6c7bSWarner Losh case TARGET_FREEBSD_NR_freebsd12_closefrom: /* closefrom(2) */ 439a2ba6c7bSWarner Losh ret = do_bsd_closefrom(arg1); 440a2ba6c7bSWarner Losh break; 441a2ba6c7bSWarner Losh 44265c6c4c8SWarner Losh case TARGET_FREEBSD_NR_revoke: /* revoke(2) */ 44365c6c4c8SWarner Losh ret = do_bsd_revoke(arg1); 44465c6c4c8SWarner Losh break; 44565c6c4c8SWarner Losh 44665c6c4c8SWarner Losh case TARGET_FREEBSD_NR_access: /* access(2) */ 44765c6c4c8SWarner Losh ret = do_bsd_access(arg1, arg2); 44865c6c4c8SWarner Losh break; 44965c6c4c8SWarner Losh 45065c6c4c8SWarner Losh case TARGET_FREEBSD_NR_eaccess: /* eaccess(2) */ 45165c6c4c8SWarner Losh ret = do_bsd_eaccess(arg1, arg2); 45265c6c4c8SWarner Losh break; 45365c6c4c8SWarner Losh 45465c6c4c8SWarner Losh case TARGET_FREEBSD_NR_faccessat: /* faccessat(2) */ 45565c6c4c8SWarner Losh ret = do_bsd_faccessat(arg1, arg2, arg3, arg4); 45665c6c4c8SWarner Losh break; 45765c6c4c8SWarner Losh 458390f547eSWarner Losh case TARGET_FREEBSD_NR_chdir: /* chdir(2) */ 459390f547eSWarner Losh ret = do_bsd_chdir(arg1); 460390f547eSWarner Losh break; 461390f547eSWarner Losh 462390f547eSWarner Losh case TARGET_FREEBSD_NR_fchdir: /* fchdir(2) */ 463390f547eSWarner Losh ret = do_bsd_fchdir(arg1); 464390f547eSWarner Losh break; 465390f547eSWarner Losh 466ab5fd2d9SWarner Losh case TARGET_FREEBSD_NR_rename: /* rename(2) */ 467ab5fd2d9SWarner Losh ret = do_bsd_rename(arg1, arg2); 468ab5fd2d9SWarner Losh break; 469ab5fd2d9SWarner Losh 470ab5fd2d9SWarner Losh case TARGET_FREEBSD_NR_renameat: /* renameat(2) */ 471ab5fd2d9SWarner Losh ret = do_bsd_renameat(arg1, arg2, arg3, arg4); 472ab5fd2d9SWarner Losh break; 473ab5fd2d9SWarner Losh 4742d3b7e01SWarner Losh case TARGET_FREEBSD_NR_link: /* link(2) */ 4752d3b7e01SWarner Losh ret = do_bsd_link(arg1, arg2); 4762d3b7e01SWarner Losh break; 4772d3b7e01SWarner Losh 4782d3b7e01SWarner Losh case TARGET_FREEBSD_NR_linkat: /* linkat(2) */ 4792d3b7e01SWarner Losh ret = do_bsd_linkat(arg1, arg2, arg3, arg4, arg5); 4802d3b7e01SWarner Losh break; 4812d3b7e01SWarner Losh 4822d3b7e01SWarner Losh case TARGET_FREEBSD_NR_unlink: /* unlink(2) */ 4832d3b7e01SWarner Losh ret = do_bsd_unlink(arg1); 4842d3b7e01SWarner Losh break; 4852d3b7e01SWarner Losh 4862d3b7e01SWarner Losh case TARGET_FREEBSD_NR_unlinkat: /* unlinkat(2) */ 4872d3b7e01SWarner Losh ret = do_bsd_unlinkat(arg1, arg2, arg3); 4882d3b7e01SWarner Losh break; 4892d3b7e01SWarner Losh 4901ffbd5e7SWarner Losh case TARGET_FREEBSD_NR_mkdir: /* mkdir(2) */ 4911ffbd5e7SWarner Losh ret = do_bsd_mkdir(arg1, arg2); 4921ffbd5e7SWarner Losh break; 4931ffbd5e7SWarner Losh 4941ffbd5e7SWarner Losh case TARGET_FREEBSD_NR_mkdirat: /* mkdirat(2) */ 4951ffbd5e7SWarner Losh ret = do_bsd_mkdirat(arg1, arg2, arg3); 4961ffbd5e7SWarner Losh break; 4971ffbd5e7SWarner Losh 4986af8f76aSWarner Losh case TARGET_FREEBSD_NR_rmdir: /* rmdir(2) (XXX no rmdirat()?) */ 4996af8f76aSWarner Losh ret = do_bsd_rmdir(arg1); 5006af8f76aSWarner Losh break; 5016af8f76aSWarner Losh 5026af8f76aSWarner Losh case TARGET_FREEBSD_NR___getcwd: /* undocumented __getcwd() */ 5036af8f76aSWarner Losh ret = do_bsd___getcwd(arg1, arg2); 5046af8f76aSWarner Losh break; 5056af8f76aSWarner Losh 506a15699acSWarner Losh case TARGET_FREEBSD_NR_dup: /* dup(2) */ 507a15699acSWarner Losh ret = do_bsd_dup(arg1); 508a15699acSWarner Losh break; 509a15699acSWarner Losh 510a15699acSWarner Losh case TARGET_FREEBSD_NR_dup2: /* dup2(2) */ 511a15699acSWarner Losh ret = do_bsd_dup2(arg1, arg2); 512a15699acSWarner Losh break; 513a15699acSWarner Losh 5144b795b14SWarner Losh case TARGET_FREEBSD_NR_truncate: /* truncate(2) */ 5154b795b14SWarner Losh ret = do_bsd_truncate(cpu_env, arg1, arg2, arg3, arg4); 5164b795b14SWarner Losh break; 5174b795b14SWarner Losh 5184b795b14SWarner Losh case TARGET_FREEBSD_NR_ftruncate: /* ftruncate(2) */ 5194b795b14SWarner Losh ret = do_bsd_ftruncate(cpu_env, arg1, arg2, arg3, arg4); 5204b795b14SWarner Losh break; 5214b795b14SWarner Losh 522d35020edSWarner Losh case TARGET_FREEBSD_NR_acct: /* acct(2) */ 523d35020edSWarner Losh ret = do_bsd_acct(arg1); 524d35020edSWarner Losh break; 525d35020edSWarner Losh 526d35020edSWarner Losh case TARGET_FREEBSD_NR_sync: /* sync(2) */ 527d35020edSWarner Losh ret = do_bsd_sync(); 528d35020edSWarner Losh break; 529d35020edSWarner Losh 530af2ae2e8SWarner Losh case TARGET_FREEBSD_NR_mount: /* mount(2) */ 531af2ae2e8SWarner Losh ret = do_bsd_mount(arg1, arg2, arg3, arg4); 532af2ae2e8SWarner Losh break; 533af2ae2e8SWarner Losh 534af2ae2e8SWarner Losh case TARGET_FREEBSD_NR_unmount: /* unmount(2) */ 535af2ae2e8SWarner Losh ret = do_bsd_unmount(arg1, arg2); 536af2ae2e8SWarner Losh break; 537af2ae2e8SWarner Losh 538af2ae2e8SWarner Losh case TARGET_FREEBSD_NR_nmount: /* nmount(2) */ 539af2ae2e8SWarner Losh ret = do_bsd_nmount(arg1, arg2, arg3); 540af2ae2e8SWarner Losh break; 541af2ae2e8SWarner Losh 542c7b62b4aSWarner Losh case TARGET_FREEBSD_NR_symlink: /* symlink(2) */ 543c7b62b4aSWarner Losh ret = do_bsd_symlink(arg1, arg2); 544c7b62b4aSWarner Losh break; 545c7b62b4aSWarner Losh 546c7b62b4aSWarner Losh case TARGET_FREEBSD_NR_symlinkat: /* symlinkat(2) */ 547c7b62b4aSWarner Losh ret = do_bsd_symlinkat(arg1, arg2, arg3); 548c7b62b4aSWarner Losh break; 549c7b62b4aSWarner Losh 550c7b62b4aSWarner Losh case TARGET_FREEBSD_NR_readlink: /* readlink(2) */ 551c7b62b4aSWarner Losh ret = do_bsd_readlink(cpu_env, arg1, arg2, arg3); 552c7b62b4aSWarner Losh break; 553c7b62b4aSWarner Losh 554c7b62b4aSWarner Losh case TARGET_FREEBSD_NR_readlinkat: /* readlinkat(2) */ 555c7b62b4aSWarner Losh ret = do_bsd_readlinkat(arg1, arg2, arg3, arg4); 556c7b62b4aSWarner Losh break; 557c7b62b4aSWarner Losh 5580db0db8fSWarner Losh case TARGET_FREEBSD_NR_chmod: /* chmod(2) */ 5590db0db8fSWarner Losh ret = do_bsd_chmod(arg1, arg2); 5600db0db8fSWarner Losh break; 5610db0db8fSWarner Losh 5620db0db8fSWarner Losh case TARGET_FREEBSD_NR_fchmod: /* fchmod(2) */ 5630db0db8fSWarner Losh ret = do_bsd_fchmod(arg1, arg2); 5640db0db8fSWarner Losh break; 5650db0db8fSWarner Losh 5660db0db8fSWarner Losh case TARGET_FREEBSD_NR_lchmod: /* lchmod(2) */ 5670db0db8fSWarner Losh ret = do_bsd_lchmod(arg1, arg2); 5680db0db8fSWarner Losh break; 5690db0db8fSWarner Losh 5700db0db8fSWarner Losh case TARGET_FREEBSD_NR_fchmodat: /* fchmodat(2) */ 5710db0db8fSWarner Losh ret = do_bsd_fchmodat(arg1, arg2, arg3, arg4); 5720db0db8fSWarner Losh break; 5730db0db8fSWarner Losh 57479cfae0cSWarner Losh case TARGET_FREEBSD_NR_freebsd11_mknod: /* mknod(2) */ 57579cfae0cSWarner Losh ret = do_bsd_freebsd11_mknod(arg1, arg2, arg3); 57679cfae0cSWarner Losh break; 57779cfae0cSWarner Losh 57879cfae0cSWarner Losh case TARGET_FREEBSD_NR_freebsd11_mknodat: /* mknodat(2) */ 57979cfae0cSWarner Losh ret = do_bsd_freebsd11_mknodat(arg1, arg2, arg3, arg4); 58079cfae0cSWarner Losh break; 58179cfae0cSWarner Losh 58279cfae0cSWarner Losh case TARGET_FREEBSD_NR_mknodat: /* mknodat(2) */ 58379cfae0cSWarner Losh ret = do_bsd_mknodat(cpu_env, arg1, arg2, arg3, arg4, arg5, arg6); 58479cfae0cSWarner Losh break; 58579cfae0cSWarner Losh 58658af3e29SWarner Losh case TARGET_FREEBSD_NR_chown: /* chown(2) */ 58758af3e29SWarner Losh ret = do_bsd_chown(arg1, arg2, arg3); 58858af3e29SWarner Losh break; 58958af3e29SWarner Losh 59058af3e29SWarner Losh case TARGET_FREEBSD_NR_fchown: /* fchown(2) */ 59158af3e29SWarner Losh ret = do_bsd_fchown(arg1, arg2, arg3); 59258af3e29SWarner Losh break; 59358af3e29SWarner Losh 59458af3e29SWarner Losh case TARGET_FREEBSD_NR_lchown: /* lchown(2) */ 59558af3e29SWarner Losh ret = do_bsd_lchown(arg1, arg2, arg3); 59658af3e29SWarner Losh break; 59758af3e29SWarner Losh 59858af3e29SWarner Losh case TARGET_FREEBSD_NR_fchownat: /* fchownat(2) */ 59958af3e29SWarner Losh ret = do_bsd_fchownat(arg1, arg2, arg3, arg4, arg5); 60058af3e29SWarner Losh break; 60158af3e29SWarner Losh 602c6f0a7d9SWarner Losh case TARGET_FREEBSD_NR_chflags: /* chflags(2) */ 603c6f0a7d9SWarner Losh ret = do_bsd_chflags(arg1, arg2); 604c6f0a7d9SWarner Losh break; 605c6f0a7d9SWarner Losh 606c6f0a7d9SWarner Losh case TARGET_FREEBSD_NR_lchflags: /* lchflags(2) */ 607c6f0a7d9SWarner Losh ret = do_bsd_lchflags(arg1, arg2); 608c6f0a7d9SWarner Losh break; 609c6f0a7d9SWarner Losh 610c6f0a7d9SWarner Losh case TARGET_FREEBSD_NR_fchflags: /* fchflags(2) */ 611c6f0a7d9SWarner Losh ret = do_bsd_fchflags(arg1, arg2); 612c6f0a7d9SWarner Losh break; 613c6f0a7d9SWarner Losh 61417a4d13cSWarner Losh case TARGET_FREEBSD_NR_chroot: /* chroot(2) */ 61517a4d13cSWarner Losh ret = do_bsd_chroot(arg1); 61617a4d13cSWarner Losh break; 61717a4d13cSWarner Losh 61817a4d13cSWarner Losh case TARGET_FREEBSD_NR_flock: /* flock(2) */ 61917a4d13cSWarner Losh ret = do_bsd_flock(arg1, arg2); 62017a4d13cSWarner Losh break; 62117a4d13cSWarner Losh 6225fbd8011SWarner Losh case TARGET_FREEBSD_NR_mkfifo: /* mkfifo(2) */ 6235fbd8011SWarner Losh ret = do_bsd_mkfifo(arg1, arg2); 6245fbd8011SWarner Losh break; 6255fbd8011SWarner Losh 6265fbd8011SWarner Losh case TARGET_FREEBSD_NR_mkfifoat: /* mkfifoat(2) */ 6275fbd8011SWarner Losh ret = do_bsd_mkfifoat(arg1, arg2, arg3); 6285fbd8011SWarner Losh break; 6295fbd8011SWarner Losh 630d3f29ddaSWarner Losh case TARGET_FREEBSD_NR_pathconf: /* pathconf(2) */ 631d3f29ddaSWarner Losh ret = do_bsd_pathconf(arg1, arg2); 632d3f29ddaSWarner Losh break; 633d3f29ddaSWarner Losh 634d3f29ddaSWarner Losh case TARGET_FREEBSD_NR_lpathconf: /* lpathconf(2) */ 635d3f29ddaSWarner Losh ret = do_bsd_lpathconf(arg1, arg2); 636d3f29ddaSWarner Losh break; 637d3f29ddaSWarner Losh 638d3f29ddaSWarner Losh case TARGET_FREEBSD_NR_fpathconf: /* fpathconf(2) */ 639d3f29ddaSWarner Losh ret = do_bsd_fpathconf(arg1, arg2); 640d3f29ddaSWarner Losh break; 641d3f29ddaSWarner Losh 642952d5d30SWarner Losh case TARGET_FREEBSD_NR_undelete: /* undelete(2) */ 643952d5d30SWarner Losh ret = do_bsd_undelete(arg1); 644952d5d30SWarner Losh break; 645952d5d30SWarner Losh 646fb96f5dfSStacey Son /* 647e800e6c5SWarner Losh * stat system calls 648e800e6c5SWarner Losh */ 649e800e6c5SWarner Losh case TARGET_FREEBSD_NR_freebsd11_stat: /* stat(2) */ 650e800e6c5SWarner Losh ret = do_freebsd11_stat(arg1, arg2); 651e800e6c5SWarner Losh break; 652e800e6c5SWarner Losh 653e800e6c5SWarner Losh case TARGET_FREEBSD_NR_freebsd11_lstat: /* lstat(2) */ 654e800e6c5SWarner Losh ret = do_freebsd11_lstat(arg1, arg2); 655e800e6c5SWarner Losh break; 656e800e6c5SWarner Losh 657e800e6c5SWarner Losh case TARGET_FREEBSD_NR_freebsd11_fstat: /* fstat(2) */ 658e800e6c5SWarner Losh ret = do_freebsd11_fstat(arg1, arg2); 659e800e6c5SWarner Losh break; 660e800e6c5SWarner Losh 661e800e6c5SWarner Losh case TARGET_FREEBSD_NR_fstat: /* fstat(2) */ 662e800e6c5SWarner Losh ret = do_freebsd_fstat(arg1, arg2); 663e800e6c5SWarner Losh break; 664e800e6c5SWarner Losh 665e800e6c5SWarner Losh case TARGET_FREEBSD_NR_freebsd11_fstatat: /* fstatat(2) */ 666e800e6c5SWarner Losh ret = do_freebsd11_fstatat(arg1, arg2, arg3, arg4); 667e800e6c5SWarner Losh break; 668e800e6c5SWarner Losh 669e800e6c5SWarner Losh case TARGET_FREEBSD_NR_fstatat: /* fstatat(2) */ 670e800e6c5SWarner Losh ret = do_freebsd_fstatat(arg1, arg2, arg3, arg4); 671e800e6c5SWarner Losh break; 672e800e6c5SWarner Losh 673e800e6c5SWarner Losh case TARGET_FREEBSD_NR_freebsd11_nstat: /* undocumented */ 674e800e6c5SWarner Losh ret = do_freebsd11_nstat(arg1, arg2); 675e800e6c5SWarner Losh break; 676e800e6c5SWarner Losh 677e800e6c5SWarner Losh case TARGET_FREEBSD_NR_freebsd11_nfstat: /* undocumented */ 678e800e6c5SWarner Losh ret = do_freebsd11_nfstat(arg1, arg2); 679e800e6c5SWarner Losh break; 680e800e6c5SWarner Losh 681e800e6c5SWarner Losh case TARGET_FREEBSD_NR_freebsd11_nlstat: /* undocumented */ 682e800e6c5SWarner Losh ret = do_freebsd11_nlstat(arg1, arg2); 683e800e6c5SWarner Losh break; 684e800e6c5SWarner Losh 6856fe97c6cSWarner Losh case TARGET_FREEBSD_NR_getfh: /* getfh(2) */ 6866fe97c6cSWarner Losh ret = do_freebsd_getfh(arg1, arg2); 6876fe97c6cSWarner Losh break; 6886fe97c6cSWarner Losh 6896fe97c6cSWarner Losh case TARGET_FREEBSD_NR_lgetfh: /* lgetfh(2) */ 6906fe97c6cSWarner Losh ret = do_freebsd_lgetfh(arg1, arg2); 6916fe97c6cSWarner Losh break; 6926fe97c6cSWarner Losh 6936fe97c6cSWarner Losh case TARGET_FREEBSD_NR_fhopen: /* fhopen(2) */ 6946fe97c6cSWarner Losh ret = do_freebsd_fhopen(arg1, arg2); 6956fe97c6cSWarner Losh break; 6966fe97c6cSWarner Losh 6976fe97c6cSWarner Losh case TARGET_FREEBSD_NR_freebsd11_fhstat: /* fhstat(2) */ 6986fe97c6cSWarner Losh ret = do_freebsd11_fhstat(arg1, arg2); 6996fe97c6cSWarner Losh break; 7006fe97c6cSWarner Losh 7016fe97c6cSWarner Losh case TARGET_FREEBSD_NR_fhstat: /* fhstat(2) */ 7026fe97c6cSWarner Losh ret = do_freebsd_fhstat(arg1, arg2); 7036fe97c6cSWarner Losh break; 7046fe97c6cSWarner Losh 7056fe97c6cSWarner Losh case TARGET_FREEBSD_NR_freebsd11_fhstatfs: /* fhstatfs(2) */ 7066fe97c6cSWarner Losh ret = do_freebsd11_fhstatfs(arg1, arg2); 7076fe97c6cSWarner Losh break; 7086fe97c6cSWarner Losh 7096fe97c6cSWarner Losh case TARGET_FREEBSD_NR_fhstatfs: /* fhstatfs(2) */ 7106fe97c6cSWarner Losh ret = do_freebsd_fhstatfs(arg1, arg2); 7116fe97c6cSWarner Losh break; 7126fe97c6cSWarner Losh 713d7e9a545SWarner Losh case TARGET_FREEBSD_NR_freebsd11_statfs: /* statfs(2) */ 714d7e9a545SWarner Losh ret = do_freebsd11_statfs(arg1, arg2); 715d7e9a545SWarner Losh break; 716d7e9a545SWarner Losh 717d7e9a545SWarner Losh case TARGET_FREEBSD_NR_statfs: /* statfs(2) */ 718d7e9a545SWarner Losh ret = do_freebsd_statfs(arg1, arg2); 719d7e9a545SWarner Losh break; 720d7e9a545SWarner Losh 721d7e9a545SWarner Losh case TARGET_FREEBSD_NR_freebsd11_fstatfs: /* fstatfs(2) */ 722d7e9a545SWarner Losh ret = do_freebsd11_fstatfs(arg1, arg2); 723d7e9a545SWarner Losh break; 724d7e9a545SWarner Losh 725d7e9a545SWarner Losh case TARGET_FREEBSD_NR_fstatfs: /* fstatfs(2) */ 726d7e9a545SWarner Losh ret = do_freebsd_fstatfs(arg1, arg2); 727d7e9a545SWarner Losh break; 728d7e9a545SWarner Losh 729d7e9a545SWarner Losh case TARGET_FREEBSD_NR_freebsd11_getfsstat: /* getfsstat(2) */ 730d7e9a545SWarner Losh ret = do_freebsd11_getfsstat(arg1, arg2, arg3); 731d7e9a545SWarner Losh break; 732d7e9a545SWarner Losh 733d7e9a545SWarner Losh case TARGET_FREEBSD_NR_getfsstat: /* getfsstat(2) */ 734d7e9a545SWarner Losh ret = do_freebsd_getfsstat(arg1, arg2, arg3); 735d7e9a545SWarner Losh break; 736d7e9a545SWarner Losh 73797a3c571SWarner Losh case TARGET_FREEBSD_NR_freebsd11_getdents: /* getdents(2) */ 73897a3c571SWarner Losh ret = do_freebsd11_getdents(arg1, arg2, arg3); 73997a3c571SWarner Losh break; 74097a3c571SWarner Losh 74197a3c571SWarner Losh case TARGET_FREEBSD_NR_getdirentries: /* getdirentries(2) */ 74297a3c571SWarner Losh ret = do_freebsd_getdirentries(arg1, arg2, arg3, arg4); 74397a3c571SWarner Losh break; 74497a3c571SWarner Losh 74597a3c571SWarner Losh case TARGET_FREEBSD_NR_freebsd11_getdirentries: /* getdirentries(2) */ 74697a3c571SWarner Losh ret = do_freebsd11_getdirentries(arg1, arg2, arg3, arg4); 74797a3c571SWarner Losh break; 74897a3c571SWarner Losh case TARGET_FREEBSD_NR_fcntl: /* fcntl(2) */ 74997a3c571SWarner Losh ret = do_freebsd_fcntl(arg1, arg2, arg3); 75097a3c571SWarner Losh break; 75197a3c571SWarner Losh 75297a3c571SWarner Losh 753e800e6c5SWarner Losh /* 754fb96f5dfSStacey Son * sys{ctl, arch, call} 755fb96f5dfSStacey Son */ 7567adda6deSKyle Evans case TARGET_FREEBSD_NR___sysctl: /* sysctl(3) */ 7577adda6deSKyle Evans ret = do_freebsd_sysctl(cpu_env, arg1, arg2, arg3, arg4, arg5, arg6); 7587adda6deSKyle Evans break; 7597adda6deSKyle Evans 7606da777e2SKyle Evans case TARGET_FREEBSD_NR___sysctlbyname: /* sysctlbyname(2) */ 7616da777e2SKyle Evans ret = do_freebsd_sysctlbyname(cpu_env, arg1, arg2, arg3, arg4, arg5, arg6); 7626da777e2SKyle Evans break; 7636da777e2SKyle Evans 764fb96f5dfSStacey Son case TARGET_FREEBSD_NR_sysarch: /* sysarch(2) */ 765fb96f5dfSStacey Son ret = do_freebsd_sysarch(cpu_env, arg1, arg2); 766fb96f5dfSStacey Son break; 767fb96f5dfSStacey Son 768db697887SWarner Losh default: 769db697887SWarner Losh qemu_log_mask(LOG_UNIMP, "Unsupported syscall: %d\n", num); 770db697887SWarner Losh ret = -TARGET_ENOSYS; 771db697887SWarner Losh break; 772db697887SWarner Losh } 773db697887SWarner Losh 774db697887SWarner Losh return ret; 775db697887SWarner Losh } 776db697887SWarner Losh 777db697887SWarner Losh /* 778db697887SWarner Losh * do_freebsd_syscall() should always have a single exit point at the end so 779db697887SWarner Losh * that actions, such as logging of syscall results, can be performed. This 780db697887SWarner Losh * as a wrapper around freebsd_syscall() so that actually happens. Since 781db697887SWarner Losh * that is a singleton, modern compilers will inline it anyway... 78266eed099SWarner Losh */ 78366eed099SWarner Losh abi_long do_freebsd_syscall(void *cpu_env, int num, abi_long arg1, 78466eed099SWarner Losh abi_long arg2, abi_long arg3, abi_long arg4, 78566eed099SWarner Losh abi_long arg5, abi_long arg6, abi_long arg7, 78666eed099SWarner Losh abi_long arg8) 78766eed099SWarner Losh { 7884cf41e80SDoug Rabson abi_long ret; 789db697887SWarner Losh 790db697887SWarner Losh if (do_strace) { 791db697887SWarner Losh print_freebsd_syscall(num, arg1, arg2, arg3, arg4, arg5, arg6); 792db697887SWarner Losh } 793db697887SWarner Losh 794db697887SWarner Losh ret = freebsd_syscall(cpu_env, num, arg1, arg2, arg3, arg4, arg5, arg6, 795db697887SWarner Losh arg7, arg8); 796db697887SWarner Losh if (do_strace) { 797db697887SWarner Losh print_freebsd_syscall_ret(num, ret); 798db697887SWarner Losh } 799db697887SWarner Losh 800db697887SWarner Losh return ret; 80166eed099SWarner Losh } 80266eed099SWarner Losh 80366eed099SWarner Losh void syscall_init(void) 80466eed099SWarner Losh { 80566eed099SWarner Losh } 806