xref: /openbmc/qemu/bsd-user/freebsd/os-syscall.c (revision 36999e6a)
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