qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [RFC v2 4/6] common-user: Adjust system call return on FreeBSD


From: Warner Losh
Subject: Re: [RFC v2 4/6] common-user: Adjust system call return on FreeBSD
Date: Wed, 10 Nov 2021 15:53:54 -0700



On Wed, Nov 10, 2021 at 9:59 AM Richard Henderson <richard.henderson@linaro.org> wrote:
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 <imp@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.

Yea, from my view of hacking on Unix and Unix-derived systems for the
last 30 years, Linux is the outlier in returning -errno. However, the 'norms'
have shifted, I guess, so I'm happy with your suggestion...
 
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

Ah, better assembler. Good!
 

> +++ 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.  :-)

I can relate... Really :)

I'll rework and resend in the next round.

Warner

reply via email to

[Prev in Thread] Current Thread [Next in Thread]