All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Alex Bennée" <alex.bennee@linaro.org>
To: qemu-arm@nongnu.org
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-arm] [PATCH 04/13] target/arm/arm-semi: clean up TaskState* usage in non-user-only code
Date: Thu, 12 Sep 2019 12:42:53 +0100	[thread overview]
Message-ID: <87ftl1zqo2.fsf@linaro.org> (raw)
In-Reply-To: <20190910144428.32597-5-peter.maydell@linaro.org>


Peter Maydell <peter.maydell@linaro.org> writes:

> The semihosting code has to build for both user-only and softmmu;
> for user-only it needs access to the TaskState struct that holds
> per-thread information. For softmmu we don't need it.
>
> Currently the softmmu set_swi_errno() takes a CPUARMState *,
> which it doesn't use, and the 'ts' variable in do_arm_semihosting()
> is set to either be a TaskState* or a CPUARMState* depending on
> whether CONFIG_USER_ONLY is set, so that the callsite always
> passes 'ts'. Since we don't actually need the CPUARMState *,
> we can instead make set_swi_errno() always take a TaskState*,
> by providing a local-to-this-file dummy typedef for the softmmu
> case and setting ts to NULL for softmmu.
>
> This will make it easier to have other functions which pass
> through the TaskState*, because now they can have the same
> prototype regardless of whether they're CONFIG_USER_ONLY or not.
>
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> ---
>  target/arm/arm-semi.c | 48 ++++++++++++++++++++++++-------------------
>  1 file changed, 27 insertions(+), 21 deletions(-)
>
> diff --git a/target/arm/arm-semi.c b/target/arm/arm-semi.c
> index 05491bf5248..ce3ba554bef 100644
> --- a/target/arm/arm-semi.c
> +++ b/target/arm/arm-semi.c
> @@ -36,6 +36,13 @@
>  #else
>  #include "exec/gdbstub.h"
>  #include "qemu/cutils.h"
> +
> +/*
> + * Dummy typedef so that we can have functions that take
> + * a TaskState* even if we're building for softmmu; in that
> + * case the argument will always be NULL.
> + */
> +typedef void TaskState;
>  #endif
>
>  #define TARGET_SYS_OPEN        0x01
> @@ -213,27 +220,24 @@ static GuestFD *get_guestfd(int guestfd)
>      return gf;
>  }
>
> -#ifdef CONFIG_USER_ONLY
> -static inline uint32_t set_swi_errno(TaskState *ts, uint32_t code)
> -{
> -    if (code == (uint32_t)-1)
> -        ts->swi_errno = errno;
> -    return code;
> -}
> -#else
> +#ifndef CONFIG_USER_ONLY
>  static target_ulong syscall_err;
>
> -static inline uint32_t set_swi_errno(CPUARMState *env, uint32_t code)
> -{
> -    if (code == (uint32_t)-1) {
> -        syscall_err = errno;
> -    }
> -    return code;
> -}
> -
>  #include "exec/softmmu-semi.h"
>  #endif
>
> +static inline uint32_t set_swi_errno(TaskState *ts, uint32_t code)
> +{
> +    if (code == (uint32_t)-1) {
> +#ifdef CONFIG_USER_ONLY
> +        ts->swi_errno = errno;
> +#else
> +        syscall_err = errno;
> +#endif
> +    }
> +    return code;
> +}
> +
>  static target_ulong arm_semi_syscall_len;
>
>  static void arm_semi_cb(CPUState *cs, target_ulong ret, target_ulong err)
> @@ -374,13 +378,15 @@ target_ulong do_arm_semihosting(CPUARMState *env)
>      int nr;
>      uint32_t ret;
>      uint32_t len;
> -#ifdef CONFIG_USER_ONLY
> -    TaskState *ts = cs->opaque;
> -#else
> -    CPUARMState *ts = env;
> -#endif
> +    TaskState *ts;
>      GuestFD *gf;
>
> +#ifdef CONFIG_USER_ONLY
> +    ts = cs->opaque;
> +#else
> +    ts = NULL;
> +#endif

Why not pass cs to set_swi_errno and deal with all the differences in
the helper?

> +
>      if (is_a64(env)) {
>          /* Note that the syscall number is in W0, not X0 */
>          nr = env->xregs[0] & 0xffffffffU;


--
Alex Bennée

WARNING: multiple messages have this Message-ID (diff)
From: "Alex Bennée" <alex.bennee@linaro.org>
To: qemu-arm@nongnu.org
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [Qemu-arm] [PATCH 04/13] target/arm/arm-semi: clean up TaskState* usage in non-user-only code
Date: Thu, 12 Sep 2019 12:42:53 +0100	[thread overview]
Message-ID: <87ftl1zqo2.fsf@linaro.org> (raw)
In-Reply-To: <20190910144428.32597-5-peter.maydell@linaro.org>


Peter Maydell <peter.maydell@linaro.org> writes:

> The semihosting code has to build for both user-only and softmmu;
> for user-only it needs access to the TaskState struct that holds
> per-thread information. For softmmu we don't need it.
>
> Currently the softmmu set_swi_errno() takes a CPUARMState *,
> which it doesn't use, and the 'ts' variable in do_arm_semihosting()
> is set to either be a TaskState* or a CPUARMState* depending on
> whether CONFIG_USER_ONLY is set, so that the callsite always
> passes 'ts'. Since we don't actually need the CPUARMState *,
> we can instead make set_swi_errno() always take a TaskState*,
> by providing a local-to-this-file dummy typedef for the softmmu
> case and setting ts to NULL for softmmu.
>
> This will make it easier to have other functions which pass
> through the TaskState*, because now they can have the same
> prototype regardless of whether they're CONFIG_USER_ONLY or not.
>
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> ---
>  target/arm/arm-semi.c | 48 ++++++++++++++++++++++++-------------------
>  1 file changed, 27 insertions(+), 21 deletions(-)
>
> diff --git a/target/arm/arm-semi.c b/target/arm/arm-semi.c
> index 05491bf5248..ce3ba554bef 100644
> --- a/target/arm/arm-semi.c
> +++ b/target/arm/arm-semi.c
> @@ -36,6 +36,13 @@
>  #else
>  #include "exec/gdbstub.h"
>  #include "qemu/cutils.h"
> +
> +/*
> + * Dummy typedef so that we can have functions that take
> + * a TaskState* even if we're building for softmmu; in that
> + * case the argument will always be NULL.
> + */
> +typedef void TaskState;
>  #endif
>
>  #define TARGET_SYS_OPEN        0x01
> @@ -213,27 +220,24 @@ static GuestFD *get_guestfd(int guestfd)
>      return gf;
>  }
>
> -#ifdef CONFIG_USER_ONLY
> -static inline uint32_t set_swi_errno(TaskState *ts, uint32_t code)
> -{
> -    if (code == (uint32_t)-1)
> -        ts->swi_errno = errno;
> -    return code;
> -}
> -#else
> +#ifndef CONFIG_USER_ONLY
>  static target_ulong syscall_err;
>
> -static inline uint32_t set_swi_errno(CPUARMState *env, uint32_t code)
> -{
> -    if (code == (uint32_t)-1) {
> -        syscall_err = errno;
> -    }
> -    return code;
> -}
> -
>  #include "exec/softmmu-semi.h"
>  #endif
>
> +static inline uint32_t set_swi_errno(TaskState *ts, uint32_t code)
> +{
> +    if (code == (uint32_t)-1) {
> +#ifdef CONFIG_USER_ONLY
> +        ts->swi_errno = errno;
> +#else
> +        syscall_err = errno;
> +#endif
> +    }
> +    return code;
> +}
> +
>  static target_ulong arm_semi_syscall_len;
>
>  static void arm_semi_cb(CPUState *cs, target_ulong ret, target_ulong err)
> @@ -374,13 +378,15 @@ target_ulong do_arm_semihosting(CPUARMState *env)
>      int nr;
>      uint32_t ret;
>      uint32_t len;
> -#ifdef CONFIG_USER_ONLY
> -    TaskState *ts = cs->opaque;
> -#else
> -    CPUARMState *ts = env;
> -#endif
> +    TaskState *ts;
>      GuestFD *gf;
>
> +#ifdef CONFIG_USER_ONLY
> +    ts = cs->opaque;
> +#else
> +    ts = NULL;
> +#endif

Why not pass cs to set_swi_errno and deal with all the differences in
the helper?

> +
>      if (is_a64(env)) {
>          /* Note that the syscall number is in W0, not X0 */
>          nr = env->xregs[0] & 0xffffffffU;


--
Alex Bennée


  reply	other threads:[~2019-09-12 11:42 UTC|newest]

Thread overview: 59+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-09-10 14:44 [Qemu-arm] [PATCH 00/13] target/arm: Implement semihosting v2.0 Peter Maydell
2019-09-10 14:44 ` [Qemu-devel] " Peter Maydell
2019-09-10 14:44 ` [Qemu-arm] [PATCH 01/13] target/arm/arm-semi: Capture errno in softmmu version of set_swi_errno() Peter Maydell
2019-09-10 14:44   ` [Qemu-devel] " Peter Maydell
2019-09-12 10:39   ` [Qemu-arm] " Alex Bennée
2019-09-12 10:39     ` [Qemu-devel] " Alex Bennée
2019-09-12 10:49     ` Peter Maydell
2019-09-12 10:49       ` [Qemu-devel] " Peter Maydell
2019-09-10 14:44 ` [Qemu-arm] [PATCH 02/13] target/arm/arm-semi: Always set some kind of errno for failed calls Peter Maydell
2019-09-10 14:44   ` [Qemu-devel] " Peter Maydell
2019-09-12 10:42   ` [Qemu-arm] " Alex Bennée
2019-09-12 10:42     ` [Qemu-devel] " Alex Bennée
2019-09-12 10:50     ` Peter Maydell
2019-09-12 10:50       ` [Qemu-devel] " Peter Maydell
2019-09-12 11:09       ` Alex Bennée
2019-09-12 11:09         ` [Qemu-devel] " Alex Bennée
2019-09-10 14:44 ` [Qemu-arm] [PATCH 03/13] target/arm/arm-semi: Make semihosting code hand out its own file descriptors Peter Maydell
2019-09-10 14:44   ` [Qemu-devel] " Peter Maydell
2019-09-12 11:02   ` [Qemu-arm] " Alex Bennée
2019-09-12 11:02     ` [Qemu-devel] " Alex Bennée
2019-09-10 14:44 ` [Qemu-arm] [PATCH 04/13] target/arm/arm-semi: clean up TaskState* usage in non-user-only code Peter Maydell
2019-09-10 14:44   ` [Qemu-devel] " Peter Maydell
2019-09-12 11:42   ` Alex Bennée [this message]
2019-09-12 11:42     ` [Qemu-devel] [Qemu-arm] " Alex Bennée
2019-09-12 11:49     ` Peter Maydell
2019-09-10 14:44 ` [Qemu-arm] [PATCH 05/13] target/arm/arm-semi: Factor out implementation of SYS_CLOSE Peter Maydell
2019-09-10 14:44   ` [Qemu-devel] " Peter Maydell
2019-09-12 11:13   ` [Qemu-arm] " Alex Bennée
2019-09-12 11:13     ` [Qemu-devel] " Alex Bennée
2019-09-10 14:44 ` [Qemu-devel] [PATCH 06/13] target/arm/arm-semi: Factor out implementation of SYS_WRITE Peter Maydell
2019-09-12 11:18   ` Alex Bennée
2019-09-10 14:44 ` [Qemu-arm] [PATCH 07/13] target/arm/arm-semi: Factor out implementation of SYS_READ Peter Maydell
2019-09-10 14:44   ` [Qemu-devel] " Peter Maydell
2019-09-12 11:19   ` [Qemu-arm] " Alex Bennée
2019-09-12 11:19     ` [Qemu-devel] " Alex Bennée
2019-09-10 14:44 ` [Qemu-arm] [PATCH 08/13] target/arm/arm-semi: Factor out implementation of SYS_ISTTY Peter Maydell
2019-09-10 14:44   ` [Qemu-devel] " Peter Maydell
2019-09-12 11:20   ` [Qemu-arm] " Alex Bennée
2019-09-12 11:20     ` [Qemu-devel] " Alex Bennée
2019-09-10 14:44 ` [Qemu-devel] [PATCH 09/13] target/arm/arm-semi: Factor out implementation of SYS_SEEK Peter Maydell
2019-09-12 11:43   ` Alex Bennée
2019-09-10 14:44 ` [Qemu-arm] [PATCH 10/13] target/arm/arm-semi: Factor out implementation of SYS_FLEN Peter Maydell
2019-09-10 14:44   ` [Qemu-devel] " Peter Maydell
2019-09-12 11:43   ` [Qemu-arm] " Alex Bennée
2019-09-12 11:43     ` [Qemu-devel] " Alex Bennée
2019-09-10 14:44 ` [Qemu-arm] [PATCH 11/13] target/arm/arm-semi: Implement support for semihosting feature detection Peter Maydell
2019-09-10 14:44   ` [Qemu-devel] " Peter Maydell
2019-09-10 17:00   ` [Qemu-arm] " Peter Maydell
2019-09-10 17:00     ` [Qemu-devel] " Peter Maydell
2019-09-12 11:56   ` [Qemu-arm] " Alex Bennée
2019-09-12 11:56     ` [Qemu-devel] " Alex Bennée
2019-09-10 14:44 ` [Qemu-devel] [PATCH 12/13] target/arm/arm-semi: Implement SH_EXT_STDOUT_STDERR extension Peter Maydell
2019-09-12 12:05   ` Alex Bennée
2019-09-12 12:09     ` [Qemu-arm] " Peter Maydell
2019-09-12 12:09       ` [Qemu-devel] [Qemu-arm] " Peter Maydell
2019-09-10 14:44 ` [Qemu-arm] [PATCH 13/13] target/arm/arm-semi: Implement SH_EXT_EXIT_EXTENDED extension Peter Maydell
2019-09-10 14:44   ` [Qemu-devel] " Peter Maydell
2019-09-12 12:07   ` [Qemu-arm] " Alex Bennée
2019-09-12 12:07     ` [Qemu-devel] " Alex Bennée

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87ftl1zqo2.fsf@linaro.org \
    --to=alex.bennee@linaro.org \
    --cc=qemu-arm@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.