aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWarner Losh <imp@bsdimp.com>2022-01-31 13:19:44 -0700
committerWarner Losh <imp@bsdimp.com>2022-02-26 10:01:38 -0700
commitdeeff83b47683a078c7f2ff057f4388258246f55 (patch)
tree3fbc4a36dda33ab981a103b2a1d5faa86f97a2ef
parent304f944e51045176e8c55a8c8cb054ca5b2c8a23 (diff)
downloadqemu-deeff83b47683a078c7f2ff057f4388258246f55.zip
qemu-deeff83b47683a078c7f2ff057f4388258246f55.tar.gz
qemu-deeff83b47683a078c7f2ff057f4388258246f55.tar.bz2
bsd-user/freebsd/os-syscall.c: Add get_errno and host_to_target_errno
Add the helper functions get_errno and host_to_target_errno. get_errno returns either the system call results, or the -errno when system call indicates failure by returning -1. Host_to_target_errno returns errno (since on FreeBSD they are the same on all architectures) along with a comment about why it's the identity. Signed-off-by: Warner Losh <imp@bsdimp.com> Reviewed-by: Kyle Evans <kevans@FreeBSD.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
-rw-r--r--bsd-user/freebsd/os-syscall.c23
-rw-r--r--bsd-user/qemu.h3
2 files changed, 24 insertions, 2 deletions
diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
index fc57e32..597a41c 100644
--- a/bsd-user/freebsd/os-syscall.c
+++ b/bsd-user/freebsd/os-syscall.c
@@ -45,9 +45,30 @@ void target_set_brk(abi_ulong new_brk)
{
}
-bool is_error(abi_long ret)
+/*
+ * errno conversion.
+ */
+abi_long get_errno(abi_long ret)
{
+ if (ret == -1) {
+ return -host_to_target_errno(errno);
+ } else {
+ return ret;
+ }
+}
+int host_to_target_errno(int err)
+{
+ /*
+ * All the BSDs have the property that the error numbers are uniform across
+ * all architectures for a given BSD, though they may vary between different
+ * BSDs.
+ */
+ return err;
+}
+
+bool is_error(abi_long ret)
+{
return (abi_ulong)ret >= (abi_ulong)(-4096);
}
diff --git a/bsd-user/qemu.h b/bsd-user/qemu.h
index e5742bd..56042dd 100644
--- a/bsd-user/qemu.h
+++ b/bsd-user/qemu.h
@@ -246,9 +246,10 @@ extern unsigned long target_dflssiz;
extern unsigned long target_maxssiz;
extern unsigned long target_sgrowsiz;
-/* syscall.c */
+/* os-syscall.c */
abi_long get_errno(abi_long ret);
bool is_error(abi_long ret);
+int host_to_target_errno(int err);
/* os-sys.c */
abi_long do_freebsd_sysarch(void *cpu_env, abi_long arg1, abi_long arg2);