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 v3 12/21] linux-user/aarch64: Implement PR_TAGGED_ADDR_ENABLE
Date: Fri, 15 Jan 2021 12:46:36 -1000	[thread overview]
Message-ID: <20210115224645.1196742-13-richard.henderson@linaro.org> (raw)
In-Reply-To: <20210115224645.1196742-1-richard.henderson@linaro.org>

This is the prctl bit that controls whether syscalls accept tagged
addresses.  See Documentation/arm64/tagged-address-abi.rst in the
linux kernel.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 linux-user/aarch64/target_syscall.h |  4 ++++
 target/arm/cpu-param.h              |  3 +++
 target/arm/cpu.h                    | 23 +++++++++++++++++++++++
 linux-user/syscall.c                | 25 +++++++++++++++++++++++++
 target/arm/cpu.c                    |  3 +++
 5 files changed, 58 insertions(+)

diff --git a/linux-user/aarch64/target_syscall.h b/linux-user/aarch64/target_syscall.h
index 3194e6b009..820601dfcc 100644
--- a/linux-user/aarch64/target_syscall.h
+++ b/linux-user/aarch64/target_syscall.h
@@ -30,4 +30,8 @@ struct target_pt_regs {
 # define TARGET_PR_PAC_APDBKEY   (1 << 3)
 # define TARGET_PR_PAC_APGAKEY   (1 << 4)
 
+#define TARGET_PR_SET_TAGGED_ADDR_CTRL 55
+#define TARGET_PR_GET_TAGGED_ADDR_CTRL 56
+# define TARGET_PR_TAGGED_ADDR_ENABLE  (1UL << 0)
+
 #endif /* AARCH64_TARGET_SYSCALL_H */
diff --git a/target/arm/cpu-param.h b/target/arm/cpu-param.h
index 6321385b46..f922aa0650 100644
--- a/target/arm/cpu-param.h
+++ b/target/arm/cpu-param.h
@@ -20,6 +20,9 @@
 
 #ifdef CONFIG_USER_ONLY
 #define TARGET_PAGE_BITS 12
+# ifdef TARGET_AARCH64
+#  define TARGET_TAGGED_ADDRESSES
+# endif
 #else
 /*
  * ARMv7 and later CPUs have 4K pages minimum, but ARMv5 and v6
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
index f3bca73d98..6ddfd9ebe6 100644
--- a/target/arm/cpu.h
+++ b/target/arm/cpu.h
@@ -712,6 +712,10 @@ typedef struct CPUARMState {
     const struct arm_boot_info *boot_info;
     /* Store GICv3CPUState to access from this struct */
     void *gicv3state;
+
+#ifdef TARGET_TAGGED_ADDRESSES
+    target_ulong untagged_addr_mask;
+#endif
 } CPUARMState;
 
 static inline void set_feature(CPUARMState *env, int feature)
@@ -3556,6 +3560,25 @@ static inline MemTxAttrs *typecheck_memtxattrs(MemTxAttrs *x)
  */
 #define PAGE_BTI  PAGE_TARGET_1
 
+#ifdef TARGET_TAGGED_ADDRESSES
+/**
+ * cpu_untagged_addr:
+ * @cs: CPU context
+ * @x: tagged address
+ *
+ * Remove any address tag from @x.  This is explicitly related to the
+ * linux syscall TIF_TAGGED_ADDR setting, not TBI in general.
+ *
+ * There should be a better place to put this, but we need this in
+ * include/exec/cpu_ldst.h, and not some place linux-user specific.
+ */
+static inline target_ulong cpu_untagged_addr(CPUState *cs, target_ulong x)
+{
+    ARMCPU *cpu = ARM_CPU(cs);
+    return x & cpu->env.untagged_addr_mask;
+}
+#endif
+
 /*
  * Naming convention for isar_feature functions:
  * Functions which test 32-bit ID registers should have _aa32_ in
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index bec2ab7769..ebb4e2898c 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -10948,6 +10948,31 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
                 }
             }
             return -TARGET_EINVAL;
+        case TARGET_PR_SET_TAGGED_ADDR_CTRL:
+            {
+                abi_ulong valid_mask = TARGET_PR_TAGGED_ADDR_ENABLE;
+                CPUARMState *env = cpu_env;
+
+                if ((arg2 & ~valid_mask) || arg3 || arg4 || arg5) {
+                    return -TARGET_EINVAL;
+                }
+                env->untagged_addr_mask = (arg2 & TARGET_PR_TAGGED_ADDR_ENABLE
+                                           ? MAKE_64BIT_MASK(0, 56) : -1);
+                return 0;
+            }
+        case TARGET_PR_GET_TAGGED_ADDR_CTRL:
+            {
+                abi_long ret = 0;
+                CPUARMState *env = cpu_env;
+
+                if (arg2 || arg3 || arg4 || arg5) {
+                    return -TARGET_EINVAL;
+                }
+                if (env->untagged_addr_mask != -1) {
+                    ret |= TARGET_PR_TAGGED_ADDR_ENABLE;
+                }
+                return ret;
+            }
 #endif /* AARCH64 */
         case PR_GET_SECCOMP:
         case PR_SET_SECCOMP:
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
index 8387e94b94..abc0affd00 100644
--- a/target/arm/cpu.c
+++ b/target/arm/cpu.c
@@ -208,6 +208,9 @@ static void arm_cpu_reset(DeviceState *dev)
          * Do not modify this without other changes.
          */
         env->cp15.tcr_el[1].raw_tcr = (3ULL << 37);
+# ifdef TARGET_TAGGED_ADDRESSES
+        env->untagged_addr_mask = -1;
+# endif
 #else
         /* Reset into the highest available EL */
         if (arm_feature(env, ARM_FEATURE_EL3)) {
-- 
2.25.1



  parent reply	other threads:[~2021-01-15 23:03 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 ` Richard Henderson [this message]
2021-01-22 11:36   ` [PATCH v3 12/21] linux-user/aarch64: Implement PR_TAGGED_ADDR_ENABLE 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
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=20210115224645.1196742-13-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.