All of lore.kernel.org
 help / color / mirror / Atom feed
From: Richard Henderson <richard.henderson@linaro.org>
To: qemu-devel@nongnu.org
Cc: peter.maydell@linaro.org, qemu-arm@nongnu.org
Subject: [PATCH v4 20/23] linux-user/aarch64: Signal SEGV_MTEAERR for async tag check error
Date: Thu, 28 Jan 2021 12:41:38 -1000	[thread overview]
Message-ID: <20210128224141.638790-21-richard.henderson@linaro.org> (raw)
In-Reply-To: <20210128224141.638790-1-richard.henderson@linaro.org>

The real kernel collects _TIF_MTE_ASYNC_FAULT into the current thread's
state on any kernel entry (interrupt, exception etc), and then delivers
the signal in advance of resuming the thread.

This means that while the signal won't be delivered immediately, it will
not be delayed forever -- at minimum it will be delivered after the next
clock interrupt.

We don't have a clock interrupt in linux-user, so we issue a cpu_kick
to signal a return to the main loop at the end of the current TB.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 linux-user/aarch64/target_signal.h |  1 +
 linux-user/aarch64/cpu_loop.c      | 11 +++++++++++
 target/arm/mte_helper.c            | 10 ++++++++++
 3 files changed, 22 insertions(+)

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 b6a2e65593..7c42f65706 100644
--- a/linux-user/aarch64/cpu_loop.c
+++ b/linux-user/aarch64/cpu_loop.c
@@ -164,6 +164,17 @@ void cpu_loop(CPUARMState *env)
             EXCP_DUMP(env, "qemu: unhandled CPU exception 0x%x - aborting\n", trapnr);
             abort();
         }
+
+        /* Check for MTE asynchronous faults */
+        if (unlikely(env->cp15.tfsr_el[0])) {
+            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);
+        }
+
         process_pending_signals(env);
         /* Exception return on AArch64 always clears the exclusive monitor,
          * so any return to running guest code implies this.
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;
 
     default:
-- 
2.25.1



  parent reply	other threads:[~2021-01-28 23:07 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-01-28 22:41 [PATCH v4 00/23] target-arm: Implement ARMv8.5-MemTag, user mode Richard Henderson
2021-01-28 22:41 ` [PATCH v4 01/23] tcg: Introduce target-specific page data for user-only Richard Henderson
2021-02-02 14:29   ` Peter Maydell
2021-02-03  2:40     ` Richard Henderson
2021-02-03  5:49       ` Richard Henderson
2021-02-03 15:33         ` Alex Bennée
2021-01-28 22:41 ` [PATCH v4 02/23] linux-user: Introduce PAGE_ANON Richard Henderson
2021-01-28 22:41 ` [PATCH v4 03/23] exec: Use uintptr_t for guest_base Richard Henderson
2021-02-02 14:31   ` Peter Maydell
2021-01-28 22:41 ` [PATCH v4 04/23] exec: Use uintptr_t in cpu_ldst.h Richard Henderson
2021-02-02 14:32   ` Peter Maydell
2021-02-02 15:30   ` Philippe Mathieu-Daudé
2021-01-28 22:41 ` [PATCH v4 05/23] exec: Improve types for guest_addr_valid Richard Henderson
2021-02-02 14:33   ` Peter Maydell
2021-02-02 15:31   ` Philippe Mathieu-Daudé
2021-01-28 22:41 ` [PATCH v4 06/23] linux-user: Check for overflow in access_ok Richard Henderson
2021-01-28 22:41 ` [PATCH v4 07/23] linux-user: Tidy VERIFY_READ/VERIFY_WRITE Richard Henderson
2021-01-28 22:41 ` [PATCH v4 08/23] bsd-user: " Richard Henderson
2021-01-28 22:41 ` [PATCH v4 09/23] linux-user: Do not use guest_addr_valid for h2g_valid Richard Henderson
2021-02-02 14:34   ` Peter Maydell
2021-01-28 22:41 ` [PATCH v4 10/23] linux-user: Fix guest_addr_valid vs reserved_va Richard Henderson
2021-02-02 14:35   ` Peter Maydell
2021-01-28 22:41 ` [PATCH v4 11/23] exec: Add support for TARGET_TAGGED_ADDRESSES Richard Henderson
2021-02-02 15:05   ` Peter Maydell
2021-01-28 22:41 ` [PATCH v4 12/23] linux-user/aarch64: Implement PR_TAGGED_ADDR_ENABLE Richard Henderson
2021-02-02 14:37   ` Peter Maydell
2021-01-28 22:41 ` [PATCH v4 13/23] target/arm: Improve gen_top_byte_ignore Richard Henderson
2021-02-02 14:40   ` Peter Maydell
2021-01-28 22:41 ` [PATCH v4 14/23] target/arm: Use the proper TBI settings for linux-user Richard Henderson
2021-02-02 14:41   ` Peter Maydell
2021-01-28 22:41 ` [PATCH v4 15/23] linux-user/aarch64: Implement PR_MTE_TCF and PR_MTE_TAG Richard Henderson
2021-02-02 14:43   ` Peter Maydell
2021-01-28 22:41 ` [PATCH v4 16/23] linux-user/aarch64: Implement PROT_MTE Richard Henderson
2021-01-28 22:41 ` [PATCH v4 17/23] target/arm: Split out syndrome.h from internals.h Richard Henderson
2021-02-02 14:44   ` Peter Maydell
2021-01-28 22:41 ` [PATCH v4 18/23] linux-user/aarch64: Pass syndrome to EXC_*_ABORT Richard Henderson
2021-02-02 14:44   ` Peter Maydell
2021-01-28 22:41 ` [PATCH v4 19/23] linux-user/aarch64: Signal SEGV_MTESERR for sync tag check fault Richard Henderson
2021-02-02 14:45   ` Peter Maydell
2021-01-28 22:41 ` Richard Henderson [this message]
2021-02-02 14:46   ` [PATCH v4 20/23] linux-user/aarch64: Signal SEGV_MTEAERR for async tag check error Peter Maydell
2021-01-28 22:41 ` [PATCH v4 21/23] target/arm: Add allocation tag storage for user mode Richard Henderson
2021-02-02 14:46   ` Peter Maydell
2021-01-28 22:41 ` [PATCH v4 22/23] target/arm: Enable MTE for user-only Richard Henderson
2021-02-02 14:47   ` Peter Maydell
2021-01-28 22:41 ` [PATCH v4 23/23] tests/tcg/aarch64: Add mte smoke tests Richard Henderson
2021-02-02 14:49   ` Peter Maydell
2021-01-28 23:15 ` [PATCH v4 00/23] 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=20210128224141.638790-21-richard.henderson@linaro.org \
    --to=richard.henderson@linaro.org \
    --cc=peter.maydell@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.