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