All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Maydell <peter.maydell@linaro.org>
To: Richard Henderson <richard.henderson@linaro.org>
Cc: qemu-arm <qemu-arm@nongnu.org>, QEMU Developers <qemu-devel@nongnu.org>
Subject: Re: [PATCH v3 18/21] linux-user/aarch64: Signal SEGV_MTEAERR for async tag check error
Date: Fri, 22 Jan 2021 13:59:33 +0000	[thread overview]
Message-ID: <CAFEAcA8rXQ76AVpqHwum_XGh13u+vwkZw_yOxRKvfyqbV3_GBQ@mail.gmail.com> (raw)
In-Reply-To: <20210115224645.1196742-19-richard.henderson@linaro.org>

On Fri, 15 Jan 2021 at 22:47, Richard Henderson
<richard.henderson@linaro.org> wrote:
>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>

So when does the real kernel report async MTE exceptions to userspace?
The commit message would be a good place to briefly describe the
kernel's strategy and where QEMU differs from it (if anywhere)...

> ---
>  linux-user/aarch64/target_signal.h |  1 +
>  linux-user/aarch64/cpu_loop.c      | 34 +++++++++++++++++++++---------
>  target/arm/mte_helper.c            | 10 +++++++++
>  3 files changed, 35 insertions(+), 10 deletions(-)
>
> diff --git a/linux-user/aarch64/target_signal.h b/linux-user/aarch64/target_signal.h
> index 777fb667fe..18013e1b23 100644
> --- a/linux-user/aarch64/target_signal.h
> +++ b/linux-user/aarch64/target_signal.h
> @@ -21,6 +21,7 @@ typedef struct target_sigaltstack {
>
>  #include "../generic/signal.h"
>
> +#define TARGET_SEGV_MTEAERR  8  /* Asynchronous ARM MTE error */
>  #define TARGET_SEGV_MTESERR  9  /* Synchronous ARM MTE exception */
>
>  #define TARGET_ARCH_HAS_SETUP_FRAME
> diff --git a/linux-user/aarch64/cpu_loop.c b/linux-user/aarch64/cpu_loop.c
> index 6867f0db2b..6160a401bd 100644
> --- a/linux-user/aarch64/cpu_loop.c
> +++ b/linux-user/aarch64/cpu_loop.c
> @@ -72,6 +72,21 @@
>          put_user_u16(__x, (gaddr));                     \
>      })
>
> +static bool check_mte_async_fault(CPUARMState *env, target_siginfo_t *info)
> +{
> +    if (likely(env->cp15.tfsr_el[0] == 0)) {
> +        return false;
> +    }
> +
> +    env->cp15.tfsr_el[0] = 0;
> +    info->si_signo = TARGET_SIGSEGV;
> +    info->si_errno = 0;
> +    info->_sifields._sigfault._addr = 0;
> +    info->si_code = TARGET_SEGV_MTEAERR;
> +    queue_signal(env, info->si_signo, QEMU_SI_FAULT, info);
> +    return true;
> +}
> +
>  /* AArch64 main loop */
>  void cpu_loop(CPUARMState *env)
>  {
> @@ -88,15 +103,13 @@ void cpu_loop(CPUARMState *env)
>
>          switch (trapnr) {
>          case EXCP_SWI:
> -            ret = do_syscall(env,
> -                             env->xregs[8],
> -                             env->xregs[0],
> -                             env->xregs[1],
> -                             env->xregs[2],
> -                             env->xregs[3],
> -                             env->xregs[4],
> -                             env->xregs[5],
> -                             0, 0);
> +            if (check_mte_async_fault(env, &info)) {
> +                ret = -TARGET_ERESTARTSYS;
> +            } else {
> +                ret = do_syscall(env, env->xregs[8], env->xregs[0],
> +                                 env->xregs[1], env->xregs[2], env->xregs[3],
> +                                 env->xregs[4], env->xregs[5], 0, 0);
> +            }
>              if (ret == -TARGET_ERESTARTSYS) {
>                  env->pc -= 4;
>              } else if (ret != -TARGET_QEMU_ESIGRETURN) {
> @@ -104,7 +117,8 @@ void cpu_loop(CPUARMState *env)
>              }
>              break;
>          case EXCP_INTERRUPT:
> -            /* just indicate that signals should be handled asap */
> +            /* Just indicate that signals should be handled asap. */
> +            check_mte_async_fault(env, &info);
>              break;
>          case EXCP_UDEF:
>              info.si_signo = TARGET_SIGILL;

So this doesn't guarantee to check the async-fault status on
every exit from cpu_exec(), which means we might miss things.
For instance I think this slightly contrived example would not
ever take the SEGV:
    STR x0, [x1]   # with a bad tag
    YIELD
l:  B l

because the STR and YIELD go into the same TB, the YIELD causes us
to leave the TB with EXCP_YIELD, we don't check for an async fault
in that code path, and then we'll go into the infinite loop and
have nothing to prompt us to come out and look at the async fault flags.

Does it work if we just always queue the SEGV on exit from cpu_exec()
and let the signal handling machinery prioritize if we also pend
some other signal because this was an EXCP_UDEF or whatever?
It would be neater if we could keep the fault-check outside the
switch (trapnr) somehow.

> diff --git a/target/arm/mte_helper.c b/target/arm/mte_helper.c
> index 153bd1e9df..d55f8d1e1e 100644
> --- a/target/arm/mte_helper.c
> +++ b/target/arm/mte_helper.c
> @@ -565,6 +565,16 @@ static void mte_check_fail(CPUARMState *env, uint32_t desc,
>              select = 0;
>          }
>          env->cp15.tfsr_el[el] |= 1 << select;
> +#ifdef CONFIG_USER_ONLY
> +        /*
> +         * Stand in for a timer irq, setting _TIF_MTE_ASYNC_FAULT,
> +         * which then sends a SIGSEGV when the thread is next scheduled.
> +         * This cpu will return to the main loop at the end of the TB,
> +         * which is rather sooner than "normal".  But the alternative
> +         * is waiting until the next syscall.
> +         */
> +        qemu_cpu_kick(env_cpu(env));
> +#endif
>          break;

This does the right thing, but qemu_cpu_kick() is one of those
functions that's in a category of "not used much at all in the
codebase" and which always make me wonder if there's a reason.
(In particular there's exactly one use in the whole of target/
right now.) I suppose the case of "helper function wants to cause
us to leave the TB loop but not to abort the current insn" is
an unusual one...

thanks
-- PMM


  reply	other threads:[~2021-01-22 14:01 UTC|newest]

Thread overview: 46+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-01-15 22:46 [PATCH v3 00/21] target-arm: Implement ARMv8.5-MemTag, user mode Richard Henderson
2021-01-15 22:46 ` [PATCH v3 01/21] tcg: Introduce target-specific page data for user-only Richard Henderson
2021-01-19 16:53   ` Peter Maydell
2021-01-15 22:46 ` [PATCH v3 02/21] linux-user: Introduce PAGE_ANON Richard Henderson
2021-01-15 22:46 ` [PATCH v3 03/21] exec: Use uintptr_t for guest_base Richard Henderson
2021-01-19 16:56   ` Peter Maydell
2021-01-15 22:46 ` [PATCH v3 04/21] exec: Use uintptr_t in cpu_ldst.h Richard Henderson
2021-01-19 16:56   ` Peter Maydell
2021-01-15 22:46 ` [PATCH v3 05/21] exec: Improve types for guest_addr_valid Richard Henderson
2021-01-19 16:57   ` Peter Maydell
2021-01-15 22:46 ` [PATCH v3 06/21] linux-user: Check for overflow in access_ok Richard Henderson
2021-01-15 22:46 ` [PATCH v3 07/21] linux-user: Tidy VERIFY_READ/VERIFY_WRITE Richard Henderson
2021-01-15 22:46 ` [PATCH v3 08/21] bsd-user: " Richard Henderson
2021-01-16 16:28   ` Warner Losh
2021-01-15 22:46 ` [PATCH v3 09/21] linux-user: Do not use guest_addr_valid for h2g_valid Richard Henderson
2021-01-19 16:59   ` Peter Maydell
2021-01-15 22:46 ` [PATCH v3 10/21] linux-user: Fix guest_addr_valid vs reserved_va Richard Henderson
2021-01-19 17:03   ` Peter Maydell
2021-01-19 17:41     ` Richard Henderson
2021-01-15 22:46 ` [PATCH v3 11/21] exec: Add support for TARGET_TAGGED_ADDRESSES Richard Henderson
2021-01-22 14:13   ` Peter Maydell
2021-01-26 17:10     ` Richard Henderson
2021-01-15 22:46 ` [PATCH v3 12/21] linux-user/aarch64: Implement PR_TAGGED_ADDR_ENABLE Richard Henderson
2021-01-22 11:36   ` Peter Maydell
2021-01-22 11:53   ` Peter Maydell
2021-01-22 12:02     ` Peter Maydell
2021-01-15 22:46 ` [PATCH v3 13/21] linux-user/aarch64: Implement PR_MTE_TCF and PR_MTE_TAG Richard Henderson
2021-01-22 11:48   ` Peter Maydell
2021-01-15 22:46 ` [PATCH v3 14/21] linux-user/aarch64: Implement PROT_MTE Richard Henderson
2021-01-15 22:46 ` [PATCH v3 15/21] target/arm: Split out syndrome.h from internals.h Richard Henderson
2021-01-19 17:07   ` Peter Maydell
2021-01-15 22:46 ` [PATCH v3 16/21] linux-user/aarch64: Pass syndrome to EXC_*_ABORT Richard Henderson
2021-01-19 17:12   ` Peter Maydell
2021-01-15 22:46 ` [PATCH v3 17/21] linux-user/aarch64: Signal SEGV_MTESERR for sync tag check fault Richard Henderson
2021-01-22 12:03   ` Peter Maydell
2021-01-15 22:46 ` [PATCH v3 18/21] linux-user/aarch64: Signal SEGV_MTEAERR for async tag check error Richard Henderson
2021-01-22 13:59   ` Peter Maydell [this message]
2021-01-28  8:49     ` Richard Henderson
2021-01-28 10:44       ` Peter Maydell
2021-01-15 22:46 ` [PATCH v3 19/21] target/arm: Add allocation tag storage for user mode Richard Henderson
2021-01-22 14:05   ` Peter Maydell
2021-01-15 22:46 ` [PATCH v3 20/21] target/arm: Enable MTE for user-only Richard Henderson
2021-01-22 14:02   ` Peter Maydell
2021-01-15 22:46 ` [PATCH v3 21/21] tests/tcg/aarch64: Add mte smoke tests Richard Henderson
2021-01-22 14:04   ` Peter Maydell
2021-01-15 23:15 ` [PATCH v3 00/21] target-arm: Implement ARMv8.5-MemTag, user mode no-reply

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=CAFEAcA8rXQ76AVpqHwum_XGh13u+vwkZw_yOxRKvfyqbV3_GBQ@mail.gmail.com \
    --to=peter.maydell@linaro.org \
    --cc=qemu-arm@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=richard.henderson@linaro.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.