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~

Reply via email to