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