On 11/10/21 5:31 PM, Warner Losh wrote:
All the *-users generally use the Linux style of negative return codes
for errno. FreeBSD 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 <i...@bsdimp.com>
---
common-user/host/aarch64/safe-syscall.inc.S | 5 +++++
common-user/host/arm/safe-syscall.inc.S | 5 +++++
common-user/host/i386/safe-syscall.inc.S | 5 +++++
common-user/host/x86_64/safe-syscall.inc.S | 5 +++++
4 files changed, 20 insertions(+)
diff --git a/common-user/host/aarch64/safe-syscall.inc.S
b/common-user/host/aarch64/safe-syscall.inc.S
index bc1f5a9792..6584950ccf 100644
--- a/common-user/host/aarch64/safe-syscall.inc.S
+++ b/common-user/host/aarch64/safe-syscall.inc.S
@@ -64,6 +64,11 @@ safe_syscall_start:
svc 0x0
safe_syscall_end:
/* code path for having successfully executed the syscall */
+#ifdef __FreeBSD__
+ b.cc 2f /* Convert to Linux -ERRNO convention */
+ neg x0, x0
+2:
+#endif
I think it should be a little odd to mention Linux.
How about
/*
* 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
+++ b/common-user/host/arm/safe-syscall.inc.S
@@ -78,6 +78,11 @@ safe_syscall_start:
swi 0
safe_syscall_end:
/* code path for having successfully executed the syscall */
+#ifdef __FreeBSD__
+ bcc 2f
+ neg r0, r0
negcs r0, r0
I just can't help myself. :-)
r~