From: Warner Losh <imp@bsdimp.com>
To: qemu-devel@nongnu.org
Cc: Richard Henderson <richard.henderson@linaro.org>,
Philippe Mathieu-Daude <f4bug@amsat.org>,
Laurent Vivier <laurent@vivier.eu>,
Konrad Witaszczyk <def@freebsd.org>, Warner Losh <imp@bsdimp.com>
Subject: [RFC v3 4/5] common-user: Adjust system call return on FreeBSD
Date: Fri, 12 Nov 2021 21:56:02 -0700 [thread overview]
Message-ID: <20211113045603.60391-5-imp@bsdimp.com> (raw)
In-Reply-To: <20211113045603.60391-1-imp@bsdimp.com>
All the *-users generally use the negative errno return codes to signal
errno for a system call. FreeBSD's system calls, on the other hand,
returns errno, not -errno. Add ifdefs for FreeBSD to make the adjustment
on the 4 hosts that we have support for.
Signed-off-by: Warner Losh <imp@bsdimp.com>
---
common-user/host/aarch64/safe-syscall.inc.S | 8 ++++++++
common-user/host/arm/safe-syscall.inc.S | 7 +++++++
common-user/host/i386/safe-syscall.inc.S | 9 +++++++++
common-user/host/x86_64/safe-syscall.inc.S | 9 +++++++++
4 files changed, 33 insertions(+)
diff --git a/common-user/host/aarch64/safe-syscall.inc.S b/common-user/host/aarch64/safe-syscall.inc.S
index bc1f5a9792..9f9525fe25 100644
--- a/common-user/host/aarch64/safe-syscall.inc.S
+++ b/common-user/host/aarch64/safe-syscall.inc.S
@@ -64,6 +64,14 @@ safe_syscall_start:
svc 0x0
safe_syscall_end:
/* code path for having successfully executed the syscall */
+#ifdef __FreeBSD__
+ /*
+ * FreeBSD kernel returns C bit set with positive errno.
+ * Encode this for use in bsd-user as -errno:
+ * x0 = !c ? x0 : -x0
+ */
+ csneg x0, x0, x0, cc
+#endif
ret
0:
diff --git a/common-user/host/arm/safe-syscall.inc.S b/common-user/host/arm/safe-syscall.inc.S
index 88c4958504..459e5f87c2 100644
--- a/common-user/host/arm/safe-syscall.inc.S
+++ b/common-user/host/arm/safe-syscall.inc.S
@@ -78,6 +78,13 @@ safe_syscall_start:
swi 0
safe_syscall_end:
/* code path for having successfully executed the syscall */
+#ifdef __FreeBSD__
+ /*
+ * FreeBSD kernel returns C bit set with positive errno.
+ * Encode this for use in bsd-user as -errno:
+ */
+ negcs r0, r0
+#endif
pop { r4, r5, r6, r7, r8, pc }
1:
diff --git a/common-user/host/i386/safe-syscall.inc.S b/common-user/host/i386/safe-syscall.inc.S
index 9e58fc6504..ba55a35e92 100644
--- a/common-user/host/i386/safe-syscall.inc.S
+++ b/common-user/host/i386/safe-syscall.inc.S
@@ -75,6 +75,15 @@ safe_syscall_start:
int $0x80
safe_syscall_end:
/* code path for having successfully executed the syscall */
+#ifdef __FreeBSD__
+ /*
+ * FreeBSD kernel returns C bit set with positive errno.
+ * Encode this for use in bsd-user as -errno:
+ */
+ jnb 2f
+ neg %eax
+2:
+#endif
pop %ebx
.cfi_remember_state
.cfi_adjust_cfa_offset -4
diff --git a/common-user/host/x86_64/safe-syscall.inc.S b/common-user/host/x86_64/safe-syscall.inc.S
index f36992daa3..46c527e058 100644
--- a/common-user/host/x86_64/safe-syscall.inc.S
+++ b/common-user/host/x86_64/safe-syscall.inc.S
@@ -72,6 +72,15 @@ safe_syscall_start:
syscall
safe_syscall_end:
/* code path for having successfully executed the syscall */
+#ifdef __FreeBSD__
+ /*
+ * FreeBSD kernel returns C bit set with positive errno.
+ * Encode this for use in bsd-user as -errno:
+ */
+ jnb 2f
+ neg %rax
+2:
+#endif
pop %rbp
.cfi_remember_state
.cfi_def_cfa_offset 8
--
2.33.0
next prev parent reply other threads:[~2021-11-13 4:58 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-11-13 4:55 [RFC v3 0/5] linux-user: simplify safe signal handling Warner Losh
2021-11-13 4:55 ` [RFC v3 1/5] linux-user: Add host_signal_set_pc to set pc in mcontext Warner Losh
2021-11-13 4:56 ` [RFC v3 2/5] linux-user/signal.c: Create a common rewind_if_in_safe_syscall Warner Losh
2021-11-13 4:56 ` [RFC v3 3/5] linux-user/safe-syscall.inc.S: Move to common-user Warner Losh
2021-11-13 4:56 ` Warner Losh [this message]
2021-11-14 9:20 ` [RFC v3 4/5] common-user: Adjust system call return on FreeBSD Richard Henderson
2021-11-13 4:56 ` [RFC v3 5/5] *-user: move safe-syscall.* to common-user Warner Losh
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20211113045603.60391-5-imp@bsdimp.com \
--to=imp@bsdimp.com \
--cc=def@freebsd.org \
--cc=f4bug@amsat.org \
--cc=laurent@vivier.eu \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.