diff mbox series

[12/22] bsd-user/freebsd/os-syscall.c: Add get_errno and host_to_target_errno

Message ID 20220201111455.52511-13-imp@bsdimp.com
State New
Headers show
Series bsd-user: Start upstreaming the system calls. | expand

Commit Message

Warner Losh Feb. 1, 2022, 11:14 a.m. UTC
Add the helper functions get_errno and host_to_target_errno. get_errno
returns either the system call results, or the -errno when system call
indicates failure by returning -1. Host_to_target_errno returns errno
(since on FreeBSD they are the same on all architectures) along with a
comment about why it's the identity.

Signed-off-by: Warner Losh <imp@bsdimp.com>
---
 bsd-user/freebsd/os-syscall.c | 23 +++++++++++++++++++++++
 bsd-user/qemu.h               |  3 ++-
 2 files changed, 25 insertions(+), 1 deletion(-)

Comments

Kyle Evans Feb. 1, 2022, 4:35 p.m. UTC | #1
On Tue, Feb 1, 2022 at 5:15 AM Warner Losh <imp@bsdimp.com> wrote:
>
> Add the helper functions get_errno and host_to_target_errno. get_errno
> returns either the system call results, or the -errno when system call
> indicates failure by returning -1. Host_to_target_errno returns errno
> (since on FreeBSD they are the same on all architectures) along with a
> comment about why it's the identity.
>
> Signed-off-by: Warner Losh <imp@bsdimp.com>
> ---
>  bsd-user/freebsd/os-syscall.c | 23 +++++++++++++++++++++++
>  bsd-user/qemu.h               |  3 ++-
>  2 files changed, 25 insertions(+), 1 deletion(-)
>

Reviewed-by: Kyle Evans <kevans@FreeBSD.org>

> diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
> index 7e2bedb918d..2e84cf350b1 100644
> --- a/bsd-user/freebsd/os-syscall.c
> +++ b/bsd-user/freebsd/os-syscall.c
> @@ -44,6 +44,29 @@ void target_set_brk(abi_ulong new_brk)
>  {
>  }
>
> +/*
> + * errno conversion.
> + */
> +abi_long get_errno(abi_long ret)
> +{
> +
> +    if (ret == -1) {
> +        return -host_to_target_errno(errno);
> +    } else {
> +        return ret;
> +    }
> +}
> +
> +int host_to_target_errno(int err)
> +{
> +    /*
> +     * All the BSDs have the property that the error numbers are uniform across
> +     * all architectures for a given BSD, though they may vary between different
> +     * BSDs.
> +     */
> +    return err;
> +}
> +
>  bool is_error(abi_long ret)
>  {
>
> diff --git a/bsd-user/qemu.h b/bsd-user/qemu.h
> index e5742bd6c03..56042ddbc5d 100644
> --- a/bsd-user/qemu.h
> +++ b/bsd-user/qemu.h
> @@ -246,9 +246,10 @@ extern unsigned long target_dflssiz;
>  extern unsigned long target_maxssiz;
>  extern unsigned long target_sgrowsiz;
>
> -/* syscall.c */
> +/* os-syscall.c */
>  abi_long get_errno(abi_long ret);
>  bool is_error(abi_long ret);
> +int host_to_target_errno(int err);
>
>  /* os-sys.c */
>  abi_long do_freebsd_sysarch(void *cpu_env, abi_long arg1, abi_long arg2);
> --
> 2.33.1
>
Richard Henderson Feb. 1, 2022, 5:39 p.m. UTC | #2
On 2/1/22 22:14, Warner Losh wrote:
> +/*
> + * errno conversion.
> + */
> +abi_long get_errno(abi_long ret)
> +{
> +
> +    if (ret == -1) {

Watch the extra blank lines.

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>


r~
Warner Losh Feb. 1, 2022, 11:27 p.m. UTC | #3
On Tue, Feb 1, 2022 at 10:40 AM Richard Henderson <
richard.henderson@linaro.org> wrote:

> On 2/1/22 22:14, Warner Losh wrote:
> > +/*
> > + * errno conversion.
> > + */
> > +abi_long get_errno(abi_long ret)
> > +{
> > +
> > +    if (ret == -1) {
>
> Watch the extra blank lines.
>

Will do.  It's a FreeBSD fetish that has infected this code... :)


> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
>

Thanks!

Warner


>
>
> r~
>
diff mbox series

Patch

diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
index 7e2bedb918d..2e84cf350b1 100644
--- a/bsd-user/freebsd/os-syscall.c
+++ b/bsd-user/freebsd/os-syscall.c
@@ -44,6 +44,29 @@  void target_set_brk(abi_ulong new_brk)
 {
 }
 
+/*
+ * errno conversion.
+ */
+abi_long get_errno(abi_long ret)
+{
+
+    if (ret == -1) {
+        return -host_to_target_errno(errno);
+    } else {
+        return ret;
+    }
+}
+
+int host_to_target_errno(int err)
+{
+    /*
+     * All the BSDs have the property that the error numbers are uniform across
+     * all architectures for a given BSD, though they may vary between different
+     * BSDs.
+     */
+    return err;
+}
+
 bool is_error(abi_long ret)
 {
 
diff --git a/bsd-user/qemu.h b/bsd-user/qemu.h
index e5742bd6c03..56042ddbc5d 100644
--- a/bsd-user/qemu.h
+++ b/bsd-user/qemu.h
@@ -246,9 +246,10 @@  extern unsigned long target_dflssiz;
 extern unsigned long target_maxssiz;
 extern unsigned long target_sgrowsiz;
 
-/* syscall.c */
+/* os-syscall.c */
 abi_long get_errno(abi_long ret);
 bool is_error(abi_long ret);
+int host_to_target_errno(int err);
 
 /* os-sys.c */
 abi_long do_freebsd_sysarch(void *cpu_env, abi_long arg1, abi_long arg2);